LangGraph核心概念实战:条件路由、循环、并行与子图解析
很多人第一次接触 LangGraph,是在翻 LangChain 官方文档或者刷 B 站教程的时候。标题里经常写着“零基础”“从入门到精通”,点进去才发现,要么是照着文档念 API,要么是贴了一堆代码但不解释为什么这么写。最后留下一个模糊印象:LangGraph 好像是 LangChain 生态里一个管 graph 的库,但到底什么时候该用它、它解决了 LangChain 解决不了什么问题、为什么节点和边就能把 agent 做得更稳,这些核心问题没人讲透。
这篇文章不做 API 手册式的罗列。我想换一种方式,从真实项目里最常遇到的“流程控制”问题出发,把 LangGraph 的五个关键概念拆开讲清楚:条件路由、循环、并行分支、子图、以及状态管理。每个概念都对应一类实际痛点。看完之后,你不会只记住几个函数名,而是能判断自己下一个 agent 项目到底要不要上 LangGraph,以及上了之后怎么设计结构。
1. 先搞清楚 LangGraph 到底解决的是哪一类问题
1.1 它不是又一个“调用大模型的封装库”
很多从 LangChain 或者纯 prompt 工程走过来的开发者,第一次看到 LangGraph 时容易犯一个认知错误:以为它只是 LangChain 的升级版,或者某个新出的 LLM API 封装。如果你也这样想,后面读官方文档会越读越模糊。
LangChain 的定位更偏向“组件组合”:把模型调用、提示词模板、输出解析、记忆、工具调用这些零件拼起来。LangChain 解决的是“单次对话里怎么组织一次模型调用”,它的核心单位是 Chain,本质是一条按顺序执行的流水线。你在 Chain 里塞 prompt,塞 model,塞 parser,链式调用,得到结果。这种模式对“请求-响应”式的 LLM 应用很友好,但一遇到需要分阶段决策、多轮条件分支、人工确认节点、循环重试、并行执行复杂子流程的场景,链式模型就会变得很笨重。
LangGraph 把问题换了一个角度:它不再把应用看作一条链,而是看作一个有向图。节点是执行单元,可以是 LLM 调用、工具调用、规则判断或者任意 Python 函数。边是连接关系,决定一个节点执行完之后下一个节点是谁。关键的是,边可以条件化,也就是根据当前状态决定走哪条分支。
这个差别非常本质。链式流程是“预排好的一场戏”,每一步早就固定了;图式流程是“实时决策的地图”,走哪条路取决于运行时状态。
如果你做过真实的 agent 应用,应该能理解这里面的痛点。一个稍微复杂的 agent 往往要经历:用户输入、意图判断、调用工具、观察结果、再判断、再调用、最终回答。每一步都可能要改变下一步走向。用 Chain 硬写,只能通过嵌套 if-else 和手动维护状态来模拟,代码很快就变成一团。
1.2 它是 LangChain 生态里专门管状态的编排层
LangGraph 不能替代 LangChain。它对 LangChain 组件是有依赖的,比如 prompt 模板、ChatModel 封装这些可以直接复用。准确地说,LangGraph 更像是在 LangChain 基础上新增了一个编排层,负责:
- 状态如何定义和流动;
- 节点如何执行;
- 节点之间如何跳转;
- 循环和递归如何被管理;
- 子图如何被嵌进父图;
- 并行分支如何拆分与合并;
- 每一步如何被持久化和人工介入。
换句话说,LangChain 负责“跟大模型对话”,LangGraph 负责“把整个对话流程设计成一个可运行、可控制、可观察的系统”。
我见过一个很形象的类比:如果 LLM 是一个员工,LangChain 是员工的工具箱,LangGraph 就是那张项目流程图加项目状态看板。你没有流程图也能干活,但任务一多、步骤一乱、需要多个人协同时,你必须把流程本身显性化。
这也是为什么很多人在 LangChain 里写复杂 agent 会越写越痛苦:你的整个业务流程是藏在代码里的,没有状态容器,没有图结构,每一步都得手动把数据传来传去。而 LangGraph 从设计上就强制你回答三个问题:
- 状态长什么样?
- 节点有哪些?
- 节点之间怎么跳转?
一旦你把这三个问题想清楚,复杂 agent 的骨架就出来了。
1.3 先看一个最小例子:状态、节点、边
在深入条件路由之前,我建议你先在本地跑一个最简 LangGraph 流程,把状态、节点、边这三个概念建立体感。下面是一个常见的最小示例结构:
这个例子里:
State是全局共享的状态结构;- 每个节点都是一个普通函数,输入 state,返回需要更新的字段;
add_node注册节点;add_edge定义连接关系;compile()编译成可执行对象;invoke()用初始状态启动图并返回最终状态。
跑通这个例子后,你对 LangGraph 最核心的心智模型就有了:一个图就是一整套状态转换规则。 节点之间怎么走,完全由边决定;状态怎么变,由每个节点的返回值决定。后面所有高级功能,条件路由、循环、并行、子图、人工中断,都是在这个模型上叠加能力。
2. 条件路由:graph 真正开始变聪明的分水岭
2.1 没有条件路由时,graph 只是一个顺序执行器
只靠普通边串联节点,StateGraph 跟一个 for 循环差不多:A 到 B,B 到 C,C 结束。这种图能解决一部分流程固定、不需要决策的问题,但 agent 的核心场景恰恰相反。
一个 agent 面对用户输入时:
- 用户问了一个可以直接回答的问题,它应该走“直接回答”分支;
- 用户问了一个需要查天气的问题,它应该先走“调用工具”分支;
- 用户表达不清晰,它可能需要走“追问澄清”分支;
- 工具返回的结果异常,它可能需要走“重新尝试”分支。
这些分支如果靠外部 if-else 去控制,状态传递会非常繁琐。LangGraph 的做法是把这个判断下沉到边层:你写一个路由函数,函数接收当前状态,返回下一个节点名字。图的执行引擎会根据函数返回值自动跳转。
这就是 conditional_edge 的核心逻辑。
2.2 从需求出发理解 conditional_edge 的语法
假设我们做一个简单的智能客服 Agent,入口节点收到用户问题后,先判断这个问题是否需要调用数据库工具,然后决定走“工具节点”还是“直接回答节点”。
流程结构: