Skip to content

7.1 部署(Deployment)

本节介绍如何使用 LangSmith 平台部署 LangChain/LangGraph 应用。


部署概述

LangSmith 提供了专为 有状态、长时间运行的 Agent 设计的部署平台。与传统的无状态 Web 应用托管平台不同,LangSmith 平台专门处理 Agent 的特定基础设施需求:

  • 持久化状态管理:自动处理对话状态和检查点
  • 后台执行:支持长时间运行的任务
  • 一键部署:从 GitHub 仓库直接部署
  • 内置 API:提供自定义检查点、内存和对话线程的 API

LangSmith 部署平台


传统托管 vs LangSmith 平台

特性传统托管平台LangSmith 平台
状态管理无状态,需自行实现内置持久化状态
执行模式短期请求/响应支持长时间运行
检查点需自行实现自动检查点
对话管理需自行实现内置对话线程
监控需集成第三方工具与 LangSmith 深度集成

部署前准备

1. 账户准备

  • GitHub 账户:代码需要托管在 GitHub 仓库中(支持公开和私有仓库)
  • LangSmith 账户免费注册

2. 项目结构

确保你的 LangGraph 应用具有标准的项目结构:

my-agent/
├── agent.py          # Agent 定义
├── langgraph.json    # LangGraph 配置文件
├── requirements.txt  # Python 依赖
└── .env.example      # 环境变量示例

3. langgraph.json 配置

json
{
  "graphs": {
    "agent": "./agent.py:graph"
  },
  "env": ".env"
}

部署流程

部署流程

Step 1: 连接 GitHub

  1. 登录 LangSmith
  2. 导航到 Deployments 页面
  3. 点击 "+ New Deployment"
  4. 连接你的 GitHub 账户
  5. 选择包含 LangGraph 应用的仓库

Step 2: 配置部署

配置部署参数:

  • 部署名称:给部署一个易于识别的名称
  • 分支:选择要部署的 Git 分支
  • 环境变量:配置 API Keys 等敏感信息

Step 3: 启动部署

点击部署按钮后,平台将:

  1. 拉取代码
  2. 构建容器镜像
  3. 部署服务
  4. 配置网络

部署通常在 15 分钟内 完成。

Step 4: 验证部署

部署完成后,可以通过以下方式验证:

  1. Studio 界面:在 LangSmith Studio 中与部署的 Agent 交互
  2. API 测试:通过 API 端点测试功能

API 访问

获取访问凭证

部署完成后,从 Deployment 详情页获取:

  • Deployment URL:API 端点地址
  • API Key:访问密钥

使用 LangGraph SDK

python
from langgraph_sdk import get_sync_client

# 创建客户端
client = get_sync_client(
    url="your-deployment-url",
    api_key="your-langsmith-api-key"
)

# 流式调用 Agent
for chunk in client.runs.stream(
    None,  # thread_id, None 表示新建
    "agent",  # graph 名称
    input={"messages": [{"role": "human", "content": "Hello!"}]},
    stream_mode="updates",
):
    print(f"Event: {chunk.event}")
    print(chunk.data)

异步客户端

python
from langgraph_sdk import get_client
import asyncio

async def main():
    client = get_client(
        url="your-deployment-url",
        api_key="your-langsmith-api-key"
    )

    # 创建新的对话线程
    thread = await client.threads.create()

    # 发送消息并获取响应
    async for chunk in client.runs.stream(
        thread["thread_id"],
        "agent",
        input={"messages": [{"role": "human", "content": "What is AI?"}]},
        stream_mode="updates",
    ):
        print(chunk.data)

asyncio.run(main())

对话线程管理

LangSmith 平台内置对话线程管理功能:

创建线程

python
# 创建新线程
thread = await client.threads.create()
thread_id = thread["thread_id"]

继续对话

python
# 在同一线程中继续对话
async for chunk in client.runs.stream(
    thread_id,  # 使用已有的 thread_id
    "agent",
    input={"messages": [{"role": "human", "content": "Tell me more"}]},
    stream_mode="updates",
):
    print(chunk.data)

获取对话历史

python
# 获取线程状态
state = await client.threads.get_state(thread_id)
messages = state["values"]["messages"]

部署配置选项

部署配置

环境变量

bash
# 在 LangSmith 部署配置中设置
OPENAI_API_KEY=sk-xxx
ANTHROPIC_API_KEY=sk-ant-xxx
DATABASE_URL=postgresql://...

资源配置

根据需求选择合适的资源配置:

配置级别CPU内存适用场景
Small1 vCPU2 GB开发测试
Medium2 vCPU4 GB生产环境
Large4 vCPU8 GB高负载场景

自托管部署

如果不想使用 LangSmith 托管服务,也可以自行部署:

使用 LangServe

python
from fastapi import FastAPI
from langserve import add_routes
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# 创建应用
app = FastAPI()

# 定义 Chain
prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant."),
    ("human", "{input}")
])
model = ChatOpenAI(model="gpt-4o")
chain = prompt | model

# 添加路由
add_routes(app, chain, path="/chat")

# 运行: uvicorn main:app --host 0.0.0.0 --port 8000

Docker 部署

dockerfile
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
bash
# 构建镜像
docker build -t my-langchain-app .

# 运行容器
docker run -p 8000:8000 \
  -e OPENAI_API_KEY=sk-xxx \
  my-langchain-app

最佳实践

1. 安全性

python
# 使用环境变量管理敏感信息
import os

api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
    raise ValueError("OPENAI_API_KEY not set")

2. 错误处理

python
from langchain.agents import create_agent

agent = create_agent(
    "gpt-4o",
    tools=[my_tools],
    middleware=[error_handling_middleware]
)

# 错误处理中间件
@wrap_model_call
def error_handling(state, runtime, call_next):
    try:
        return call_next()
    except Exception as e:
        logging.error(f"Model call failed: {e}")
        raise

3. 健康检查

python
from fastapi import FastAPI

app = FastAPI()

@app.get("/health")
async def health_check():
    return {"status": "healthy"}

@app.get("/ready")
async def readiness_check():
    # 检查依赖服务
    return {"status": "ready"}

4. 日志记录

python
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

logger = logging.getLogger(__name__)

# 在 Agent 中使用
logger.info("Processing user request")

常见问题

Q: 部署失败怎么办?

  1. 检查 langgraph.json 配置是否正确
  2. 确认所有依赖都在 requirements.txt
  3. 查看部署日志获取详细错误信息

Q: 如何更新部署?

推送代码到 GitHub 仓库,平台会自动触发重新部署。

Q: 如何设置自定义域名?

在部署配置中添加自定义域名,并配置 DNS CNAME 记录指向提供的部署 URL。


上一节7.0 Deploy with LangSmith

下一节7.2 Observability

基于 MIT 许可证发布。内容版权归作者所有。