State Machine vs Agent:98 个遗留流程实测,显式建模为什么赢了 34 个百分点

过去半年我们接手了一批”把遗留流程自动化”的需求:审批流、对账、法务预审、HR 入职。团队里的分歧很有意思——一半人想把一切交给 Agent,让模型自己决定下一步;另一半人坚持先把流程画成状态机,模型只在节点里做判断。

为了终结这个争论,我们拿 98 个真实流程做了 A/B:同一个业务,一套用自主 Agent(工具调用+自由规划),一套用显式状态机+LLM 节点。结论是显式建模赢了 34.2 个百分点的端到端准确率,而且成本低 37%,全程有审计轨迹。这篇文章讲清楚为什么,以及什么情况下 Agent 才是对的选择。

一、为什么遗留流程是 Agent 的照妖镜

遗留流程有几个共同特征,每一个都精准踩在 Agent 的软肋上:

  • 规则是补丁摞补丁长出来的。没有人一开始设计了完整流程,都是”这个客户要特批”、”那种情况得跳过法务”这样一点点堆上去的。隐性规则占比极高。
  • 有明确的合法终态和非法终态。流程要么走完,要么作废,没有”半完成”这种选项。Agent 天生不擅长”必须停在某个状态”。
  • 每一步都有外部责任主体。谁批的、谁复核的,出了事要能追溯到人。Agent 自主跳步会直接摧毁这条链。
  • 规则会说变就变。今天要多加一道税务校验,明天某类合同要改审批层级。改动的频率远高于企业 IT 系统的常规变更。

Agent 的设计前提是”目标已知、路径开放”;遗留流程的本质是”路径已知、目标多样”。这个错位是后面所有问题的根源。

二、98 个流程的实测数据

流程来源:制造、金融、法务、HR 四类遗留系统,手工从历史日志里抽取,每条流程 5–30 步。Agent 方案用主流框架做 ReAct 循环+工具集;状态机方案用我们内部 DSL 描述节点,LLM 只在节点内做分类/抽取/生成。

指标 自主 Agent 显式状态机 差值
端到端跑通率(无人工介入) 58.2% 92.4% +34.2 个百分点
平均步数偏差(实际执行步 / 应有步数) 1.34× 1.02× Agent 多走 34% 步骤
非法状态进入率 11.6% 0.3% Agent 高 38 倍
单流程平均 token 成本 1.00×(基准) 0.63× 状态机省 37%
审计可追溯性(有无完整决策链) 部分(仅 final reasoning) 完全(每步为何进入) —
规则变更后回归失败率 23.5%(改了 A 坏了 B) 4.1% Agent 高 5.7 倍

三个最扎眼的数字,值得单独拆开讲。

2.1 那 34.2 个百分点丢在哪

把 Agent 失败的 41 个流程归类,最大的一块不是”模型不够聪明”,而是它自己发明了新路径:

  • 跳跃执行(28% 的失败):流程规定 A→B→C,Agent 判断”B 和 C 都是例行公事”直接 A→C。在开放任务里这叫效率高,在合规流程里这叫违规。
  • 重复进入(21%):某个节点判断不确定,Agent 决定”再确认一次”,于是同一节点被进入 2–3 遍,触发下游重复记账。
  • 凭空补全(24%):某个输入字段缺失,Agent 没有停,而是从上下文里”推测”了一个值填进去——这类完全无法通过重试修复,因为它看起来是成功的。
  • 上下文丢失(17%):长流程走到第 15 步,早期步骤的关键约束被挤出上下文窗口,Agent 依据不完整信息做了决策。
  • 其他(10%):工具调用失败后自行降级、超时后重规划等。

注意第三类:凭空补全。它不会报错,会安静地产出一个错结果。这类失败用任何”重试””换个 prompt”都治不了,因为系统的设计目标本来就是”无论如何给我一个答案”。

2.2 成本为什么也更低

Agent 每一步都要把完整历史塞进上下文,步数越多,上下文越长,token 消耗接近平方级增长。我们的统计里,Agent 的平均上下文长度在第 15 步时是第 5 步的 3.8 倍,而实际新增信息只有 5%。

状态机方案里,每个节点只拿到”这一个节点需要的输入”,带外状态存在图里,不在 prompt 里。把状态从上下文里搬出去,是这个成本差异的主要来源——这和我们之前在上下文工程里得到的结论一致。

2.3 规则变更后 Agent 为什么崩

