LangGraph:状态机与循环
LangChain 的创始人 Harrison Chase 曾说:“Agent 的本质是一个循环。”
传统的 LangChain 擅长构建 DAG(有向无环图),即 A->B->C 的线性流程。但在构建复杂 Agent 时,我们需要循环(如:写代码 -> 报错 -> 修改 -> 再运行)。
LangGraph 应运而生。它是基于图论的 Agent 编排框架。
[PROMPT_LAB_BANNER]
1. 核心概念:StateGraph
LangGraph 的核心是将 Agent 建模为一个状态机 (State Machine)。
stateDiagram-v2
[*] --> LLM : 输入
LLM --> Tool : 调用工具
Tool --> LLM : 返回结果
state LLM {
[*] --> Thinking
Thinking --> Deciding
}
state Tool {
API_Call --> Parse_Result
}
LLM --> End : 完成任务
Tool --> Error : 异常
Error --> LLM : 重试 (Loop)
State (状态)
一个全局共享的数据对象(通常是 TypedDict)。所有节点都可以读取和修改它。
class AgentState(TypedDict):
messages: list[BaseMessage]
current_code: str
error_logs: str
iterations: int
Nodes (节点)
执行具体逻辑的函数(如调用 LLM、运行代码)。每个节点接收 State,并返回 State 的更新量。
Edges (边)
控制流程的跳转。
- 普通边:A -> B(A 跑完直接跑 B)。
- 条件边 (Conditional Edges):根据 A 的输出决定跑 B 还是 C。这是实现“循环”和“分支”的关键。
2. Hello World: 一个简单的循环 Agent
假设我们要构建一个“Reflexion Coder”:写代码 -> 检查 -> 有错重写 -> 没错结束。
graph LR
Start((Start)) --> Write[编写代码]
Write --> Check[运行检查]
Check -->|有错误| Write
Check -->|通过| End((End))
from langgraph.graph import StateGraph, END
# 1. 定义状态
class State(TypedDict):
code: str
error: str
# 2. 定义节点函数
def write_code(state):
# 调用 LLM 生成代码
return {"code": "print('hello')"}
def check_code(state):
# 模拟运行检查
if "error" in state["code"]:
return {"error": "Syntax Error"}
return {"error": ""}
# 3. 定义条件逻辑
def router(state):
if state["error"]:
return "write_code" # 有错,循环回去重写
return "end" # 没错,结束
# 4. 构建图
workflow = StateGraph(State)
workflow.add_node("write_code", write_code)
workflow.add_node("check_code", check_code)
workflow.set_entry_point("write_code")
workflow.add_edge("write_code", "check_code")
workflow.add_conditional_edges(
"check_code",
router,
{"write_code": "write_code", "end": END}
)
app = workflow.compile()
3. Human-in-the-loop (人类介入)
Agent 并不总是可靠的。在关键步骤(如:发送邮件、部署代码),我们需要人类审批。
LangGraph 原生支持断点 (Interrupts)。
- 可以在某个 Node 前暂停。
- 人类检查 State,甚至修改 State(如帮你改一行代码)。
- 发送“继续”指令,Agent 从断点处恢复运行。
这对于构建生产级 Agent 至关重要。
4. 为什么选择 LangGraph?
| 特性 | LangChain (Legacy) | LangGraph |
|---|---|---|
| 控制流 | 线性 (Chain) | 图 (Graph) + 循环 |
| 状态管理 | 隐式传递 | 显式 State 定义 |
| 容错性 | 容易断链 | 易于实现重试和回退 |
| 持久化 | 难 | 内置 Checkpointer,支持断点续传 |
小结
LangGraph 并不是一个新的“库”,它是一种设计模式。它强迫开发者显式地定义 Agent 的状态流转。虽然上手门槛比 LangChain 高,但它是构建复杂、可靠 Agent 系统的必经之路。