Skip to content

LangGraph

LangChain 的 Chain 是线性或分支的流程编排,适合简单的"输入 → 处理 → 输出"模式。但当 Agent 需要维护复杂状态、支持条件跳转、循环执行、人工介入时,Chain 的表达能力就不够了。LangGraph 用图(Graph)取代链(Chain),用节点表示执行步骤、边表示流转条件、状态(State)贯穿全流程,是构建有状态 Agent 工作流的标准框架。

LangGraph 的核心思想是:将 Agent 的执行过程建模为一张有向图。每个节点(Node)是一个 Python 函数,接收当前状态、返回状态更新;边(Edge)定义节点之间的流转规则,可以是固定的(A → B)也可以是条件性的(根据状态选择下一个节点)。这种模型天然支持循环(边可以指回之前的节点)、分支(一条边分出多个出边)、以及汇合(多个节点指向同一个节点)。

State 与节点

State 是 LangGraph 的核心抽象,它是一个 TypedDict,定义了在整个图执行过程中需要维护的数据结构。例如一个客服 Agent 的 State 可能包含 messages(对话历史)、current_step(当前步骤)、search_results(检索结果)、needs_human(是否需要人工介入)。

每个节点函数接收完整的 State,返回一个字典,字典中的键值对会被合并到 State 中(浅合并,不是覆盖整个 State)。这种设计使得节点之间通过 State 松耦合:节点只需要知道自己需要读取和写入哪些字段,不需要知道其他节点的实现。State 还支持 annotations,定义不同字段的行为——messages 字段通常标注为 add(新消息追加到列表而非替换列表),其他字段默认是 replace

图的构建过程是声明式的。创建一个 StateGraph,指定 State 类型,然后依次 add_node(添加节点函数)和 add_edge(添加边)。入口节点通过 set_entry_point 指定,终点通过 add_node 后不添加出边来实现,或者显式指定终止节点。

条件边与循环

条件边(Conditional Edge)是 LangGraph 区别于简单 Chain 的关键。普通边是固定的 A → B 转移,条件边根据当前 State 的内容动态选择下一个节点。典型模式:Agent 节点执行 LLM 推理后,返回包含"下一步动作"的 State,条件边根据动作类型路由——如果是"搜索"则转到搜索节点,如果是"回答"则转到终止节点,如果是"计算"则转到计算节点。

这种模式自然支持 ReAct 循环:推理节点 → 条件路由 → 工具执行节点 → 回到推理节点。循环次数可以通过 State 中的计数器控制,超过阈值时强制路由到终止节点,防止 Agent 陷入死循环。

Subgraph 是 LangGraph 的模块化机制。复杂的工作流可以拆分为多个子图,每个子图封装独立的逻辑,主图通过节点调用子图。例如"文档问答"流程中,检索子图负责多路召回和精排,生成子图负责基于检索结果生成答案,主图协调两个子图的执行。Subgraph 有自己独立的 State(可以通过转换函数映射到父图的 State),实现了真正的模块化复用。

人工介入

生产环境中的 Agent 不能完全自主决策,关键节点需要人类确认。LangGraph 的 Interrupt 机制支持在节点执行前暂停图的执行,等待人工输入后恢复。例如支付节点执行前暂停,等待用户确认金额;搜索结果返回后暂停,让用户选择要深入查看的文档。

实现方式是在节点函数中调用 interrupt(value),传入需要人类审阅的信息。图执行到此处会抛出中断异常,保存当前 State 到持久化存储(checkpoint)。人工审核后,调用 graph.invoke(None, config)(传入 None 表示不提供新输入,使用恢复的 State)继续执行。这种机制让工作流可以跨多次人类交互完成,而不需要从头开始。

持久化

LangGraph 的 Checkpointer 负责将每次节点执行后的 State 快照持久化。内置的 MemorySaver 将快照存储在内存中,适合开发调试。生产环境可以用 SqliteSaver(存储在 SQLite 中)或自定义 Checkpointer(存储在 Redis、PostgreSQL 等外部存储中)。

持久化有三个重要作用。第一是恢复中断的工作流:Agent 执行到一半时崩溃或被暂停,可以从最近的 checkpoint 恢复,而不是重新执行。第二是支持多轮对话:每次用户输入触发图的一次执行,对话历史存储在 State 中,通过 checkpoint 跨轮次保持。第三是时间旅行调试:可以回溯到任意历史 checkpoint,查看当时的 State 和执行路径,定位问题节点。

与 LangChain Chain 的关系

LangGraph 并不是要替代 LangChain 的全部能力,而是补充了 Chain 在状态管理和控制流上的不足。LangChain 的 Model I/O、Tool、Memory 等组件仍然在 LangGraph 中使用——LangGraph 的节点内部通常调用 LangChain 的 LLM、Retriever、Tool。简单的一问一答场景用 Chain 就够了,LangGraph 适合需要循环、分支、人工介入的复杂 Agent 场景。

一个实用的判断标准:如果应用的执行路径可以用流程图画出来,且存在循环、条件分支、人工审批等环节,就应该用 LangGraph。如果只是"用户提问 → 检索 → 生成"的线性流程,LangChain 的 Chain 完全够用。