学习笔记 · Obsidian

生产化、测试、部署、迁移与案例

LangChainLangGraphPython

生产应用的最小结构

一个可由 Agent Server 加载的 LangGraph 应用通常包含:

  • 一个或多个已编译 graph,或返回 graph 的工厂函数;
  • langgraph.json;
  • requirements.txt、pyproject.toml 等依赖清单;
  • 可选 .env,仅用于本地开发;
  • 业务包、测试和必要系统依赖。

langgraph.json 至少描述:

  • dependencies:本地包与第三方依赖;
  • graphs:唯一 graph name 到 Python 对象路径的映射;
  • env:本地环境变量文件;
  • 可选 dockerfile_lines 等系统依赖配置。

生产环境变量应由部署平台注入,不依赖仓库里的 .env。API key、数据库口令与加密密钥不得提交版本库。

Graph export

graphs 中每个 name 必须唯一,目标可以是:

  1. 已 compile 的 graph;
  2. 构造并返回 graph 的函数。

create_agent 本身返回已编译 LangGraph graph,可以直接导出。复杂项目应让 graph 定义、工具、State schema、外部 adapter 与配置分层,避免一个文件同时承担全部职责。

本地 Agent Server

官方本地路径:

  1. 安装带 inmem 能力的 LangGraph CLI;
  2. 创建或准备 LangGraph 项目;
  3. 以 editable mode 安装本地依赖;
  4. 从 .env.example 创建本地 .env;
  5. 运行 langgraph dev;
  6. 在 Studio 或 SDK 中测试。

默认本地 server 地址为 127.0.0.1:2024。langgraph dev 使用内存模式,只适合开发与测试;重启会丢失内存状态,不能由此推断生产持久化已验证。

Safari 连接本地 Studio 有 localhost 限制时可使用 tunnel,但 tunnel 会扩大暴露面,应只在受控开发环境启用并检查 allowed origins。

本地 API 验证

至少覆盖:

  • threadless run:确认 graph 能加载与执行;
  • 带 thread_id 的 run:确认多轮 State;
  • streaming:确认 token、状态和 interrupt;
  • 错误路径:确认 retry、handler 与 trace;
  • restart:确认使用真实持久化后能恢复。

仅在 in-memory dev server 成功,不等于数据库 migration、并发或重启恢复通过。

Studio

LangSmith Studio 是连接本地 Agent Server 的可视化开发界面,可查看:

  • graph 步骤和中间 State;
  • 发给模型的 prompt;
  • tool call 参数与结果;
  • 异常上下文;
  • token、延迟和 trace;
  • thread、assistant 与历史步骤;
  • 从历史步骤重新运行。

开发 server 支持 hot reload。Studio 适合快速诊断,但仍要把关键断言固化为自动化测试。

如果不希望本地数据发送为 LangSmith trace,显式设置 LANGSMITH_TRACING=false。Studio 连接本地 server 与 trace 上传是不同概念,不应混淆。

Agent Chat UI

Agent Chat UI 是开源 Next.js 客户端,可连接本地或已部署 Agent Server,支持:

  • 实时聊天;
  • tool call 与结果展示;
  • interrupt thread 检测;
  • time travel 与 State fork;
  • 可选 generative UI。

连接时需要:

  • graph ID,即 langgraph.json 中的 graph name;
  • deployment URL 或本地 server URL;
  • 远端服务需要的认证信息。

官方 hosted UI 适合快速验证;生产产品通常需要自建前端、服务端认证与租户隔离,不能把 LangSmith API key 暴露在公共浏览器。

部署模型

LangSmith Deployment 提供:

  • Cloud;
  • hybrid;
  • standalone server;
  • self-hosted control plane。

Cloud quickstart 以 GitHub repository 为输入,部署后可在 Studio 测试并取得 API URL。选择部署方式时要单独评估:

  • 数据驻留与合规;
  • 持久化后端;
  • Redis / Postgres 容量;
  • 网络出口;
  • 并发、队列与长任务;
  • secrets 与认证;
  • 日志、trace、metrics;
  • 灰度、回滚与数据库 migration。

生产化不是把本地 graph 上传即可。至少要验证 background execution、HITL 长暂停、进程重启、扩缩容与历史 checkpoint 兼容。

RemoteGraph

RemoteGraph 是客户端侧接口,把已部署 graph 以近似 CompiledGraph 的方式使用,支持 invoke、stream、get_state、update_state 及异步版本。

适用场景

  • 本地开发使用 CompiledGraph,生产改用远端部署而保持近似 API;
  • 通过 thread_id 获取远端持久 State;
  • 把不同部署的 graph 组合为跨服务 subgraph;
  • 把复杂远端流程复用为 node 或 tool。

