先判断是否真的需要状态图

何时需要状态图

本章目标

理解 LangGraph 解决的工程问题,并明确它与普通函数、ReAct 循环和 LangChain Agent 的边界。

ReAct 不是错误,隐式控制流才是风险

把隐式循环展开

ReAct 把推理、行动和观察放入循环。简单工具 Agent 用几十行代码即可完成,不需要为了“图”而使用图。

当需求加入以下任意两三项时,手写循环会迅速承担状态机职责:

  • 条件分支和返工循环。
  • 多个外部查询并行执行。
  • 人工审批和长时间等待。
  • 进程重启后的恢复。
  • 多个专业 Worker 的职责隔离。
  • 每一步的耗时、成本与输入输出审计。

ReAct 并不天然只能串行,也不天然无状态。问题在于常见实现把状态、路由、重试和副作用都藏在一个 while 中,后续很难独立测试和恢复。

LangGraph 的三个核心构件

  • State:一次运行的共享数据契约。
  • Node:读取 State,执行纯计算或副作用,返回局部更新。
  • Edge:决定下一步,支持固定、条件、循环和并行路径。
flowchart LR
    START --> classify[意图识别]
    classify -->|业务问题| fanout[并行分发]
    classify -->|其他问题| manual[人工队列]
    fanout --> kb[知识库]
    fanout --> order[订单系统]
    kb --> proposal[方案子图]
    order --> proposal
    proposal --> approval[人工审批]
    approval -->|通过| execute[幂等执行]
    approval -->|拒绝| END
    execute -->|暂时失败| execute
    execute -->|成功或耗尽| END

适用边界

选对编排方式

场景推荐方案
两三个固定步骤、无恢复要求普通函数或 Runnable
标准工具调用 Agent先评估 LangChain create_agent
分支、循环、并行、审批和恢复并存StateGraph
核心账务事务数据库事务负责一致性,LangGraph 只负责协调

先做工作流复杂度盘点

决定引入状态图之前,先回答下面五个问题。只有“是”的数量逐渐增多,图编排的收益才会超过认知成本。

问题如果回答“是”意味着什么
是否存在两个以上业务分支需要显式路由和分支测试
是否需要暂停数分钟甚至数天需要 Checkpointer,而不是常驻协程
是否有必须等待全部完成的并行任务需要 join 语义和状态合并规则
是否会执行退款、发券、发消息等副作用需要审批点、幂等键和审计记录
是否要求进程重启后继续需要稳定 thread_id 和持久存储

一个只有“分类—回答”两步的问答接口,普通函数通常更清晰。一个包含订单查询、政策检索、人工审批、退款执行和失败转人工的流程,继续堆叠 ifwhile 和后台任务,最终也会形成一个没有名字、无法观察的状态机。

不要把业务一致性交给图

LangGraph 决定“下一步调用哪个能力”,不负责替代数据库事务。退款节点即使只被图调用一次,也可能因为网络超时出现“服务端已成功、客户端未收到响应”的不确定状态。解决办法是下游服务接受稳定幂等键,并能查询最终结果,而不是相信内存中的 attempts

本教程采用以下职责划分:

  • 图:路由、等待、恢复、重试预算和人工介入。
  • 业务数据库:审批单、退款单、唯一约束和审计事实。
  • 外部服务:在自己的事务边界内保证幂等执行。
  • API 网关:认证、租户识别、限流和请求大小控制。

本章验收

  • 为自己的一个业务流程输出状态字段表、节点与边图。
  • 为每个循环写出成功条件、失败条件和最大预算。
  • 列出全部外部副作用及其幂等键和最终一致性责任方。
  • 能解释为什么该流程值得使用状态图,而不是普通函数。

本章没有代码作业。如果无法指出哪个系统对副作用的最终一致性负责,就不应进入编码阶段。