图编排与状态机:节点、边、条件路由与循环控制
前置知识
一句话定义
图编排把控制流显式建模为有向图:State(共享状态对象)流过节点(处理函数或智能体调用),沿边(固定或条件路由)前进,在环上受递归上限与终止条件约束——它在数学上等价于一个带数据的状态机,是现代多智能体框架的主流控制抽象。
直观类比
地铁线路图 + 洪水追踪:列车(State)按轨道(边)行驶,道岔(条件路由)由信号规则决定去向,环线(循环)必须有「最多绕几圈」的规定,终点站(END)与起始站(START)明确标出。
为什么重要
把「LLM 之间怎么接力」从散落的代码 if-else 升级为显式图结构,换来四样工程能力:可视化(整张控制流一目了然)、可静态分析(能提前发现死路、孤节点)、可检查点化(每个节点边界都是保存点,直接通向 kp-018)、可复用(子图即团队,直接支持 kp-010 嵌套)。LangGraph 使其成为事实标准。
前置知识
kp-016(编排五职责——图是其代码化载体);kp-013(State 是带更新规则的黑板)。
核心概念
- State(状态对象):全图共享的结构化数据(字典/TypedDict),节点读入 State、返回更新;
- 节点(Node):处理单元——普通函数、LLM 调用或工具执行;返回对 State 的增量更新;
- 边(Edge):固定边(无条件跳转)与条件边(由路由函数根据 State 决定去向);
- START / END:入口与出口的虚拟节点;
- 循环控制:递归上限(recursion limit)、终止条件(State 中的判定字段)、出口边;
- 子图(Subgraph):图可嵌套图,对应分层团队。
原理与机制
最小实现骨架(LangGraph 风格伪代码):
from langgraph.15 21 StateGraph, START, END
52 State(dict):
75 # messages / findings / draft / retries 等字段
g = StateGraph(State)
g.add_node("planner", planner) # 主管: 产出子任务
g.add_node("worker", worker) # 工人: 执行并回写 State
g.add_node("reviewer", reviewer) # 评审: 通过则 END
g.add_edge(START, "planner")
g.add_conditional_edges("planner", route_plan,
{"dispatch": "worker", "done": "reviewer"})
g.add_conditional_edges("worker", check_result, # 条件路由
{"redo": "planner", "next": "worker", "ok": "reviewer"})
g.add_edge("reviewer", END)
app = g.compile() # 编译: 校验结构(死路/孤点)
result = app.invoke(goal, config={"recursion_limit": 25})设计纪律四条:(1) 先画后写——白板上的节点/边图就是设计文档,节点数超过 10 个考虑拆子图;(2) 条件路由函数保持纯函数——只读 State 做判定,不产生副作用,否则图不可静态分析;(3) 每个环必须有出口——出口 = 终止条件字段 + 递归上限双保险(kp-022 的预算控制落点);(4) State 更新走 reducer 约定——多来源写同一字段时的合并策略显式声明(追加、覆盖、自定义),是并发安全的静态基础(kp-019)。与经典状态机等价:节点 = 状态,边 = 转移,条件边 = 带守卫转移,State = 状态变量集——状态机的设计直觉(不可达状态检查、终态可达性)都适用于图编排审查。
图示
┌─────────┐ dispatch ┌────────┐ ok ┌──────────┐
START ────▶ │ planner │ ──────────▶ │ worker │ ────▶ │ reviewer │ ────▶ END
└─────────┘ └───┬────┘ └──────────┘
▲ ▲ done│ │redo / next
│ └─────┘ ▼
└──────────────(循环: recursion_limit=25 兜底)实例或案例
把 kp-006 的主管-工人画成图:planner 节点(主管)与 worker 节点(工人池),check_result 路由函数检查工人回执的验收字段——不合格且重试数 < 3 回 planner 附缺陷,合格进 reviewer。整张图可在框架内渲染导出,评审会议直接对图讨论。
常见误区
- 误区一:节点里塞多件事。 一个节点 = 一个可检查点的最小单元,塞多个步骤会让检查点粒度过粗(kp-018);
- 误区二:条件路由函数有副作用。 路由中顺手调工具或写库,重放与静态检查全部失效;
- 误区三:只设终止条件不设递归上限。 判定字段被写坏时,递归上限是唯一止损线(kp-020)。
与其他知识点的关系
每个节点边界是 kp-018 检查点的天然保存点;reducer 约定是 kp-019 并发写的前置;图结构本身是 kp-025 trace 树的骨架。
自测题
- 图编排的五个基本构造与各自作用?
要点:State(共享数据)、节点(处理单元)、固定边/条件边(路由)、START/END(出入口)、递归上限(循环兜底)。
- 为什么条件路由函数必须是纯函数?
要点:保证图可静态分析与可重放;副作用会破坏检查点恢复的一致性。
- 「环必须有双保险」指什么?
要点:State 终止条件 + 递归上限;前者防正常不收敛,后者防判定字段本身出错。
延伸阅读
LangGraph 官方文档的 StateGraph 与 Persistence 概念页是本知识点的直接工程参考。