LangGraph 第1章:为什么选择 LangGraph
传统 LLM Chain 的局限性
在使用 LangChain 等框架构建 LLM 应用时,我们通常采用 Chain(链式)模式。这种模式将多个步骤线性排列,每个步骤依次执行:
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# 一个简单的链:输入 -> 翻译 -> 总结
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run("Hello world")
这种 Chain 模式存在几个明显的局限性:
| 局限性 | 说明 | 实际影响 |
|---|---|---|
| 线性执行 | 步骤必须严格按顺序执行,无法跳转或循环 | 无法实现 Agent 的"推理-行动-观察"循环 |
| 无状态管理 | 每一步之间没有共享的状态容器 | 需要在步骤间手动传递数据 |
| 分支困难 | 根据条件走不同路径需要复杂的条件判断 | 难以实现动态决策流 |
| 无法暂停 | 执行一旦开始就必须全部完成 | 无法实现人工审核等需要等待的场景 |
| 调试困难 | 无法查看中间状态,出了问题只能从头排查 | 开发和排错效率低 |
LangGraph 的图计算优势
LangGraph 将工作流建模为有向图(Directed Graph),从根本上解决了上述问题:
- 灵活的执行流:节点之间可以任意连接,支持循环、分支、并行等多种模式
- 统一的状态管理:所有节点共享同一个 State 对象,通过 Reducer 机制控制状态合并
- 条件路由:节点可以根据当前状态动态决定下一步走向
- 中断与恢复:支持在执行过程中暂停,等待外部输入后继续
- 可观测性:每个节点的输入输出都可通过 Checkpointer 记录,支持时间旅行调试
StateGraph 核心思想
StateGraph 是 LangGraph 的核心类,它的设计思想可以概括为三点:
1. 状态驱动(State-Driven)
图的执行完全由状态驱动。每个节点读取当前状态,执行操作,然后返回状态更新:
from langgraph.graph import StateGraph
from typing import TypedDict
# 定义状态结构
class MyState(TypedDict):
input: str
output: str
steps: list
# 节点函数:接收状态,返回状态更新
def process_node(state: MyState):
# 读取当前状态
current_input = state["input"]
# 执行操作
result = current_input.upper()
# 返回状态更新
return {"output": result, "steps": ["processed"]}
2. 图结构(Graph Structure)
节点(Node)是执行单元,边(Edge)定义流转路径,条件边(Conditional Edge)实现动态路由:
Node A --> Edge --> Node B --> Edge --> Node C
|
+--> (Conditional) --> Node D
3. 编译执行(Compile & Execute)
图需要先编译(compile)才能执行,编译过程会进行拓扑排序和优化:
# 构建图
graph = StateGraph(MyState)
graph.add_node("process", process_node)
graph.set_entry_point("process")
graph.add_edge("process", "__end__")
# 编译
app = graph.compile()
# 执行
result = app.invoke({"input": "hello", "output": "", "steps": []})
适用场景概览
LangGraph 特别适合以下场景:
- Agent 系统:需要多步推理、工具调用的自主 Agent
- 多轮对话:有状态、需要上下文的对话系统
- 复杂工作流:涉及分支、循环、并行的工作流
- 人机协作:需要审批、审核等人工介入的场景
- 多 Agent 系统:多个 Agent 协同完成复杂任务
与其他框架的对比
| 特性 | LangChain Chain | LangGraph | 自定义代码 |
|---|---|---|---|
| 执行模型 | 线性链 | 有向图 | 任意 |
| 状态管理 | 隐式传递 | 显式 State | 自行实现 |
| 条件分支 | 困难 | 原生支持 | 灵活但繁琐 |
| 循环支持 | 不支持 | 原生支持 | 自行实现 |
| 暂停/恢复 | 不支持 | 通过 Interrupt | 自行实现 |
| 可视化 | 无 | LangGraph Studio | 无 |
| 学习曲线 | 低 | 中 | 高 |
LangGraph 的核心价值在于:它在灵活性和易用性之间找到了一个很好的平衡点。对于需要复杂控制流的 LLM 应用,LangGraph 是目前最强大的选择之一。