LangChain 部署與應用整合 – Serverless / Cloud Run 部署策略
簡介
在 LLM(大型語言模型)逐漸成為企業與開發者核心服務的今天,LangChain 讓開發者能夠快速串接、編排與管理各種語言模型與外部工具。然而,模型推論與 Chain 執行往往需要相對穩定且具彈性的運算環境。傳統的 VM 或容器部署雖然可控,但在成本、彈性與維護上會產生不小負擔。
Serverless 與 Google Cloud Run 正是為了解決這類需求而設計的服務:它們提供即時擴縮、按使用量付費、零管理的運算平台。本文將從概念說明、實作範例、常見陷阱與最佳實踐,帶領讀者一步步把 LangChain 應用部署到 Cloud Run,讓你的 AI 服務在雲端即時可用、成本友好。
核心概念
1. 為什麼選擇 Serverless / Cloud Run
- 彈性伸縮:請求量突增時,容器會自動水平擴展;閒置時自動縮減至 0,節省資源。
- 簡化運維:不需要自行管理底層 VM、更新作業系統或安裝安全補丁。
- 按量付費:僅為實際 CPU、記憶體與請求時間付費,對於開發階段或不確定流量的專案相當划算。
2. Cloud Run 的運作模型
Cloud Run 以 Docker 容器 為執行單位,支援任意語言與執行環境,只要容器能在 1 GiB 記憶體以下、30 秒內回應健康檢查,即可部署。部署流程大致為:
- 撰寫 LangChain 應用程式。
- 建立 Dockerfile,將程式與相依套件打包。
- 使用
gcloudCLI 或 Cloud Console 部署至 Cloud Run。
3. 需要注意的資源限制
| 項目 | 限制值(預設) |
|---|---|
| 記憶體 | 256 MiB – 2 GiB |
| CPU | 1 vCPU(可設定 0.5 vCPU) |
| 請求逾時 | 最長 60 分鐘(可在 Cloud Run (fully managed) 設定) |
| 同時執行容器數 | 依流量自動調整,最高 1000 (視配額而定) |
Tip:若使用 OpenAI、Claude 等外部 LLM,請確保容器內部的網路出口已允許對應的 API 域名,並妥善設定 API 金鑰的環境變數。
程式碼範例
以下示範三個常見的部署步驟與技巧,從最簡單的 FastAPI 包裝到進階的多執行緒與自訂健康檢查。
1️⃣ 建立最小化的 LangChain + FastAPI 應用
# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
app = FastAPI()
# 讀取環境變數中的 OpenAI 金鑰
import os
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
# 建立 Prompt 與 Chain
prompt = PromptTemplate(
input_variables=["question"],
template="請用繁體中文回答以下問題:{question}"
)
llm = OpenAI(model="gpt-3.5-turbo")
chain = LLMChain(llm=llm, prompt=prompt)
class Query(BaseModel):
question: str
@app.post("/ask")
async def ask(query: Query):
try:
answer = chain.run(question=query.question)
return {"answer": answer}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
說明:此範例使用 FastAPI 作為 HTTP 入口,將 LangChain 的
LLMChain包裝成/askAPI。部署到 Cloud Run 時,只要容器能在 30 秒內回傳200 OK,就符合健康檢查。
2️⃣ Dockerfile – 最佳化層級與快取
# Dockerfile
FROM python:3.11-slim
# 1. 設定工作目錄
WORKDIR /app
# 2. 安裝系統相依(如 libgomp)
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential && \
rm -rf /var/lib/apt/lists/*
# 3. 複製 requirements,先安裝相依以利用快取
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. 複製程式碼
COPY . .
# 5. 設定環境變數(可在 Cloud Run UI 覆寫)
ENV PORT=8080
ENV PYTHONUNBUFFERED=1
# 6. 使用 uvicorn 啟動 FastAPI
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
技巧:將
requirements.txt與程式碼分層,讓 Docker 在相依未變更時能快速利用快取,減少 CI/CD 的建置時間。
3️⃣ 多執行緒與併發(提升吞吐量)
# main.py(續)
import concurrent.futures
executor = concurrent.futures.ThreadPoolExecutor(max_workers=4)
@app.post("/ask_async")
async def ask_async(query: Query):
loop = asyncio.get_event_loop()
# 將 LLM 呼叫委派給執行緒池
answer = await loop.run_in_executor(executor, chain.run, query.question)
return {"answer": answer}
說明:LLM 呼叫往往是 I/O 密集(等待遠端 API 回應),透過
ThreadPoolExecutor能同時處理多筆請求,提升 Cloud Run 單個容器的併發度。
4️⃣ 自訂健康檢查端點
# main.py(續)
@app.get("/healthz")
async def healthz():
# 檢查環境變數與 LLM 連線是否可用
if not os.getenv("OPENAI_API_KEY"):
return {"status": "fail", "reason": "Missing API key"}
try:
# 簡單呼叫模型做測試(使用最小的 token)
llm.predict("ping")
except Exception as e:
return {"status": "fail", "reason": str(e)}
return {"status": "ok"}
重點:Cloud Run 會依照
http://<service>/(或設定的路徑)發送健康檢查,若回傳非 2xx,容器會被重新啟動。自訂檢查可提前捕捉金鑰失效、網路斷線等問題。
5️⃣ CI/CD 部署腳本(使用 Cloud Build)
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/langchain-api', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/langchain-api']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'gcloud'
args:
- 'run'
- 'deploy'
- 'langchain-api'
- '--image'
- 'gcr.io/$PROJECT_ID/langchain-api'
- '--region'
- 'asia-east1'
- '--platform'
- 'managed'
- '--allow-unauthenticated'
images:
- 'gcr.io/$PROJECT_ID/langchain-api'
說明:將上述檔案放入專案根目錄,於 Cloud Build 觸發時會自動完成建置、推送至 Artifact Registry,最後部署至 Cloud Run。
常見陷阱與最佳實踐
| 陷阱 | 說明 | 最佳做法 |
|---|---|---|
| 金鑰外洩 | 直接把 API 金鑰寫在程式碼或 Dockerfile 中。 | 使用 Secret Manager,在 Cloud Run 設定環境變數時引用 Secret。 |
| 容器啟動慢 | 依賴大型模型或資料檔案在容器啟動時才下載。 | 事先把必要檔案(如 embeddings、模型快取)寫入映像檔或掛載 Cloud Storage。 |
| 請求逾時 | LLM 回覆時間超過 Cloud Run 預設 30 秒。 | 在服務設定中將 timeout 調高至 10–15 分鐘(視需求),或在應用層實作 重試/輪詢。 |
| 記憶體不足 | 大型向量資料或多執行緒佔用過多記憶體,導致 OOM。 | 先行測試記憶體需求,適度調整 --memory,或改用 Cloud Run for Anthos 提供更大資源。 |
| 冷啟動延遲 | 零容器時第一次請求需重新啟動容器。 | 使用 min-instances(例如 1)保持最小實例數,平衡成本與延遲。 |
小技巧:在
Dockerfile中加入HEALTHCHECK指令,讓 Cloud Run 能直接使用容器層的健康檢查,減少外部 API 呼叫次數。
HEALTHCHECK --interval=30s --timeout=5s \
CMD curl -f http://localhost:8080/healthz || exit 1
實際應用場景
- 客服聊天機器人:將 LangChain 以 Cloud Run 部署,前端使用 WebSocket 或 REST 呼叫
/ask,自動彈性伸縮應對高峰期(如促銷活動)。 - 文件問答平台:結合
VectorStore(如 Pinecone)與 LangChain,於 Cloud Run 處理向量檢索與 LLM 生成,僅在使用者查詢時付費。 - 自動化工作流程:利用 LangChain 的
Tool機制串接 Google Sheets、Gmail 等 API,將整個流程包成 Cloud Run 微服務,供內部系統透過 HTTP 觸發。 - 多租戶 SaaS:每個租戶的 API 金鑰與配置存於 Cloud SQL,LangChain Service 讀取後在同一個 Cloud Run 實例內分流,降低運維成本。
總結
Serverless 與 Google Cloud Run 為 LangChain 提供了一條 低成本、高彈性 的部署道路。透過 FastAPI 包裝、Docker 最佳化、健康檢查 與 CI/CD 自動化,我們可以在幾分鐘內把完整的 LLM 應用上線,同時保持安全與可觀測性。
在實務上,記得:
- 保護金鑰(Secret Manager)
- 提前測試資源需求(記憶體、CPU、逾時)
- 設定適當的健康檢查與最小實例,降低冷啟動與 OOM 風險
掌握以上策略後,你就能把 LangChain 的強大功能,快速、可靠地交付給使用者,為 AI 應用開啟無縫的雲端部署新篇章。祝開發順利!