AI Agent 状态机设计指南:把 Run 生命周期做成可控系统

HTMLPAGE 团队
14 分钟阅读

Agent 不该只是聊天记录的堆叠,而应该是可转移、可回滚、可观测的状态机。本文讲清 Run 生命周期设计、状态边界、失败恢复与验收指标,帮助你把 Agent 从 Demo 变成系统。

#AI Agent #状态机 #Run 生命周期 #工程化 #Orchestrator

很多 Agent 项目最初都没有状态机。

它们通常只有一条隐含逻辑:

用户发来请求,模型想一想,调用几个工具,再输出结果。

问题在于,这种流程一旦进入真实场景,就会出现大量无法回答的问题:

  • 现在到底是在规划、执行,还是重试?
  • 工具超时后应该回到哪一步?
  • 哪些状态允许写操作,哪些只能读?
  • 如果用户中途改目标,要不要沿用旧上下文?

没有状态机,这些问题全会堆到 Prompt 上,最后 Prompt 越写越大,系统却越来越不可控。

建议先配合阅读 AI Agent 必考知识点拆解多 Agent 协作架构AI Agent 可观测性设计AI Agent 并发与可靠性

一、为什么 Agent 必须有显式状态

状态机的价值,不是让系统更复杂,而是让边界更明确。

一个没有状态机的 Agent,通常会出现三种典型问题:

  1. 错误恢复依赖模型临场发挥
  2. 失败 run 无法稳定回放
  3. 新增策略时不知道应该插在哪一层

而有状态机的系统,至少可以回答:

  • 当前处在哪个阶段
  • 下一步允许做什么
  • 失败后能回到哪里

二、一个最小可运行的 Agent 状态机

状态主要职责允许动作不该做什么
RECEIVED接收输入与初始化上下文校验输入、生成 run id直接调用工具
BUILD_CONTEXT组装上下文与证据召回、摘要、裁剪输出最终答案
PLAN生成任务计划拆解步骤、选择策略直接执行写操作
EXECUTE执行工具或子任务调工具、等待结果越过策略校验
VALIDATE校验输出是否合规schema 校验、policy 校验偷偷吞掉异常
RESPOND生成用户可见结果汇总、解释、降级修改核心状态
DONE/FAILED收尾与记录打点、回放、归档再次进入执行态

这套最小状态机已经足够支撑大多数单 Agent 任务型系统。

三、典型失败案例:没有 stop condition,系统进入循环

某个报销 Agent 的逻辑是:

  1. 先提取票据信息
  2. 再查预算余额
  3. 最后写入审批系统

线上事故出现时,Agent 在预算接口返回空值后,不断回到“重新规划”,然后又再次尝试查询预算,最终在 30 秒后超时。

根因有三个:

  • 没有给 PLAN -> EXECUTE 增加最大轮次
  • 工具空结果没有被视为显式失败态
  • 状态流里没有“升级人工”分支

修复后,状态机变成:

PLAN -> EXECUTE_BUDGET -> EMPTY_RESULT -> VALIDATE -> ESCALATE_HUMAN

这样系统虽然不能自动完成任务,但至少不会循环烧预算。

四、状态机和权限应该一起设计

很多团队会先做状态机,再补权限。但更稳的做法是一起做。

例如:

  • PLAN 允许生成 proposal,不允许写操作
  • EXECUTE 可以调用读工具,但写工具必须在 VALIDATE 通过后再进入
  • FAILED 态不能偷偷重入写操作

一旦把权限和状态分开设计,系统很容易出现“逻辑上不该执行,但技术上能执行”的漏洞。

五、状态迁移必须可观测

每次状态转移至少记录:

  • from_state
  • to_state
  • transition_reason
  • latency_ms
  • 关键输入摘要
  • 关键输出摘要

只有这样,你才能对一次失败 run 做真正有意义的回放。

六、验收状态机设计是否合格的 5 个问题

  1. 工具失败后能明确落到哪一个失败态吗?
  2. 写操作是否只在允许状态出现?
  3. 同样输入重复运行,状态迁移是否稳定?
  4. 每次状态转移都有 trace 可追踪吗?
  5. 超预算、超时、空结果是否都有明确收口路径?

七、AI Agent 状态机设计清单

  • 定义最小状态集合,不把状态和策略混在一起
  • 为每个状态写清允许动作和禁止动作
  • 对失败路径单独建模,不靠 Prompt 临场补救
  • 为关键状态迁移打 trace
  • 给循环、空结果、超时设计硬收口条件

延伸阅读