LangGraph 本质是一个有状态的 Python 应用,部署的核心矛盾是:HTTP 是无状态的,但图是有状态的。所以部署方案怎么选,取决于你愿不愿意自己管"状态"。
路径 1:LangServe + FastAPI(轻量,适合小团队)
LangGraph 编译后就是一个 Runnable,可以直接用 LangServe 暴露成 API。
ini
from fastapi import FastAPI
from langserve import add_routes
app = FastAPI()
graph_app = graph.compile(checkpointer=RedisSaver(...))
add_routes(app, graph_app, path="/agent")
自动得到:
POST /agent/invoke--- 单次调用POST /agent/stream--- 流式输出(SSE)GET /agent/playground--- 交互式调试页面
适合:QPS < 50,单实例够用,团队不想运维太多组件。
路径 2:LangGraph Platform(官方全家桶)
LangChain 官方在 2025 年底把 LangGraph Cloud 升级为 LangGraph Platform,2026 年 5 月正式 GA。 提供四种部署模式:
| 模式 | 说明 | 适用 |
|---|---|---|
| Cloud SaaS | 全托管,LangSmith 内一键部署 | 快速上线 |
| BYOC | 控制平面在云端,数据面在你自己的 VPC | 数据敏感但想省运维 |
| Self-Hosted Enterprise | 全部自托管,最大控制权 | 金融/医疗等合规场景 |
| Self-Hosted Lite | 免费,每月 100 万节点执行上限 | 个人/小项目 |
自带能力:任务队列、长运行 Agent、Cron 调度、Webhook、Studio 可视化调试。
路径 3:FastAPI 手写 + Docker/K8s(最灵活)
如果不想被官方方案绑定,可以走标准 Web 服务路线:
用户 → Nginx/Ingress → 多个 LangGraph Pod → 共享 Redis/PostgreSQL
关键点:
- Checkpointer 必须用分布式(RedisSaver / PostgresSaver),MemorySaver 和 SqliteSaver 在多实例下会丢状态。
- 每个请求带上
thread_id做会话隔离。 - 建议把 LangGraph 独立成一个微服务,FastAPI 做业务网关,避免长会话阻塞主进程。
二、水平扩展:状态是唯一的拦路虎
LangGraph 水平扩展的公式很简单:
无状态计算节点 × N + 共享状态存储 = 水平扩展
2.1 架构拓扑
markdown
┌─────────────┐
请求 → Nginx → │ Pod 1 │
│ Pod 2 │ → Redis Cluster / PostgreSQL
│ Pod 3 │
└─────────────┘
- 计算层:Pod 无状态,可以随便启停、自动扩缩容
- 状态层 :Redis 或 PostgreSQL 存 Checkpoint,按
thread_id分片 - LLM 层:外部服务,不在扩展范围内
2.2 Redis vs PostgreSQL
| 维度 | Redis | PostgreSQL |
|---|---|---|
| 写入速度 | 快,每节点完成都写一次 | 稍慢 |
| 查询能力 | 弱,适合按 thread_id 读取 | 强,支持复杂查询 |
| 高可用 | Redis Cluster / Sentinel | 主从 + 流复制 |
| 适用场景 | 高并发、低延迟 | 需要审计/回放 |
实测数据:8 分片 Redis Cluster 在 100K req/hr 负载下,p95 端到端延迟可控制在 300ms 以内。 瓶颈通常不在计算节点,而在 Checkpoint 写入吞吐量------每个节点完成都会触发一次 Redis 写。
2.3 扩展时的几个坑
- 乐观锁冲突:多实例同时写同一 thread 的 checkpoint 时,LangGraph 内部用乐观锁处理,高并发下会有重试开销。
- 递归限制 :一定要设
recursion_limit(比如 50),防止死循环拖垮集群。 - 健康检查:Pod 启动时先检查 Redis 和 LLM 是否可达,不可达就直接 fail,别让"半残"的 Pod 接流量。
- 冷启动:Serverless 场景(AWS Lambda / 函数计算)要注意依赖包体积和 LLM 连接池预热。
三、LangSmith 追踪:看清每一条执行链路
LangSmith 是 LangChain 生态的可观测性平台,接入成本极低------三个环境变量搞定。
ini
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=lsv2_xxx
export LANGSMITH_PROJECT=my-agent-prod
之后所有 invoke() / stream() 调用自动上报,无需改业务代码。
3.1 能看到什么
- 完整执行树:每个节点的输入输出、耗时、状态快照
- Token 热力图:快速定位哪个节点/模型最烧钱
- 错误堆栈:工具调用失败、LLM 超时一目了然
- Thread 回放 :用
thread_id重现任意一次对话,逐节点检查 state 何时偏离预期
3.2 本地调试:LangGraph Studio
arduino
pip install "langgraph-cli[inmem]"
langgraph dev
启动后访问 http://localhost:2024,得到:
- 图结构可视化
- 单步执行 + 断点
- 状态编辑 + checkpoint 回放
- 条件边路由决策实时查看
开发阶段强烈推荐,比 print 调试效率高一个数量级。
3.3 评估与 A/B 测试
LangSmith 不只是"看日志",还能做量化评估:
- 准备测试数据集(输入 + 期望输出)
- 配置评估器(LLM-as-Judge / 确定性代码评估)
- 运行
client.evaluate()生成报告 - 对比不同 Prompt / 模型版本的指标
支持 RAG 双维评估(检索质量 + 生成质量)和 Agent 轨迹评估(工具调用路径、单步决策质量)。
3.4 国内替代方案
LangSmith 服务器在海外,国内网络访问不稳定,私有部署成本也较高。可以考虑 Langfuse------开源自托管,功能与 LangSmith 高度对齐,代码几乎不用改。
四、生产部署速查表
| 场景 | 推荐方案 | Checkpointer | 监控 |
|---|---|---|---|
| 个人 Demo | 本地脚本 / LangGraph Studio | MemorySaver | 无 |
| 小团队 MVP | LangServe + FastAPI | SqliteSaver / Redis | LangSmith |
| 中等流量生产 | Docker + Nginx + 多实例 | RedisSaver / PostgresSaver | LangSmith + Prometheus |
| 企业级大规模 | K8s + LangGraph Platform | Redis Cluster / PostgreSQL | LangSmith + OTEL + Grafana |
| 数据合规 | 自托管 LangGraph Platform | 内网 PostgreSQL | Langfuse / 自托管 LangSmith |
总结
部署和监控这件事,说穿了就三句话:
- 单实例用 LangServe,多实例换分布式 Checkpointer
- 水平扩展的瓶颈不在计算,在状态写入
- LangSmith 三个环境变量就能开,不开等于裸奔