UndoBench:把"任务能力"和"恢复能力"从工具调用 Agent 评测中拆开

  • 关联论文:2610.05622
  • 作者:flyP
  • 更新:2026-10-07

一句话结论

现在的 Agent 评测普遍只看"任务完成率",把"规划能力"和"故障恢复能力"混在一起计分——UndoBench 用反事实配对试验(同一随机种子下,完整工作流 vs 中途插入故障)把两者拆开,并在冻结的"丢确认(lost-acknowledgment)"场景中测出:标称任务完成率 83.54%,而条件恢复成功率(CRSR)只有 46.72%;naive retry 在 53.33% 的试验中产生了重复外部副作用——结论是:仅看任务完成率会系统性高估 Agent 在真实生产环境中的安全性。

解决的真问题

使用工具的 AI Agent 正在大规模进入企业系统——写邮件、改数据库、调 API、点 UI 操作。但主流 Agent 基准(SWE-bench、ToolBench、WebArena 等)几乎都只评估一件事:任务最终完成了吗? 这掩盖了一个关键事实:在企业场景里,Agent 很少一帆风顺。网络超时、API 限流、用户中途改主意、并发冲突、状态污染、丢消息——这些才是常态。"能完成任务的 Agent"和"出错后能恢复的 Agent"是两件不同的事,不能合并打分。

UndoBench 要回答的问题非常尖锐:当 Agent 在执行工具调用中途遭遇故障时,它的恢复行为是否安全、可审计、可逆? 论文把"恢复"做成一等公民,与"规划"并列评分。

核心方法

UndoBench 的设计由 4 个组件构成。

组件 1:覆盖 8 个企业域的 36+36 工作流

基准包含 36 个基础工作流(base workflow)——典型企业任务,如"在 CRM 里更新客户邮箱并发送确认邮件"——以及与之配对的 36 个故障场景(fault scenario),每个故障场景在基础工作流的中途注入一个外部扰动(网络中断、并发写、消息丢失、状态污染等)。覆盖 8 个企业域(SaaS 控制台、数据库、邮件、文件共享、API 网关、审批流、计费、工单——其中部分域名在原文未明确列出)。

每个工作流都被写成一个"线级 effect-history + 环境状态 oracle"的执行轨迹:每一次工具调用的入参、出参、外部副作用(数据库行变更、邮件已发送、文件已写)都被完整记录,作为评分与反事实重放的依据。

组件 2:反事实配对试验(counterfactual paired trials)

这是 UndoBench 的方法学核心。在同一个工作流、同一随机种子下:

  1. A 组(基线):Agent 从头跑完基础工作流,无故障。记录 nominal completion。
  2. B 组(故障):Agent 在执行到第 k 步时,环境被注入一个故障。记录任务是否最终完成、过程中产生了哪些额外副作用、CRSR 是否达成。

因为 A、B 用同一 seed,差异可以归因于"故障处理"而非"任务本身的难度"。这是把"规划能力"和"恢复能力"解耦的统计基础。

伪代码:

def evaluate(workflow, agent, fault=None):
    seed = random.fixed_seed()
    set_seed(seed)
    traj_baseline = run(workflow, agent)
    set_seed(seed)                     # 关键:相同种子
    traj_fault = run(workflow, agent, inject=fault)
    nominal = traj_baseline.completed
    recovery = traj_fault.no_duplicate_effects() and traj_fault.final_state_consistent()
    crsr = recovery / nominal           # 条件恢复成功率
    return nominal, crsr, side_effects_diff(traj_baseline, traj_fault)

组件 3:三种恢复范式 + 多种执行边界

论文在 12 个 held-out TEST 工作流上,对 2 个开源权重模型 × 2 个 Agent 框架 × 3 种恢复范式(naive retry、per-call idempotency、zero-privilege journaling)做了 5,760 次执行 / 2,880 次配对试验,并扩展到商业 API 模型复现。

同时,论文把"故障发生时刻"分成 3 个执行边界(execution boundary)来分别评估:

