第38回 单智能体现代实例——状态机工作流与可验证执行

做事先立规矩,规矩写成路标图。
遇到岔路不慌张,回滚重试皆有书。

第36回讲规划与自省,第37回讲长期记忆。
现在要把两者落地成“能跑的系统”:
工作流(workflow)

工作流不是花哨名词,而是工程化的“收口”:

  • 计划写成结构(节点与边)
  • 每一步都有输入输出格式
  • 失败有回滚与重试
  • 关键节点有验证与审计

近年的综述把“Agent Workflow”视为智能体走向规模化与可控化的中心设施。1
而 FlowBench 等基准也指出:工作流知识缺失会导致规划幻觉与失败。2

这一回我们把“状态机”讲清:
它是把工作流做稳的最朴素、也最可靠的骨架。


一、为什么是状态机:因为自然语言不够“可执行”

一段口头计划通常像这样:

  1. 先查资料
  2. 再总结
  3. 最后输出

看着合理,但执行时会冒出一堆问题:

  • 查资料失败怎么办?重试几次?换源吗?
  • 总结结果如何验证?
  • 输出格式不合格怎么办?

状态机的价值是把这些“暗规则”显式化:

  • 状态(State):当前在哪一步
  • 转移(Transition):满足什么条件就跳到哪一步
  • 终止(Terminal):什么时候算完成或失败

它像一张流程图,但比流程图更“硬”:
每个状态都可以挂上检查与日志。


二、可验证执行:别让错误在流程里滚雪球

智能体工作流最怕“错误传播”:

  • 第一步错一点,第二步基于错的结果继续,越走越远

因此近年的系统工作开始强调“选择性验证”:
不是每一步都重验(太贵),而是找出高风险节点重点验,并尽量不拖慢总延迟。
例如 Sherlock 提出对工作流节点做错误倾向分析,并在必要节点挂上验证器,运行时还可做推测执行以降低延迟影响。3

对看官而言,你先记住工程直觉就够:

  • 验证像抽检,不必处处验,但关键点必须验
  • 审计像账本,每一步要能追溯输入、输出与依据

三、极简可跑代码:一个小状态机(重试 + 回滚 + 验证)

下面代码演示一个最小“工作流状态机”:

  • 状态:RETRIEVE → DRAFT → VERIFY → DONE / FAIL
  • 重试:检索失败最多重试 2 次
  • 验证:要求草稿里必须包含“引用:”字样(玩具规则)
class Workflow:
    def __init__(self):
        self.state = "RETRIEVE"
        self.retries = 0
        self.max_retries = 2
        self.ctx = {}
        self.log = []

    def record(self, event):
        self.log.append((self.state, event))

    def retrieve(self):
        self.record("retrieve()")
        if self.retries < 1:
            self.retries += 1
            return None
        return "证据A;证据B"

    def draft(self, evidence):
        self.record("draft()")
        return f"答案:……\n引用: {evidence}"

    def verify(self, draft):
        self.record("verify()")
        return "引用:" in draft

    def run(self):
        while True:
            if self.state == "RETRIEVE":
                ev = self.retrieve()
                if ev is None:
                    if self.retries > self.max_retries:
                        self.state = "FAIL"
                    else:
                        self.state = "RETRIEVE"
                else:
                    self.ctx["evidence"] = ev
                    self.state = "DRAFT"

            elif self.state == "DRAFT":
                draft = self.draft(self.ctx["evidence"])
                self.ctx["draft"] = draft
                self.state = "VERIFY"

            elif self.state == "VERIFY":
                ok = self.verify(self.ctx["draft"])
                if ok:
                    self.state = "DONE"
                else:
                    self.record("rollback_to_draft")
                    self.state = "DRAFT"

            elif self.state == "DONE":
                self.record("done")
                return True, self.ctx, self.log

            elif self.state == "FAIL":
                self.record("fail")
                return False, self.ctx, self.log


if __name__ == "__main__":
    wf = Workflow()
    ok, ctx, log = wf.run()
    print("ok=", ok)
    print("draft=\n", ctx.get("draft"))
    print("log=", log)

这段玩具代码展示了三个生产级关键点:

  • 结构化控制流:状态明确,分支明确
  • 可恢复性:失败能重试,验证失败能回滚
  • 可审计:log 记录了每一步做了什么

真实系统当然会把“retrieve/draft/verify”替换成模型调用与工具调用,
把“引用:”这种玩具验证替换成更严的约束与评测。
但骨架就是这个骨架。


四、小结:状态机让智能体从“会说”走向“会办”

状态机不是束缚,而是护栏。
它把“规划、自省、记忆、验证”统一到一个可控框架里。

下一回(第39回)我们把“单人办案”升级为“多人办案”:
多智能体协作——分工、辩论、协调算法与通信拓扑。

欲知后事如何,且听下回分解。


幻觉核查

  • Agent Workflow 作为核心设施的论述:可核对综述对工作流定义、价值与挑战的归纳。1
  • FlowBench 对“工作流引导规划”的评测与结论:可核对论文摘要与实验章节。2
  • Sherlock 的“选择性验证 + 推测执行”思路:可核对论文摘要与方法概述。3
  • 本回代码仅为状态机骨架演示,不代表安全的生产实现(缺少权限、超时、隔离、机密治理等)。

逻辑审计

  • 与第37回衔接:长期记忆提供“该记住的规则”,状态机把规则固定为流程;记忆与流程合体才能稳定复用。
  • 与导读一致:导读强调“可验证执行”,本回把验证变成工作流节点,且记录审计日志。
  • 为第39回铺路:单智能体已能按流程走,多智能体则需要通信协议与协调机制,才能不互相拖累。

引用与溯源

Footnotes

  1. Yu, C. A Survey on Agent Workflow — Status and Future arXiv:2508.01186 (2025-08) https://arxiv.org/abs/2508.01186 2

  2. Xiao, R., et al. FlowBench: Revisiting and Benchmarking Workflow-Guided Planning for LLM-based Agents arXiv:2406.14884 (2024-06-21) https://arxiv.org/abs/2406.14884 2

  3. Ro, Y., et al. Sherlock: Reliable and Efficient Agentic Workflow Execution arXiv:2511.00330 (2025-11-01) https://arxiv.org/abs/2511.00330 2