kp-017 核心 30 分钟 编排与状态

图编排与状态机:节点、边、条件路由与循环控制

#图编排 #状态机 #LangGraph #条件路由

前置知识

一句话定义

图编排把控制流显式建模为有向图: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 树的骨架。

自测题

  1. 图编排的五个基本构造与各自作用?

要点:State(共享数据)、节点(处理单元)、固定边/条件边(路由)、START/END(出入口)、递归上限(循环兜底)。

  1. 为什么条件路由函数必须是纯函数?

要点:保证图可静态分析与可重放;副作用会破坏检查点恢复的一致性。

  1. 「环必须有双保险」指什么?

要点:State 终止条件 + 递归上限;前者防正常不收敛,后者防判定字段本身出错。

延伸阅读

LangGraph 官方文档的 StateGraph 与 Persistence 概念页是本知识点的直接工程参考。

相关知识点

学习状态:
未学