引言
在构建复杂的人工智能应用时,我们经常面临状态管理、流程控制和多智能体协作等挑战。LangGraph 正是为了解决这些痛点而生的强大框架。作为 LangChain 生态的重要补充,LangGraph 允许开发者以图(Graph)的形式编排大语言模型(LLM)和工具,从而实现高度定制化、具备状态感知和循环执行能力的 AI 工作流。
本文将带你全面深入地探索 LangGraph。我们将从它的核心概念出发,逐步深入到 State 的进阶用法、高级特性(如并行执行、持久化、中断机制)、工具调用以及多智能体系统的构建。无论你是 LangChain 的老用户还是 AI 应用开发的新手,这篇指南都将为你提供清晰的学习路径和实战参考。
第一部分:LangGraph 概述
什么是 LangGraph?
LangGraph 是一个用于构建具有状态、多步骤、循环和分支逻辑的 LLM 应用程序的库。如果说 LangChain 提供了构建 AI 应用的"积木"(如 Prompt、LLM、Tools),那么 LangGraph 就是将这些积木组装成复杂机器的"图纸"和"传动系统"。
LangGraph 与 LangChain 的关系
LangGraph 建立在 LangChain 之上,但它的定位更加聚焦:
- LangChain:侧重于组件的抽象和链式调用(Chain),适合线性的、相对简单的任务流。
- LangGraph :侧重于图结构 和状态管理,适合需要循环(如 Agent 的自我纠错)、条件分支、多智能体协作以及需要持久化状态的复杂工作流。
简单来说,LangGraph 让你能够像画流程图一样编排 AI 逻辑,并且这个流程图是"活"的------它知道当前执行到了哪一步,上一步的结果是什么。
第二部分:核心概念详解
LangGraph 的架构建立在四个核心概念之上:State(状态) 、Node(节点) 、Edge(边) 和 Graph 编译。

1. State(状态)
State 是整个图的"记忆"。它是一个在图的执行过程中不断被传递和更新的字典(或 TypedDict)。每个节点都可以读取 State,也可以返回更新后的 State。
python
from typing import TypedDict
class AgentState(TypedDict):
messages: list
next_step: str
2. Node(节点)
Node 是执行具体逻辑的单元。通常,一个 Node 是一个 Python 函数,它接收当前的 State,执行某些操作(如调用 LLM、执行工具),然后返回需要更新的 State 字段。
python
def call_model(state: AgentState):
response = llm.invoke(state["messages"])
return {"messages": [response]}
3. Edge(边)
Edge 定义了节点之间的连接关系,即执行流程。LangGraph 支持两种边:
- 普通边(Normal Edge):无条件地从节点 A 流向节点 B。
- 条件边(Conditional Edge):根据当前 State 的值,动态决定下一步流向哪个节点。这是实现 Agent 循环和分支逻辑的关键。
python
# 条件边示例:根据 LLM 是否调用了工具来决定下一步
def should_continue(state: AgentState):
last_message = state["messages"][-1]
if last_message.tool_calls:
return "tools"
return "end"
graph.add_conditional_edges("agent", should_continue, {"tools": "tools", "end": END})
4. Graph 编译(Compile)
定义好节点和边之后,我们需要调用 compile() 方法将图编译成一个可执行的对象。编译过程会验证图的结构,确保没有孤立节点或死循环。
python
app = graph.compile()
result = app.invoke({"messages": ["Hello!"]})
第三部分:State 进阶
在实际应用中,State 的管理往往比简单的字典覆盖要复杂得多。LangGraph 提供了 Schema 模式 和 Reducers(归约器) 来优雅地处理这些问题。
1. Schema 模式
推荐使用 TypedDict 或 Pydantic 模型来定义 State 的 Schema。这不仅提供了类型提示,还能在编译阶段捕获错误。
python
from typing import Annotated
from langgraph.graph.message import add_messages
class State(TypedDict):
# 使用 Annotated 和 add_messages 作为 reducer
messages: Annotated[list, add_messages]
user_input: str
2. Reducers(归约器)
默认情况下,节点返回的 State 更新会覆盖 原有值。但在很多场景下(如消息列表),我们希望追加而不是覆盖。Reducers 就是用来定义这种合并逻辑的。
- add_messages:LangGraph 内置的 reducer,专门用于消息列表。它会根据消息 ID 智能地追加或更新消息,避免重复。
- 自定义 Reducer:你可以编写任何函数作为 reducer。例如,实现一个计数器:
python
def sum_reducer(current, new):
return current + new
class State(TypedDict):
count: Annotated[int, sum_reducer]
3. 多模式 State
在某些复杂图中,不同的子图或节点可能需要不同的 State 视图。LangGraph 支持通过 input_schema 和 output_schema 来限制节点看到和修改的 State 范围,实现关注点分离。
第四部分:高级特性
LangGraph 的真正威力在于其高级特性,这些特性让构建生产级 AI 应用成为可能。
1. Send 与并行执行
当需要同时处理多个独立任务时,Send API 允许你在条件边中动态生成多个并行分支。