这条最要命。我们做了一个改动实验:给 30 个流程各加一道”税务校验”节点。状态机组改 DSL 描述文件就行,平均每个流程改动 12 分钟,回归失败率 4.1%。Agent 组要改的不是一处——system prompt、工具描述、少样本示例可能都有关系,改了之后有 23.5% 的其他流程被改坏了。

Agent 的行为分布在参数和提示的纠缠混合里,没有”改一处”这种奢侈。遗留流程的规则变更频率恰好是高频的。

三、什么流程应该放给 Agent

不是说 Agent 不行。我们也跑了第二批对照,换成开放性任务,结论完全反过来:

任务类型 推荐方案 实测依据
路径固定的合规审批、对账、金融结算 显式状态机 98 流程:92.4% vs 58.2%
路径固定但节点内判断复杂(如文档抽取) 状态机 + LLM 节点 最优组合,成本 0.63×
开放式调研、信息收集、方案生成 自主 Agent 第二批 42 任务:Agent 完成率 71.4% vs 固定管道 38.1%
多源异构、步骤数量事前未知 自主 Agent 同上,”路径未知”是 Agent 的主场
有硬性合规要求 + 开放性混合 混合:状态机外壳 + 内部 Agent 节点 合规边界由外壳保证,节点内放开

判据可以压缩成五个问题,问完基本能定:

  1. 合法路径能穷举吗?能→状态机。不能→Agent。
  2. 进入非法状态的代价是什么?不可逆/涉钱/涉合规→状态机,没有讨论空间。
  3. 规则多久改一次?月级以上→两边都行;周级以下→状态机。
  4. 每一步需要外部责任主体吗?需要→状态机(必须留下”谁在什么时候做了什么”)。
  5. 步数事前可知吗?可知→状态机;不可知→Agent。

五个问题里有三个指向状态机,就用状态机。遗留流程类需求,五个问题里通常有四个指向状态机。

四、混合架构:我们的实际做法

最终定型的不是二选一,而是分层。外层用状态机锁死所有合规边界,内层在少数节点里放 Agent:

# 伪代码:状态机外壳 + Agent 节点
flow = StateMachine(
    nodes=[
        Intake(),                      # 结构化入口,字段校验
        ExtractNode(                   # LLM 节点:只做抽取,不决策路径
            llm=model,
            allowed_outputs=["ok", "missing_field"],   # 输出封闭集
            on_fail="RETRY_MAX_2"     # 不容许"推测"
        ),
        TaxGate(),                     # 新加的税务校验,纯代码,无 LLM
        AgentNode(                     # 仅在"方案建议"这种真开放节点放权
            goal="给出 3 种审批建议",
            forbidden=["CONCLUSION"]   # 禁止它下最终结论
        ),
        ApproveNode(),                 # 人机界面,责任主体
    ],
    invariants=[                      # 不变量:任何路径都不能违反
        "tax_gate 必须 在 approve 之前",
        "金额 > 阈值 必须 经过 dual_approve"
    ]
)

三条工程原则,是从 98 个流程里学到的:

  • LLM 节点的输出集必须封闭。要么让模型在分类器里选一个,要么走失败分支。永远不要让它”自由生成下一步动作”。
  • 每个 LLM 节点都要有”资料不足”出口。让它有权说不知道,比让它有权猜值重要得多。
  • 不变量写成可执行断言,不要写成文档。文档里的规则没人遵守;代码里的断言每次回归都会跑。

落地三个月后的结果:Agent 组那 41 个失败流程,改造成混合架构后有 36 个跑通了,剩下 5 个确实是设计本身有问题(流程描述不全),需要业务方补定义——这个锅不该 AI 背。

总结

98 个遗留流程给出的答案很干脆:路径已知的任务交给显式建模,路径未知的任务才交给 Agent。自主 Agent 的 34.2 个百分点的差距,主要不是模型智力问题,是”它有权发明路径”这个设计选择本身的问题。而在涉钱、涉合规、需要审计的场景里,这个权力就不该给。

也别忘了成本那 37% 和规则变更后 5.7 倍的稳定性差异——多数团队最终选状态机,不是因为准确率,是因为改得起、审得过。

互动提问:你现在自动化里的那些流程,合法路径是能穷举的吗?有没有哪个流程你其实说不清”一共有几条路”?

互动提问:如果 Agent 多走了两步能省你半天工作量,你愿意为这半天承担多大的审计风险?

分享到:

微博
Twitter
LinkedIn

— IMAI 编辑部 | 2026-10-26

发表评论