LangGraph为Agent编排提供了基于图的流程定义框架,支持循环、条件分支与并行执行。介绍节点与边的设计模型、状态图持久化与人在环路中断点配置,分析其在复杂多Agent协作场景中的表达能力。通过代码示例、架构图与生产经验分享,帮助AI工程师掌握从技术原型到大规模生产的完整工程落地与持续优化能力。

岗位关联

需要学习Agent编排框架LangGraph,LangGraph为Agent编排提供了基于图的流程定义框架,支持循环、条件分支与并行执行。Agent编排框架LangGraph属于端到端项目实战 > Agent工作流的关键内容,掌握后可更好地衔接后续章节。

目录
  1. 可视化演示
  2. LangGraph图结构编排模型
  3. 节点与边的设计模型
  4. 状态图持久化机制
  5. 人在环路中断点配置
  6. 并行执行与多Agent协作
  7. AI 应用场景
  8. Python 演示
  9. 常见问答
  10. 常见误区
  11. 参考来源

可视化演示

展示LangGraph图编排框架:节点边图结构含循环条件分支、状态图检查点持久化机制、并行Fan-out/Fan-in多Agent协作,切换模式查看。

本节配有交互动效(进入视口后自动加载,约 3KB)。

LangGraph图结构编排 节点IN/AG1/AG2/CHK/OUT构成有向图 CHK条件分支支持循环RTRY重试 G=(V,E,cond) 图定义含条件边与循环边

LangGraph图结构编排模型

LangGraph是由LangChain团队开发的Agent编排框架,其核心设计理念是将Agent工作流建模为有状态的图结构(StateGraph)。与传统的DAG任务调度工具不同,LangGraph的图模型天然支持循环、条件分支和并行执行,使得复杂的Agent交互流程可以用直观的方式定义和管理。

StateGraph由三个核心要素组成:节点(Node)、边(Edge)和状态(State)。节点代表工作流中的处理步骤,封装LLM调用、工具执行或自定义逻辑;边定义节点之间的执行流向;状态是在整个图执行过程中传递和更新的共享数据结构,每个节点都可以读取和修改状态。

图结构编排的核心优势在于其表达能力。传统DAG只能表达单向无环的执行流程,而Agent工作流经常需要循环(如反复推理直到满意)、条件分支(如根据问题类型路由到不同处理流程)和并行执行(如同时检索多个数据源)。LangGraph的StateGraph模型原生支持这些模式,无需额外的编排逻辑。

类似地铁线路图的类比可以帮助理解:每个站点是一个处理节点,线路连接决定执行顺序,换乘站实现条件分支和流程切换。乘客(状态)在站点间流动,每个站点根据当前情况决定下一步去向。

节点与边的设计模型

节点是Agent工作流中的处理单元,封装具体的业务逻辑。在LangGraph中,节点是一个Python函数,接收当前状态作为输入,返回状态更新。节点类型包括:LLM调用节点(调用大模型生成响应)、工具执行节点(调用外部工具获取信息)、路由节点(根据条件决定下一步走向)和自定义逻辑节点。

边定义节点之间的执行流向,分为普通边(Normal Edge)和条件边(Conditional Edge)。普通边表示固定的执行顺序,节点A执行完后总是转到节点B。条件边则根据节点输出动态决定下一个执行节点,是实现智能分支的关键机制。

条件边通过一个路由函数实现动态决策。路由函数接收当前状态,返回下一个节点的名称。这使得Agent可以根据LLM的输出内容、工具执行结果或任何状态信息来决定后续流程。例如,审核节点可以根据审核结果决定是通过(结束流程)还是退回(回到推理节点重新执行)。

入口边(Entry Edge)定义图的起始节点,END边定义图的终止条件。一个图可以有多个终止节点,通过不同的END边实现多路径结束。入口和终止的配置决定了图的整体执行边界。

状态图持久化机制

LangGraph的状态图持久化机制是其工程化能力的核心保障。通过检查点(Checkpoint)机制,图在执行过程中可以自动将当前状态保存到持久化存储后端,支持任务中断恢复、时间旅行调试和历史回溯分析。

检查点存储在每次状态转换时自动创建,记录当前节点、状态快照和执行元数据。LangGraph提供了Checkpointer抽象接口,支持多种存储后端:内存存储(MemorySaver,适合开发测试)、SQLite存储(适合单机部署)和PostgreSQL存储(适合生产环境分布式部署)。

持久化机制支持从任意检查点恢复执行。当任务因异常中断或需要人工介入时,系统可以从最近的检查点加载状态并继续执行,无需从头开始。这一能力对于长流程Agent任务(如多轮对话、复杂数据分析)至关重要。

时间旅行(Time Travel)是持久化机制的高级应用。开发者可以回溯到任意历史检查点,查看当时的状态快照,分析执行路径,甚至从历史节点重新执行以测试不同的决策分支。这对调试和优化Agent行为非常有价值。

人在环路中断点配置