初始化必须提供 graph name 或 assistant ID,并提供:

  • deployment URL;或
  • async LangGraphClient;或
  • SyncLangGraphClient。

如果 client 与 URL 同时传入,client 优先。

thread persistence

RemoteGraph 默认调用可以是无状态的。需要多轮、HITL 或远端 State 时:

  1. 通过 SDK 创建或取得 thread;
  2. 在 config 中传 thread_id;
  3. 用 RemoteGraph 调用;
  4. 用 get_state 验证持久状态。

RemoteGraph 作为 subgraph 且父图有 checkpointer 时,thread ID 使用 UUID。

关键风险

不要让 RemoteGraph 调用同一 deployment RemoteGraph 面向其他 deployment。让一个部署通过 RemoteGraph 调用自己,或同部署内另一个 graph,可能造成死锁和资源耗尽。同一 deployment 内应使用本地图组合或 subgraph。

跨部署调用还要考虑:

  • 网络 timeout 与 retry;
  • 调用链幂等;
  • 认证 header 与租户传播;
  • distributed tracing;
  • 下游部署容量与级联故障;
  • 每个远端 run 的独立计费和配额。

测试策略

每个测试重新构图

大量 LangGraph 测试依赖 State。推荐每个测试:

  1. 创建 fresh builder;
  2. 使用 fresh InMemorySaver;
  3. compile;
  4. 使用唯一 thread_id。

避免测试间共享 checkpoint 产生顺序依赖。

单节点与边测试

compiled graph 通过 graph.nodes 暴露节点引用,可以单独 invoke 节点并断言更新。此方式绕过 compile 时传入的 checkpointer,因此:

  • 适合纯节点逻辑;
  • 不能替代 persistence、interrupt、retry 的集成测试;
  • conditional routing function 应单独以不同 State 覆盖所有分支。

Partial execution

大图可通过 checkpoint 构造中间状态:

  1. 使用 InMemorySaver compile;
  2. update_state 并以 as_node 指定起点之前的节点;
  3. 同一 thread_id invoke;
  4. 用 interrupt_after 在目标节点停止;
  5. 断言部分路径 State。

如果一段流程具有稳定边界并需要大量独立测试,把它重构为 subgraph 往往更清晰。

必测场景

  • 正常顺序与所有条件分支;
  • parallel fan-out / fan-in 与 reducer;
  • 一条并行分支失败后只重跑失败分支;
  • retryable 与 non-retryable 异常;
  • run timeout、idle timeout 与 heartbeat;
  • error handler 补偿;
  • interrupt、拒绝、编辑、无效输入重问;
  • 同一 thread 恢复与错误 thread 拒绝;
  • replay、fork 与副作用幂等;
  • subgraph 三种 persistence 模式;
  • per-thread subgraph 并行冲突保护;
  • process restart 后 checkpoint 恢复;
  • 旧 checkpoint 在新 graph 版本上恢复;
  • streaming v2 和 event streaming v3 的前端契约;
  • trace 中敏感数据脱敏。

单元测试通过不等于生产恢复。数据库 checkpointer、Store、真实模型、网络断开和并发需要独立集成或演练。

Observability

LangSmith 把一次调用建模为 trace,内部步骤是 runs。可用于:

  • 本地 debug;
  • 评估输出;
  • 线上 dashboard 与监控;
  • 查看节点、工具和模型调用链。

tracing 控制

  • 全局环境变量开启;
  • tracing_context 对局部调用开启或关闭;
  • project name 区分环境与服务;
  • tags、metadata 记录 tenant 的非敏感标识、版本和实验组。

不要把 token、完整用户隐私或认证材料放入 metadata。

anonymizer

可以用 anonymizer 在 trace 上传前屏蔽敏感格式。它是纵深防御,不替代:

  • 源头数据最小化;
  • 输入输出字段 allowlist;
  • 日志级别控制;
  • stream 脱敏;
  • checkpoint 加密;
  • 访问控制与 retention。

生产告警至少关注:

  • 节点错误率与 retry 次数;
  • timeout 与 GraphDrained;
  • interrupt 长时间未恢复;
  • thread / checkpoint 增长;
  • Store 查询延迟;
  • token 与模型费用;
  • graph recursion limit;
  • 远端 deployment 级联失败。

向后兼容:最新代码会作用于旧 thread

LangGraph 不把一个 run 永久钉死在其启动时的代码版本。旧 thread 恢复时执行当前部署的最新 graph。因此每次发布都相当于修改“graph 代码 ↔ 已持久 State”的 API。

