LangGraph 工作流:把关键流程跑顺
聊《LangGraph 工作流:把关键流程跑顺》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。
摘要
本文基于近期内部业务 Agent 项目的重构经验,复盘从“ Prompt 链式调用”转向“图工作流”的工程实践。重点讨论状态契约设计、条件路由的防环策略、异步人工审批的取舍,以及面向生产环境的可观测性与测试方案。不堆砌概念,只讲真实踩坑点与选型判断标准。
目录
- 为什么需要图工作流
- State 与 Node
- Edge 与条件分支
- 人工审批节点
- 工程化落地
- 总结
为什么需要图工作流
上个季度我们接了一个标书辅助解析的需求。最初版本是典型的 LangChain Chain 写法:提取正文 → 调用大模型分类 → 校验字段 → 生成结构化 JSON。开发阶段跑通很快,但压测一上来就露怯:PDF 表格错位导致 LLM 输出格式漂移,下游节点直接抛异常;重试逻辑散落在三个文件里;更致命的是,模型偶尔会陷入自我修正的死循环,上下文窗口瞬间打满,服务直接 OOM。
这时候意识到,纯脚本式的提示词串联根本扛不住生产环境的噪声。Agent 不是线性管道,而是带记忆、会回溯、可能绕路的有向图。引入 LangGraph 不是为了炫技,而是强制团队做架构取舍:前期多花两天设计拓扑和状态流,后期能省掉大量散落的 try-except 和硬编码路由。图工作流的核心价值在于把“不可控的概率事件”关进“确定的控制流”里。
State 与 Node
很多开发者刚上手会把 State 当成万能字典,什么字段都往里塞。实际项目中,状态膨胀是最常见的隐性负债。我们曾定义过包含 40+ 字段的 Pydantic model,结果上游清洗模块稍微调整了返回结构,下游十个节点全部报类型错误。
我的建议是:State 只做“通信契约”,不做“数据仓库”。只携带下游真正需要的字段,其余信息留在临时变量或外部存储里。节点函数应该是纯函数风格,避免隐式副作用。
from typing import TypedDict, Optional, Annotated from langgraph.graph.message import add_messages class AgentState(TypedDict): raw_text: str parsed_sections: list[dict] confidence_score: float messages: Annotated[list, add_messages] error_log: Optional[str]Node 的实现要克制。不要在一个节点里既做解析又做校验又调外部 API。拆成 `extract_node`, `validate_node`, `format_node`。拆分后虽然代码行数多了,但单元测试好写,故障定位也能精确到具体边。
Edge 与条件分支
静态边适合确定性流程,动态边才是 Agent 的命门。我们用条件分支做两件事:一是根据置信度决定走“自动放行”还是“退回重析”;二是根据关键词匹配触发专项知识库检索。
踩过的最大坑是死循环。当 LLM 输出不稳定时,条件函数反复返回同一个节点,图就会无限迭代。解决思路有两个:
1. 设置 `max_iterations` 硬限制,超时强制切到降级路径。
2. 在 State 里维护一个 `retry_count`,超过阈值直接中断并上报人工。
另外,路由逻辑尽量解耦。不要把复杂的业务判断塞进条件函数里。我们后来改成了“规则兜底 + LLM 决策”的双层架构:正则和阈值先过滤掉明显异常,剩下的交给模型输出结构化路由指令。这样既保住了稳定性,又保留了灵活性。
人工审批节点
涉及资金、合同或对外发布的内容,必须留有人工审批环节。LangGraph 提供了 `interrupt()` 机制,但怎么用取决于你的后端架构。
阻塞式中断最简单:线程挂起直到用户点击确认。但在高并发场景下,这会让 WebSocket 连接堆积,直接拖垮网关。我们最终选了非阻塞模式:节点执行到关键点调用 `interrupt()`,将当前快照写入 Redis Hash,通过消息队列通知前端轮询或推送。审批通过后,前端带上 `interrupt_id` 和更新后的字段重新注入图执行。
这里有个容易被忽略的细节:中断前的状态快照必须包含完整的 `messages` 历史,否则恢复执行时模型会丢失上下文连贯性。另外,审批界面不要直接展示原始 JSON,要把关键字段展平为表单控件,降低操作员的认知负担。
工程化落地
图跑通了只是第一步,上线前得把工程底座补齐。
**测试策略**:不能依赖 LLM 做断言。对于确定性路径,用快照对比测试(Snapshot Testing)验证 State 流转是否一致;对于随机路径,构造边界输入(空文本、乱码、超长字段)观察图是否优雅降级。LangGraph 的 `test_state_graph` 工具链可以配合 pytest 快速覆盖主干。
**可观测性**:除了 LangSmith 的基础链路追踪,建议在每个 Node 埋点记录业务指标:解析成功率、平均耗时、人工干预率。这些指标比单纯的 Token 消耗更能反映系统健康度。
**简历与项目表达**:面试时别只说“接入了 LangGraph”。要讲清楚图拓扑的设计依据、状态字段的裁剪逻辑、防环策略的具体实现,以及上线后带来的量化收益(例如:端到端失败率从 18% 降到 4%,人工复核拦截准确率达 92%)。工程能力体现在对不确定性的收敛上,而不是用了多少新库。
总结
把 Agent 从脚本升级为可控系统,本质是从“祈祷模型不犯错”转向“设计系统容错”。图工作流提供了骨架,但血肉还得靠严谨的状态契约、清晰的条件分支和合理的人工介入机制来填充。起步阶段优先保证主干链路稳定,再逐步叠加复杂路由与异步审批。记住,好的 Agent 架构不是为了让它更聪明,而是为了让它在变笨的时候依然不崩盘。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。
如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。