python
from langgraph.types import Send
def fan_out(state: State):
# 为每个待处理项创建一个 Send 对象
return [Send("process_item", {"item": item}) for item in state["items"]]
graph.add_conditional_edges("router", fan_out)
2. Command(命令)
Command 允许节点在返回状态更新的同时,显式地指定下一个要执行的节点。这在动态路由场景中非常有用,将路由逻辑内聚到节点内部。
python
from langgraph.types import Command
def router_node(state: State):
next_node = determine_next(state)
return Command(goto=next_node, update={"routed_at": "now"})
3. Persistence(持久化)
生产环境中的 AI 应用需要支持暂停、恢复、回溯和时间旅行调试。LangGraph 通过 Checkpointer 实现状态持久化。

python
from langgraph.checkpoint.memory import MemorySaver
checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer)
# 每次调用传入 thread_id,状态会自动保存和恢复
config = {"configurable": {"thread_id": "user-123"}}
app.invoke({"messages": ["Hi"]}, config)
4. Interrupt(中断)
Interrupt 允许图在执行到某一步时暂停,等待外部输入(如人类审批、用户确认)。结合 Checkpointer,可以实现完美的人机交互循环。
python
from langgraph.types import interrupt
def human_approval(state: State):
# 图会在这里暂停,等待外部调用 resume
decision = interrupt({"question": "是否批准此操作?"})
return {"approved": decision}
5. Subgraphs(子图)
当图变得过于复杂时,可以将其拆分为子图。子图拥有自己的 State 和编译逻辑,通过父图的节点进行调用。这实现了逻辑的模块化和复用。

第五部分:工具调用与 ToolNode
工具调用是 Agent 的核心能力。LangGraph 提供了 ToolNode 来标准化这一过程。
ToolNode 的工作原理
ToolNode 是一个预构建的节点,它会自动:
-
检查 State 中最后一条消息是否包含 tool_calls。
-
并行执行所有工具调用。
-
将工具执行结果作为 ToolMessage 追加到 State 的 messages 中。

python
from langgraph.prebuilt import ToolNode
tools = [search_tool, calculator_tool]
tool_node = ToolNode(tools)
graph.add_node("tools", tool_node)
错误处理
ToolNode 还支持自定义错误处理。当工具执行失败时,它可以返回一个包含错误信息的 ToolMessage,而不是直接抛出异常,让 LLM 有机会自我纠错。
第六 部分:多智能体系统
LangGraph 是构建多智能体(Multi-Agent)系统的理想选择。常见的模式包括:
1. Supervisor(主管)模式
一个主管 Agent 负责理解任务、分配工作给专业 Agent,并汇总结果。
User\] → \[Supervisor\] → \[Coder\] / \[Reviewer\] → \[Supervisor\] → \[User
2. Swarm(群体)模式
Agent 之间通过 Command(goto=...) 或共享 State 进行点对点通信,没有中心化的主管。每个 Agent 自主决定何时将控制权交给下一个 Agent。
3. 层级模式
结合 Subgraphs,构建多层级的智能体组织。例如,一个"工程团队"子图内部包含"架构师"、"开发者"、"测试员"等多个节点。
多智能体系统的关键在于通信协议 和状态共享。LangGraph 的 State 和 Edge 机制天然支持这些需求。
总结与展望
LangGraph 为 AI 应用开发带来了范式转变。通过图结构、状态管理和高级控制流,它让我们能够构建出真正具备"智能体"特性的应用------它们能够推理、规划、使用工具、自我纠错,甚至与其他智能体协作。
核心要点回顾: - State 是图的记忆,使用 Reducers 管理更新逻辑。 - Node 和 Edge 构成执行流,条件边实现动态路由。 - 高级特性 (Send、Command、Persistence、Interrupt、Subgraphs)是构建生产级应用的基石。 - ToolNode 和多智能体模式让 Agent 能力无限扩展。
随着 LangGraph 的不断演进,我们可以期待更多开箱即用的预构建组件、更强大的可视化调试工具,以及与更多外部系统的深度集成。无论你是想构建一个智能客服、自动化研究助手,还是复杂的企业级 AI 工作流,LangGraph 都为你提供了坚实的技术底座。
现在,打开你的编辑器,开始绘制你的第一个 AI 工作流图吧!