在大模型智能体(Agent)的工程化落地中,复杂任务的流程编排始终是核心痛点——传统 LangChain Chain 仅能支撑线性执行逻辑,无法满足多轮决策、分支跳转、循环重试等复杂场景需求。
LangGraph 作为 LangChain 生态推出的工作流编排框架,以 “图结构” 为核心设计理念,完美解决了这一问题,成为构建高灵活度智能体的首选工具。本文将从源码视角出发,拆解 LangGraph 的核心概念、整体架构与执行链路,带你理解其 “流程可视化、状态可回溯、逻辑可扩展” 的底层设计逻辑。
核心架构:基于“图结构”编排的有状态 Agent 框架
LangGraph 是一个基于“图结构” 编排的有状态 Agent 框架。我们将其拆解来看:
- “图计算”:用节点和连线组成一张“流程图”,每个节点执行一个功能,边决定了执行顺序。
- “有状态”:意味着 Agent 能记住之前发生的历史信息,例如用户的提问、工具调用的结果。
- “框架”:提供了一套标准范式,让开发者能快速搭建复杂的 AI 应用。
如果把普通的大模型比作“只会答题的学生”,那么基于 LangGraph 构建的 Agent 就像“项目经理”——能够拆解任务、记录进度、协调资源、产出报告,并在出错时进行重试或寻求帮助。
它特别适合以下场景:
- 多轮对话(需要记忆用户偏好)
- 长期任务执行(例如持续追踪项目进展)
- 多个 AI 子任务协作(一个查询数据,一个生成报告)
LangGraph核心特点
- 有状态Agent:区别于“无状态”的一次性问答,有状态 Agent 拥有可持久化的“状态”,能记住历史信息并进行持续决策。
- 自适应系统:系统能根据运行时的具体情况自动调整行为。例如,根据用户问题自动调用不同的工具,或将复杂任务拆解为多个子任务并行处理。
- “图结构” 编排:底层由节点(Node)和边(Edge) 组成,支持分支、循环、并行等复杂逻辑,突破了传统代码线性执行的限制。
LangGraph 的核心定位:为何需要 “图结构” 编排?
核心痛点:传统链式流程(如 LangChain Chain)只能线性执行。一旦遇到分支判断、循环重试或多智能体协作等复杂逻辑,代码会变得嵌套深、难以维护,扩展性差。
核心方案:用“图结构”替代“链条”,将任务流程建模为由节点和边组成的图,实现灵活的跳转与循环,让复杂流程变得清晰可控。
在人工智能智能体的工程实践中,许多任务并非线性。例如:调用工具失败需重试、根据用户意图选择不同处理路径、多个智能体协同完成目标……这些需求用传统的“链式结构”编写,极易陷入“回调地狱”。
LangGraph 为此而生。它将流程抽象为三个核心要素:每个步骤是一个节点,步骤间的流转规则是边,整个过程共享的数据是状态。这种设计能轻松实现:
- 根据某一步的结果决定下一步去向(分支)
- 在特定环节出错后自动返回重试(循环)
- 所有步骤共用一份上下文数据(状态共享)
从源码看,其核心类主要在langgraph/graph.py中,分为三层:BaseGraph → Graph → StateGraph。其中StateGraph在图的基础上增加了状态管理能力,是实际开发中最常用的入口。这一层抽象让 LangGraph 成为构建复杂智能体流程的“骨架”。
LangGraph 核心概念拆解:从源码看 “图结构” 构成
核心痛点:流程逻辑越复杂,越需要灵活控制执行路径和共享数据,但传统方式难以同时支持动态跳转与上下文的统一管理。
核心方案:通过“节点 + 边 + 状态”三位一体的设计,将执行逻辑、流转规则、数据传递全部纳入图中统一调度。
1. 节点(Node):工作流的 “执行单元”
节点是一个个可执行的原子任务,例如调用大模型、查询数据库或处理文本。任何可调用对象(函数、方法)都可以作为节点,只要其输入为状态,并输出部分新的状态即可。
在Python源码中,通过add_node方法注册节点:
def add_node(self, name: str, node: Callable) -> None:
if not callable(node):
raise ValueError("Node must be callable")
self.nodes[name] = node # 存储节点,后续按名称调用
这种轻量级设计允许普通函数、类方法或子流程都能作为节点接入,极大提升了灵活性。
2. 边(Edge):工作流的 “流转规则”
边决定了“当前节点执行完毕后,下一步该做什么”。它可以是固定的,也可以根据状态动态选择下一个节点。例如:工具调用成功则进入总结阶段,失败则进入重试流程。
源码中的add_edge方法支持两种方式:
def add_edge(self, start: str, end: Union[str, Callable]) -> None:
if isinstance(end, str):
self.edges[start] = lambda state: end # 固定跳转
elif callable(end):
self.edges[start] = end # 动态路由函数
- 固定边:A → B,直接跳转。
- 条件边:根据A的输出结果,动态决定下一个节点是B还是C。
- 动态边:甚至可以并行触发多个后续节点。
这让流程从一条死板的流水线,变成了能够智能导流的交通网络。
3. 状态(State):工作流的 “数据中枢”
所有节点共用一个全局的“状态”,任何节点都可以读写自己关心的部分,避免了参数在节点间层层传递的麻烦。StateGraph支持多种状态更新策略:覆盖、合并(如字典)或通过自定义 reducer 函数处理(如列表追加、数字累加)。
执行时的核心流程如下:
- 初始化状态
- 执行当前节点,传入当前全局状态
- 获取节点输出,按预定规则合并回全局状态
- 查询边规则,确定下一个节点
- 循环执行步骤2-4,直到流程结束
这样,多轮对话中的历史记录、工具调用结果、中间推理步骤全都存储在一个地方,随时可供后续节点使用。
LangGraph 执行流程:从定义到运行
核心痛点:流程定义与实际执行脱节,导致调试困难、不可视化、不易复用。
核心方案:将流程拆分为“定义 → 编译 → 执行”三个阶段,先设计蓝图再运行,实现流程的可编排、可追踪与可调试。
1. 定义层:构建图结构
这一阶段是“画蓝图”,使用StateGraph类配置节点、边和状态结构。
from langgraph.graph import StateGraph
from pydantic import BaseModel
class StateSchema(BaseModel):
query: str
steps: list[str] = []
final_response: str = ""
graph = StateGraph(StateSchema)
graph.add_node("tool_call", tool_call_function)
graph.add_node("response_generate", response_generate_function)
graph.add_edge("tool_call", lambda state: "response_generate" if state.steps else "retry")
graph.set_entry_point("tool_call")
这些操作本质是在存储配置信息,流程尚未开始运行。
2. 编译层:将图结构转化为可执行流程
定义好图结构后,需要通过compile方法将其编译为可执行的“图实例”。这一步会进行合法性校验(如检查入口节点、孤立节点),并封装节点执行逻辑与边路由规则。
compiled_graph = graph.compile()
编译后得到一个CompiledGraph实例,它包含了运行所需的一切,对外提供run方法来启动流程。
3. 执行层:运行图结构并返回结果
执行层的核心是CompiledGraph实例的run方法。它接收初始状态,然后循环执行“运行当前节点 → 更新全局状态 → 根据边决定下一节点”的流程,直到触发终止条件(如到达END节点)。
final_state = compiled_graph.run({"query": "北京天气怎么样?"})
每一轮迭代都基于当前状态执行一个节点,更新数据后决定下一个节点,实现灵活可控的流程推进。
LangGraph 与传统 Chain 的核心差异:从架构视角对比
| 对比维度 |
传统 LangChain Chain |
LangGraph |
| 架构设计 |
线性流水线结构 |
图结构(节点 + 边 + 状态) |
| 流程灵活性 |
仅支持线性执行,不支持分支/循环 |
支持分支、循环、并行,灵活度极高 |
| 状态管理 |
数据在线性步骤间传递,无全局状态 |
全局统一状态,支持多节点共享与修改 |
| 适用场景 |
简单单步骤任务(如“查询+生成”) |
复杂多步骤任务(如智能体工具调用、多轮决策) |
LangGraph 并非简单的“增强版 Chain”,而是面向复杂流程的全新建模范式。
小结:LangGraph 架构设计的核心思想
核心痛点:复杂任务流程难建模、难维护、难调试,传统方式难以工程化落地。
核心方案:LangGraph 用“节点+边+状态”的图模型统一抽象流程,实现灵活、解耦、可工程化的任务编排。
其设计思想可归纳为:
- 抽象化:用三个基本元素(节点、边、状态)描述任意复杂流程。
- 解耦化:将业务逻辑、流转规则、共享数据三者分离,便于开发、测试与复用。
- 工程化:内置编译校验、可视化、防死循环等机制,并支持与多种数据库后端集成的状态持久化,保障生产环境下的可用性。
理解这套思想,就能像搭积木一样构建智能体的“大脑”。在后续的源码深度解析中,我们将进一步探讨其状态管理的精细实现、节点与边的执行协同机制,以及循环与终止策略的设计。