边界 含义 观察到的模式
Before mutation(变更前) 故障在 Agent 真正产生副作用之前就发生 在"有能力的试验"中,各方法表现接近,且不产生重复副作用
During partial mutation(部分变更中) 故障在 Agent 已经写了一部分、但还没全部完成时发生 naive retry、per-call idempotency、zero-privilege journaling 在评估的复合工作流上集体失效
After commit but before acknowledgment(已提交但未确认) Agent 的工具调用已经返回 200,但上游确认(网络 ack / 业务回执)丢失 verification + 服务端 idempotency 大幅提升安全性

组件 4:多种度量

  • 名义完成率(nominal competence):无故障下任务完成的比例。
  • CRSR(条件恢复成功率, Conditional Recovery Success Rate):在名义能完成的子集里,故障组也能安全完成的比例。
  • 重复外部副作用率:故障组产生了基线轨迹中不存在的额外副作用(如多发一封邮件、多扣一次款)的比例。
  • 副作用审计距离:与 oracle 记录的"应发生副作用集合"的偏差。

关键实验与数据

来自 arXiv 摘要的明确数字:

指标 数值 含义
基础工作流数 36 跨 8 个企业域
故障场景数 36 与基础工作流一一配对
Held-out TEST 工作流数 12 用于最终评测
模型数 2 个开源权重 + 商业 API 扩展 2 框架 × 3 恢复范式
总执行次数 5,760
配对试验数 2,880 每个 trial 含 baseline + fault 两次执行
名义完成率(nominal competence) 83.54% 无故障下任务完成的比例
条件恢复成功率(CRSR) 46.72% 故障下能安全完成的比例
Naive retry 重复外部副作用率 53.33% 一半多的试验多做了事

补充结论(摘要明示):在 before-mutation 阶段方法间差异不显著;在 partial mutation 阶段 naive retry / per-call idempotency / zero-privilege journaling 集体失效;在 after-commit-before-ack 阶段 verification + 服务端 idempotency 显著改善安全性。

未在摘要中明确给出的细节(标注:原文未明确): - 2 个开源权重模型的具体名称与版本 - 2 个 Agent 框架的具体名称 - 商业 API 模型扩展的完整对照表 - 各方法在 3 个执行边界上的逐方法成功率表格 - 论文版本 v1(2026-10-04),尚无引用与同行评审数据

亮点与局限

亮点

  1. 反事实配对是真正的统计创新。传统 benchmark 跑出 baseline 是 80%、故障场景是 60%,你无法判断 60% 是"任务本来就难"还是"恢复失败"。UndoBench 用同 seed 把这两个混淆变量拆开。
  2. CRSR 是救命的新指标。它专门回答"在你能完成的事里,出错时你真能恢复吗",这正是企业上线 Agent 的真正风险点。
  3. 执行边界分类贴近真实故障模型。before / during / after-ack 三阶段对应不同的可恢复性,工程上能直接拿来设计回滚策略。
  4. 公开代码与基准:GitHub 仓库 tradertanmay/undobench(摘要明示),可复现。
  5. 同时评估了商业 API 模型,不局限于开源权重,结论可信度更高。

局限

  1. 企业域覆盖虽然广,但具体域构成在摘要中未列,读者需查正文。
  2. 5,760 次执行虽不少,但分散到 2 模型 × 2 框架 × 3 范式 × 3 边界 × 12 工作流,每个单元的样本量并不大,统计显著性需谨慎。
  3. 故障注入是脚本化的合成场景,与真实生产中"用户突然改字段""DBA 同时 ALTER TABLE"等对抗性、并发性故障仍有差距。
  4. 评测主要集中在"丢确认"这一冻结故障类型,论文承诺"扩展到更多故障类型",但本次 v1 仅覆盖该类。
  5. 未明确给出运行时长、成本(API 花费)、恢复动作的延迟分布——这些对生产决策同样关键。