兼容问题分三类:

  1. 技术兼容:旧 checkpoint 能否加载,旧节点名能否找到;
  2. 业务兼容:旧 thread 是否应继续旧业务路径;
  3. 确定性兼容:Functional API replay 是否仍能匹配 task 与 interrupt。

技术兼容矩阵

变更已完成 threadinterrupted / in-flight thread
新增或改 edge通常安全节点仍存在时安全
新增 node安全通常安全
删除或重命名 node完成后无恢复路径,通常可接受高风险,可能正准备进入旧节点
新增可选 State key安全安全
删除 State key通常可加载,但旧逻辑可能读取先 deprecate
重命名 State key旧值丢失高风险
收紧类型或新增必填字段可能无法加载旧 State高风险

推荐:

  • 新字段先 NotRequired 或 Optional;
  • 删除按 deprecation window 处理;
  • rename 采用 add → dual write / dual route → drain → remove;
  • 节点容忍未知旧字段;
  • staging 用旧 checkpoint 做 replay / resume;
  • thread 搜索和 trace 都显示无旧节点活动后再删除。

发现 in-flight thread

  • Agent Server 搜索 busy、interrupted、error 等状态;
  • tracing 监控旧节点是否仍被进入;
  • 已知 thread_id 时用 get_state 与 get_state_history;
  • 无法证明 drain 完成时,保留兼容节点和字段。

业务版本

即使技术上能加载,新流程也不一定应追溯作用于旧 thread。推荐在 thread 起点把 flow_version 写入 State:

  • 老 thread 没字段时默认旧版本;
  • 新 thread 在起点写入新版本;
  • conditional edge 按版本分流;
  • 全部旧 thread drain 后移除兼容分支。

版本必须在第一次需要分支之前写入;中途才写无法区分已有 thread。

Functional replay 兼容

entrypoint 恢复会从函数开头 replay,并按位置复用 task 结果与 interrupt 输入。in-flight run 前不能随意:

  • 新增、删除或重排 task;
  • 新增、删除或重排 interrupt;
  • 把 random、time、网络调用直接放在 entrypoint;
  • 用不稳定条件改变 task 调用顺序。

大改时选择:

  • 先让 in-flight run drain;
  • 新逻辑放进新 task;
  • 在 langgraph.json 注册新 graph name,只让新 thread 使用。

LangGraph v1 迁移

LangGraph v1 整体保持较高向后兼容,主要变化:

  • Python 最低版本为 3.10,放弃 Python 3.9;
  • langgraph.prebuilt.create_react_agent deprecated;
  • 推荐 langchain.agents.create_agent;
  • AgentState 等旧预置类型迁到 langchain.agents;
  • MessageGraph 迁为带 messages key 的 StateGraph;
  • 旧 HumanInterrupt 类型迁到 LangChain HITL middleware;
  • ValidationNode 由 create_agent 的工具输入校验替代。

如果只是标准 ReAct agent,迁到 create_agent;仍需混合确定性步骤、自定义 State 或特殊路由时,保留自定义 StateGraph。

从 langgraph-supervisor 迁移

langgraph-supervisor 已不再积极维护。推荐用 create_agent + tool-wrapped subagents:

旧做法推荐替代
create_supervisor + worker graph nodes主 create_agent 把每个 subagent 包装成 tool
output_mode在 tool wrapper 中格式化返回
create_handoff_tool自定义 tool 调用 subagent.invoke
supervisor 嵌套 supervisor扁平 leaf tools,或把中层 agent 再包装成 tool

interrupt 可从内层 subagent tool 一直冒泡到顶层 graph,前提:

  1. 只给最外层 graph 配 checkpointer;
  2. subagent 保持默认 per-invocation,继承父 checkpointer;
  3. 顶层调用传 thread_id。

需要固定路由、验证、共享 State、静态 subgraph 发现或每层独立 checkpoint namespace 时,使用自定义 StateGraph,而不是强行全部 tool 化。

多层 supervisor 可:

  • 扁平为一个 supervisor + 多个 leaf agent tools;
  • 或按需嵌套 tool-wrapped agent。

旧 output_mode 的 full_history / last_message 行为应在 wrapper 中明确转换,避免把全部子 agent 历史无界塞回父消息。

版本演进摘要

官方 LangGraph changelog 入口当前重定向到共享 Python releases changelog。与本专题直接相关的里程碑:

v1.0.0 — 2025-10-20

  • LangGraph v1;
  • create_react_agent 迁向 create_agent;
  • Python 3.10+;
  • 旧 0.x 文档转为 archive。