人在环路(Human-in-the-Loop, HITL)是LangGraph实现人机协作的关键机制。中断点(Interrupt Point)允许在指定节点暂停执行并持久化当前状态,等待人工审核或输入后继续执行。这不同于简单的程序暂停——中断点会完整保存图的执行上下文,包括当前节点、状态数据和执行历史。

中断点的典型应用场景包括:关键决策审核(如Agent生成的回复需要人工确认后才能发送)、敏感操作确认(如执行退款、删除等不可逆操作前需要人工授权)和人工纠偏(如Agent推理方向错误时人工介入修正)。

中断点的配置通过interrupt_before或interrupt_after参数实现。interrupt_before在节点执行前暂停,适合需要人工审核输入的场景;interrupt_after在节点执行后暂停,适合需要人工审核输出的场景。中断后状态自动持久化,人工完成审核后通过resume命令恢复执行。

如同流水线上的质检工位:产品到达时暂停等待质检员确认,合格后继续流转,不合格则退回前道工序。中断点机制使得Agent系统既保持了自动化的效率,又确保了关键环节的安全可控。

并行执行与多Agent协作

LangGraph支持节点并行执行,多个分支可同时处理不同子任务后汇聚结果。并行执行通过图的分支(Fan-out)和汇聚(Fan-in)模式实现:从一个节点出发多条边到不同节点形成分支,多个节点通过边汇聚到同一节点实现结果合并。

并行执行的关键挑战是状态合并。当多个并行节点同时修改状态时,需要定义合并策略。LangGraph提供了状态合并器(State Reducer),通过注解(Annotation)定义每个状态字段的合并方式:覆盖(最新值覆盖旧值)、追加(将新值追加到列表)或自定义合并函数。

多Agent协作通过子图(Subgraph)和消息传递实现。每个Agent可以作为独立的子图定义,拥有自己的节点、边和状态空间。主图通过调用子图节点实现Agent间的协调配合。子图继承主图的状态上下文,执行完成后将结果返回主图继续处理。

Send API是LangGraph实现动态并行的另一重要机制。与静态定义的并行分支不同,Send API允许在运行时根据状态动态创建并行任务。例如,当Agent需要同时查询多个数据源时,可以根据检索结果动态决定创建多少个并行查询任务。

AI 应用场景

LangGraph多步骤客服Agent编排

阶段:模型部署

解决的问题:复杂客服流程需要灵活的编排能力,支持条件分支、循环和人在环路审核

具体案例:使用LangGraph构建多步骤客服Agent:定义检索节点(查询知识库)、推理节点(生成回复)和审核节点(质量检查),通过条件边实现审核不通过时回到推理节点重新生成,并在审核节点设置interrupt_before中断点,关键回复需人工确认后发送

LangGraph数据分析Agent并行处理

阶段:推理优化

解决的问题:复杂数据分析任务需要多步骤并行处理,LangGraph的并行执行和状态合并能力可高效编排

具体案例:构建数据分析Agent工作流:数据加载节点后分支为三个并行节点(统计分析、趋势预测、异常检测),通过状态合并器汇聚结果到报告生成节点。使用Send API根据数据量动态决定并行分析任务数量,检查点持久化确保长任务中断后可恢复

Python 演示

python53 行
from typing import TypedDict, Annotated, Literalfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.checkpoint.memory import MemorySaver class AgentState(TypedDict):    query: str    retrieved: str    response: str    review_result: str    retry_count: int def retrieve_node(state: AgentState) -> dict:    query = state["query"]    retrieved = f"检索结果: 关于'{query}'的知识库内容"    return {"retrieved": retrieved} def reason_node(state: AgentState) -> dict:    retrieved = state["retrieved"]    retry = state.get("retry_count", 0)    response = f"基于[{retrieved}]生成的回复(第{retry+1}次)"    return {"response": response, "retry_count": retry + 1} def review_node(state: AgentState) -> dict:    response = state["response"]    retry = state.get("retry_count", 0)    if retry >= 2:        review = "pass"    else:        review = "reject"    return {"review_result": review} def route_after_review(state: AgentState) -> Literal["end", "reason"]:    if state["review_result"] == "pass":        return "end"    return "reason" graph = StateGraph(AgentState)graph.add_node("retrieve", retrieve_node)graph.add_node("reason", reason_node)graph.add_node("review", review_node)graph.add_edge(START, "retrieve")graph.add_edge("retrieve", "reason")graph.add_edge("reason", "review")graph.add_conditional_edges("review", route_after_review, {"end": END, "reason": "reason"}) checkpointer = MemorySaver()app = graph.compile(checkpointer=checkpointer, interrupt_before=["review"]) config = {"configurable": {"thread_id": "thread-1"}}result = app.invoke({"query": "如何退货", "retry_count": 0}, config)print("中断前状态:", {k: v for k, v in result.items()})result = app.invoke(None, config)print("最终结果:", result["response"])
目的:演示LangGraph构建包含检索、推理、审核三个节点的Agent工作流,通过条件边实现循环重试,并在审核节点前设置中断点
  1. class AgentState(TypedDict):定义Agent状态结构,包含查询、检索结果、回复、审核结果和重试计数
  2. def retrieve_node(state: AgentState) -> dict:检索节点函数,根据查询从知识库检索相关内容
  3. def reason_node(state: AgentState) -> dict:推理节点函数,基于检索结果生成回复,并递增重试计数
  4. def review_node(state: AgentState) -> dict:审核节点函数,重试次数>=2时通过,否则拒绝要求重新推理
  5. def route_after_review(state: AgentState) -> Literal["end", "reason"]:条件边路由函数,根据审核结果决定结束或回到推理节点
  6. graph = StateGraph(AgentState)创建StateGraph实例,以AgentState为状态类型
  7. graph.add_conditional_edges("review", route_after_review, {"end": END, "reason": "reason"})添加条件边,审核节点根据路由函数输出决定跳转到END或reason节点
  8. checkpointer = MemorySaver()创建内存检查点存储器,用于状态持久化
  9. app = graph.compile(checkpointer=checkpointer, interrupt_before=["review"])编译图并配置检查点和中断点,review节点执行前暂停
  10. result = app.invoke({"query": "如何退货", "retry_count": 0}, config)首次调用触发执行,在中断点暂停并持久化状态
  11. result = app.invoke(None, config)传入None恢复执行,从中断点继续完成剩余流程