对工程落地的启发

  1. CRSR 应成为 Agent 上线门禁。一个 CRSR < 70% 的 Agent 不应该被允许在生产侧对真实用户/真实数据执行工具调用,即使它的任务完成率看起来很高。
  2. 执行边界决定恢复策略。论文明示:before mutation 阶段所有方法都还能撑;during partial mutation 阶段所有 naive 方法都崩;after-ack 阶段 verification + idempotency 是关键。这给工程上的"在哪一层加重试/补偿/幂等"提供了明确分层。
  3. 重试不是恢复。53.33% 的 naive retry 产生重复副作用,提示"失败就重试"在企业 Agent 场景是反模式。必须先判"是否有副作用已发生",再决定重试/补偿/放弃。
  4. 对幂等键的需求是结构性的。论文给出 per-call idempotency 与服务端 idempotency 的对比,提示 Agent 调用栈应支持稳定幂等键的传递与端侧去重。
  5. 审计 trace 必须含 effect-history。UndoBench 的 oracle 本质是"对每个工具调用预期副作用的清单",Agent 框架应把这种 oracle 作为开发期 SDK 暴露出来,便于回归测试。
  6. 服务端 idempotency 比客户端聪明更值得投资。在 after-ack 阶段 verification + 服务端 idempotency 显著改善,意味着把恢复责任放给服务比放给 Agent 更可靠。

与同方向工作的关系

  • 上承:SWE-bench、ToolBench、WebArena、AgentBench 等任务完成类基准;以及 idempotency key、exactly-once semantics 等分布式系统经典问题。
  • 平行:τ-bench、Tool-Error-Injection-Bench 等开始关注 Agent 错误注入的工作;但大多止步于"成功率下降多少",未像本论文那样把恢复行为做正交评分。
  • 下启:可能催生 CRSR 作为 Agent benchmark 的标配二级指标;可能推动 Agent 框架把"执行边界感知"做成一等 API。
  • 互补:与 runtime guardrails(Nemo Guardrails、LangChain Guardrails)、transactional tool execution、effect-reversible sandbox 等工程方案互为补集——UndoBench 提供度量,这些方案提供机制。

适合谁读

  • 企业内 Agent 平台 / AgentOps 工程师:把 CRSR 纳入上线标准,把执行边界建模为运行时状态机。
  • 平台架构师:评估是否在内部 API 网关层加 idempotency key 与服务端去重。
  • Agent 框架作者:把 effect-history oracle、execution boundary detection 作为可插拔组件。
  • AI 安全 / 红队:用 UndoBench 的 36 个故障场景作为对抗性评测集,系统化压测自己或第三方的 Agent。
  • 学术研究者:把反事实配对 + CRSR 范式迁移到其它领域(代码 Agent、浏览器 Agent、机器人 Agent)。

工程视角的 6 个具体坑点(三段式)

# 现象 影响 修复
1 把"任务完成率"作为唯一 Agent 质量指标 CRSR 可能仅 40–50%,上线后故障率系统性低估 引入 CRSR 作为第二指标,门禁 CRSR<70% 不允许接触生产数据
2 失败就 naive retry,无副作用检测 53.33% 试验产生重复外部影响(多发邮件/多扣款) 调用前查 effect-history oracle;已发生副作用的步骤必须走补偿通道,不能直接重试
3 在 Agent 层做 idempotency,服务侧无幂等键 同一调用在不同重试实例下被各跑一次 服务端强制 idempotency-key 透传 + 持久化去重表
4 不区分 before/during/after-ack 三阶段,所有失败一律重试 during partial mutation 阶段所有 naive 方法集体失效 引入执行边界状态机:after-ack 阶段优先 verification,before 阶段允许重试,during 阶段强制补偿
5 工具调用 trace 只记入参出参,不记外部副作用 故障排查时无法定位"哪一步多扣了用户余额" SDK 强制让每个工具声明 effect-set(数据库行、邮件、外部 API 调用),trace 默认持久化
6 Agent 框架不暴露 effect-history oracle 回归测试只能黑盒对比最终状态,漏掉中间重复副作用 框架集成 UndoBench 风格 oracle,CI 自动跑反事实配对

写作依据:arXiv 2610.05622 公开摘要 + 论文卡 TLDR/TLDR 中文 + GitHub 仓库 github.com/tradertanmay/undobench(摘要中明确给出,作为代码可获得性证据)。模型/框架具体名称、逐方法成功率表格在摘要未列,按"原文未明确"标注。论文版本 v1(2026-10-04),尚无被引与同行评审数据。