如何快速上手 LangGraph 状态机:智能体图编排与检查点实现完整指南
在开源项目 ai-engineering-from-scratch 中,LangGraph 状态机是构建可靠 AI 智能体的核心一课:把智能体画成一张图(Graph),每个节点是函数、每条边是转移规则,状态在每次转移后自动保存检查点(Checkpoint),从而获得断点续跑、人工审批、时间回溯等生产级能力。本文带你用最少的代码,看懂智能体图编排与检查点实现的完整原理。
为什么智能体需要状态机?
新手写智能体时,最常见的模式是一个 while True 死循环:模型思考 → 调用工具 → 观察结果 → 再思考……
这个循环有个致命问题:它没有任何"钩子"。
- ❌ 模型调用了一个返回 500 的工具,循环无法暂停排查
- ❌ 用户中途改主意,无法回退到上一步
- ❌ 智能体要执行"退款"这类敏感操作,无法插入人工审批
而 LangGraph 的思路是:智能体本来就是状态机,那就把它显式画出来。一旦图是明确的,你就免费获得四大超能力:
| 能力 | 说明 | 典型场景 |
|---|---|---|
| 📌 检查点 Checkpointing | 每个节点转移后保存状态 | 断电不失忆,随时续跑 |
| ⏸️ 中断 Interrupts | 在指定节点前暂停,等待人工 | 退款前的审批 |
| 📡 流式 Streaming | 实时推送每步状态变化 | 前端显示"正在调用搜索工具…" |
| ⏪ 时间回溯 Time-travel | 回到任意历史状态重新分叉 | 调试"如果当时选了工具 B 会怎样" |
LangGraph 状态机的 3 个核心概念
1️⃣ 状态(State):一张流动的"表格"
状态是一个带类型的字典(TypedDict 或 Pydantic 模型),在图中流动。每个节点接收完整状态、返回部分更新,运行时按字段用**归约器(Reducer)**合并:
- 默认行为:新值覆盖旧值
- 消息列表字段:用
add_messages归约器追加而不是覆盖
💡 这是新手最常见的坑:忘了给
messages字段配归约器,两轮对话的消息会被静默丢掉一半。
2️⃣ 节点(Node):一个个纯函数
节点就是 state → partial_state 的 Python 函数,代表一个离散步骤:"调用模型"、"执行工具"、"总结"、"人工审批"。
3️⃣ 边(Edge):节点之间的转移规则
- 静态边:A 一定去 B
- 条件边:由一个路由函数根据模型输出决定下一步,实现分支
一个生产级 ReAct 智能体只需要 4 个节点 + 2 条边:agent(调 LLM)→ 条件边 → tools(执行工具)→ 回到 agent,模型不再要工具时结束。约 40 行代码,就拥有完整的"思考→行动→观察"循环,还自带检查点、中断和流式。
检查点:让智能体"第 38 步失败,从第 38 步继续"
这是 LangGraph 最核心的设计理念:持久化执行(Durable Execution)。
每个节点返回后,运行时会把完整状态序列化写入检查点存储(测试用内存 MemorySaver,生产用 Postgres / SQLite / Redis),以 (thread_id, checkpoint_id) 为键。失败恢复时只需调用 load_state(session_id) 即可精确恢复——Klarna、Uber、J.P. Morgan 正是看中"图 + 检查点让故障恢复变便宜"这一点在生产中使用它。
🚫 常见误区:只保存对话轮次是不够的。工具状态、内存写入都必须整体序列化,否则恢复后这些状态永远丢了。
人机协同:审批要放在"副作用之前"
标记一个节点为 interrupt_before,执行会在该节点运行前停止,状态被持久化,API 可以回复用户"等待审批中"。之后同一个 thread_id 带着 Command(resume=...) 请求即可恢复。
关键设计原则:审批挂在"进入副作用节点"的边上(先审批再执行,才能取消伤害),验证挂在"离开模型"的边上(便宜地拒绝错误调用)。绝不要让智能体先删库、再问人工同不同意。
三种多智能体编排拓扑
项目课程中总结了三种主流拓扑,可按团队规模选择:
- Supervisor(主管):中央路由模型分派给专家子智能体——最简单,适合大多数场景
- Swarm(蜂群/点对点):智能体之间直接交接,无中央路由,适合高并发
- Hierarchical(分层):主管再管子主管,通过嵌套子图实现——编译好的图本身可以作为另一张图的节点
项目里的 2 个实战课例 🔍
本项目用两门循序渐进的课程覆盖 LangGraph 状态机,都是"读懂原理 + 动手实现"的结构:
① 状态机四节点实战(LLM 工程篇第 16 课)
四节点 ReAct 图 + 检查点 + 中断 + 时间回溯的完整实现,包括"从历史检查点分叉重放"的调试技巧:
- 课程文档:phases/11-llm-engineering/16-langgraph-state-machines/docs/en.md
- 参考实现:phases/11-llm-engineering/16-langgraph-state-machines/code/main.py
- 技能输出:phases/11-llm-engineering/16-langgraph-state-machines/outputs/skill-stategraph-designer.md
② 有状态图与持久化执行(智能体工程篇第 13 课)
用 Python 标准库从零实现一个 LangGraph 形状的状态图:分类→退款/缺陷/销售分支→人工关卡→发送。运行它会看到完整的"暂停→持久化→审批→精确恢复"流程,直观理解检查点机制:
- 课程文档:phases/14-agent-engineering/13-langgraph-stateful-graphs/docs/en.md
- 可运行的检查点恢复演示:phases/14-agent-engineering/13-langgraph-stateful-graphs/code/main.py
- 配套技能:phases/14-agent-engineering/13-langgraph-stateful-graphs/outputs/skill-state-graph.md
两课配套练习可直接运行 phases/14-agent-engineering/13-langgraph-stateful-graphs/code/main.py 中的演示(纯标准库,无需安装依赖):
python3 phases/14-agent-engineering/13-langgraph-stateful-graphs/code/main.py
输出会展示首次运行在 human_gate 暂停、检查点历史列表,以及人工批准后从断点精确续跑的完整轨迹。
新手上手的 5 条设计清单 ✅
课程给出的"60 秒设计法",建议写代码前照做一遍:
- 给节点命名:每个离散决策或副作用动作就是一个节点;列不出来说明任务还不是"智能体形状"
- 声明最小状态:任务专属字段(
plan、budget、retrieved_docs)提升到顶层,别全塞进messages - 画边:默认静态边,只有下一步依赖模型输出时才用条件边
- 一开始就选检查点存储:没有检查点 = 没有续跑、没有中断、没有时间回溯,拒绝上线
- 默认开流式:UI 用
mode="updates",模型节点内用mode="messages"做 token 级流式
总结
LangGraph 的价值不在于"又一个智能体框架",而在于它把智能体显式建模为状态机:状态是一等公民、变更显式、检查点在每个节点后持久化。掌握了"图 + 节点 + 条件边 + 检查点"这套模型,你就能让智能体从 demo 玩具变成可审批、可恢复、可调试的生产系统——这正是 ai-engineering-from-scratch 项目想教会你的:Learn it. Build it. Ship it.
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