常见问答

LangGraph与传统DAG任务调度工具的核心区别是什么?
LangGraph基于StateGraph模型,是有状态的图结构,状态在节点间自动传递和更新,原生支持循环和条件分支。传统DAG工具(如Airflow、Prefect)是无状态的有向无环图,只能表达单向执行流程,不支持循环。LangGraph的循环能力使得Agent可以反复推理直到满意,条件边使得工作流可以根据运行时状态动态路由,这些都是DAG无法直接实现的。
LangGraph中的条件边是如何工作的?
条件边通过路由函数实现动态决策。路由函数接收当前状态作为输入,返回下一个节点的名称(或END)。LangGraph根据返回值查找对应的目标节点并跳转。例如,审核节点的路由函数可以检查审核结果字段,返回'end'表示通过结束流程,返回'reason'表示退回推理节点重新执行。条件边使得Agent工作流具备了根据运行时信息动态调整执行路径的能力。
LangGraph的检查点持久化机制有什么作用?
检查点持久化在每次状态转换时自动将图的执行状态保存到存储后端,记录当前节点、状态快照和执行元数据。主要作用包括:1)任务中断恢复——异常中断后从最近检查点继续执行,无需从头开始;2)人在环路——中断点暂停执行等待人工审核,审核后恢复;3)时间旅行调试——回溯到任意历史检查点分析执行路径;4)状态回溯——从历史节点重新执行测试不同决策分支。
人在环路的interrupt_before和interrupt_after有什么区别?
interrupt_before在指定节点执行前暂停,此时该节点的输入已经准备好但尚未执行,适合需要人工审核输入数据的场景(如审核即将发送给LLM的prompt)。interrupt_after在指定节点执行后暂停,此时该节点已经执行完成产生了输出,适合需要人工审核输出结果的场景(如审核Agent生成的回复内容)。两者都会持久化当前状态,人工完成操作后通过resume恢复执行。
LangGraph如何实现多Agent协作?
LangGraph通过子图(Subgraph)和消息传递实现多Agent协作。每个Agent可以定义为独立的子图,拥有自己的节点、边和局部状态。主图通过调用子图节点实现Agent间的协调:子图继承主图的状态上下文,在子图内部独立执行,完成后将结果返回主图继续处理。此外,Send API支持运行时动态创建并行任务,使得多个Agent可以并发处理不同子任务后通过状态合并器汇聚结果。

常见误区

误区认为LangGraph只是DAG任务调度工具

正解LangGraph的StateGraph是有状态的图结构,状态在节点间自动传递和更新,不是无状态的DAG执行引擎。LangGraph原生支持循环(节点可以回到前驱节点)和条件分支(根据状态动态路由),这些是传统DAG无法表达的能力。DAG工具适合数据流水线,而LangGraph适合需要迭代推理和动态决策的Agent工作流。

为何常见:容易将图结构编排等同于DAG调度,忽视状态传递和循环能力

误区认为LangGraph不支持循环执行

正解LangGraph通过条件边原生支持循环和迭代,允许Agent根据执行结果决定是否重复执行某些节点。条件边的路由函数可以返回已经执行过的节点名称,形成循环。例如审核不通过时回到推理节点重新生成,直到满足条件为止。循环次数可以通过状态变量(如retry_count)控制,避免无限循环。

为何常见:受传统DAG工具限制认知影响,认为图编排只能是单向无环的

误区认为人在环路中断点就是简单的暂停功能

正解中断点不仅暂停执行,还持久化当前状态,支持从断点恢复执行,是人在环路的核心机制而非简单暂停。中断时图的完整执行上下文(当前节点、状态数据、执行历史)都被保存到检查点存储,恢复时从持久化状态重建执行环境。这使得中断可以跨越进程重启甚至系统重启,人工审核可以在任意时间后进行。

为何常见:将中断点理解为程序暂停,忽视状态持久化和恢复机制

参考来源