v1.1.0 — 2026-03-10

  • stream / astream version=v2,统一 StreamPart;
  • invoke / ainvoke version=v2,GraphOutput.value 与 interrupts;
  • Pydantic、dataclass values 自动 coercion;
  • 修复 time travel 与 interrupt / subgraph 恢复;
  • v2 为 opt-in,旧字典访问仅过渡兼容。

v1.2.0 — 2026-05-12

  • DeltaChannel beta;
  • async per-node timeout;
  • node-level error handler;
  • RunControl graceful shutdown;
  • event streaming version=v3 beta,类型化 channel projections;
  • timeout 与 error handler 当前为 Python 特性。

升级前不能只看包版本号,应同时检查:

  • graph State 与 checkpoint 兼容;
  • stream / invoke 返回结构;
  • 自定义 checkpointer 是否支持 DeltaChannel;
  • 前端 SDK 是否对应新协议;
  • in-flight thread 是否 drain;
  • rollback 是否能读取新 checkpoint 格式。

实战案例一:Agentic RAG

官方自定义 RAG 图的控制流:

  1. 预处理文档、切分、embedding、写入 vector store;
  2. 用 retriever tool 封装语义检索;
  3. generate_query_or_respond 由模型决定直接回答还是检索;
  4. ToolNode 执行 retriever;
  5. grade_documents 用结构化输出判断相关性;
  6. 不相关时 rewrite_question,再回到决策节点;
  7. 相关时 generate_answer,只基于检索上下文作答。

它区别于固定 RAG 的核心是:检索由模型按需触发,并有“相关性判断 → 查询改写 → 再检索”的反馈环。

生产增强项:

  • rewrite 循环上限;
  • 文档权限过滤先于向量检索;
  • source ID 与引用保留;
  • grader 失败时安全降级;
  • embedding / index 版本;
  • prompt injection 防护;
  • retrieval、grade、answer 分段评估。

实战案例二:SQL Agent

官方自定义 SQL agent 用专用节点强制执行:

  1. 列出数据库表;
  2. 获取 schema;
  3. 生成查询;
  4. 检查查询;
  5. 执行查询;
  6. 返回答案。

相比只在 system prompt 中要求“先看表、先检查 SQL”,显式节点与边能真正约束顺序。

安全底线

  • 数据库账号最小权限,优先只读;
  • 限定 schema、table 与 row 范围;
  • 禁止任意 DDL / DML;
  • 查询 parser 或 allowlist;
  • statement timeout、row limit、成本上限;
  • 参数化可参数化部分;
  • 高风险 SQL 在执行前 interrupt;
  • 审批人可以批准、编辑或拒绝;
  • trace 和返回结果脱敏;
  • tutorial 的薄工具 wrapper 不能直接用于生产。

加入 HITL 后必须 compile checkpointer;interrupt 可无限期暂停,恢复时仍要使用原 thread_id。

Case studies 说明

官方案例索引覆盖:

  • 金融与支付;
  • 医疗与生命科学;
  • 软件研发和代码生成;
  • 电商与客服;
  • 物流、政府、媒体、旅行;
  • 企业搜索、研究与数据提取。

案例包括 Klarna、Uber、J.P. Morgan、LinkedIn、GitLab、Replit、Vodafone、Elastic 等。这个索引证明 LangGraph 被用于多种生产场景,但不能直接证明某个具体架构、吞吐或可靠性指标适合当前项目;选型仍需以自己的 SLO、数据边界和演练结果为准。

上线 Gate

构建

  • graph name、State schema 与 reducer 有文档;
  • deterministic 与 agentic 边界明确;
  • 所有外部副作用幂等;
  • loop、fan-out 和 RemoteGraph 有预算;
  • secrets 不进 State、日志或仓库。

测试

  • 节点、edge、partial path、完整 E2E;
  • persistence 数据库 migration;
  • crash / restart / retry / timeout / drain;
  • interrupt 多轮恢复;
  • 旧 checkpoint 升级;
  • stream 与前端 contract;
  • 负载和并发。

发布

  • in-flight thread 审计;
  • flow_version 或兼容窗口;
  • checkpoint / Store backup 与 retention;
  • 新版本写入格式的回滚策略;
  • 逐步放量;
  • 监控与告警就绪。

运维

  • Studio 与 trace 可定位每个节点;
  • PII anonymizer 与访问控制;
  • checkpoint 体积、历史数量、恢复失败指标;
  • RemoteGraph 分布式 trace 与级联隔离;
  • 定期故障演练和数据删除演练。

关联笔记

来源

LangGraph 主目录 12 页

补充生产与迁移页