Skip to content

Apple Reinforced Agent — 在 Tool Call 执行前拦截错误

核心思路:在 AI Agent 的 Tool Call 实际执行之前插入一个 Reviewer Agent,拦截并修正错误。不是事后恢复,而是事前拦截。实测推理模型作为 Reviewer 达到 3:1 收益风险比(修正 3 个错误,仅引入 1 个新错误)。

目录


问题:State Recovery 困境

传统 Agent 的致命缺陷

Agent 执行 Tool Call → 结果返回上下文 → 发现错了
                                    ↓
                        已经执行了,无法撤回
                        发了邮件?删了文件?转了账?
                                    ↓
                        需要 State Recovery(状态恢复)
                        多轮场景下成本指数级增长

核心问题

维度 说明
发现时机 错误通常在执行之后才被发现
恢复成本 不可逆操作(发邮件、转账、删文件)根本无法恢复
多轮复杂度 替代轨迹指数级增长,上下文成本爆炸
当前评估 事后(post-hoc)评估,与执行循环脱节

两种解决路径

路径 A:Anthropic(上下文管理)
  假设:Tool Call 失败是因为 LLM 处理的信息太多
  方案:减少上下文(Tool Search + Programmatic Calling)
  效果:更小的上下文 → 更低成本 → 更少歧义

路径 B:Apple Reinforced Agent(推理时反馈)
  假设:Agent 的第一次尝试经常出错
  方案:在执行前插入 Reviewer 拦截错误
  效果:事前修正 → 避免不可逆后果

✅ 两条路径不冲突,可以组合使用

架构:双 Agent 协作

传统 vs Reinforced Agent

传统 Agent Loop:
┌──────────┐     ┌──────────┐     ┌──────────┐
│ 用户请求  │ ──→ │ Agent    │ ──→ │ 执行工具  │ ──→ 返回结果
└──────────┘     │ 生成调用  │     │ (可能出错)│
                 └──────────┘     └──────────┘
                                        ↓
                                   发现错误,太晚了

Reinforced Agent Loop:
┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐
│ 用户请求  │ ──→ │ Agent    │ ──→ │ Reviewer │ ──→ │ 执行工具  │
└──────────┘     │ 生成调用  │     │ 拦截检查  │     └──────────┘
                 └──────────┘     └──────────┘
                      ↑                 │
                      └── 拒绝 ←────────┘
                      (重新生成调用)

实例:天气查询

用户:"纽约的天气是多少摄氏度?"

Step 1: Agent 生成 Tool Call
  → get_weather(city="New York", unit="fahrenheit")

Step 2: Reviewer 拦截检查
  → ❌ 拒绝:"用户要求摄氏度,参数错误"

Step 3: Agent 重新生成
  → get_weather(city="New York", unit="celsius")

Step 4: Reviewer 再次检查
  → ✅ 通过,执行 Tool Call

关键设计原则

原则 说明
关注点分离 执行 Agent 和 Reviewer Agent 独立
无需重训练 基础 Agent 不需要任何修改
模型可替换 Reviewer 可以用不同于基础 Agent 的模型
Reviewer 不编辑 只通过反馈让基础 Agent 自己修正

三种协作模式

模式对比

模式 标记 流程 Token 消耗 适用场景
Progressive Feedback rN 生成 → 审查 → 反馈 → 重新生成 → 循环 最高(逐轮) 一般场景
Best-of-N Selection sN 生成 N 个候选 → 选一个最好的 中等 候选差异大
Best-of-N Grading gN 生成 N 个候选 → 评分 → 阈值过滤 中等 需要量化标准

Progressive Feedback(渐进反馈)

Agent 生成调用 → Reviewer 审查
                    │
              ┌─────┴─────┐
              │ 拒绝       │ 通过
              ▼            ▼
         反馈给 Agent   执行调用
              │
              ▼
         Agent 重新生成
              │
              ▼
         Reviewer 再次审查
              │
         (循环直到通过或达到 N 轮上限)
  • 最直接的版本
  • Token 消耗最大(每轮都消耗)
  • 实验中表现最好

Best-of-N Selection(N 选一)

Agent 生成 N 个候选(不同 temperature)
              │
              ▼
Reviewer 评估所有候选
              │
              ▼
         选出最好的一个 → 执行

Best-of-N Grading(N 个评分)

Agent 生成 N 个候选
              │
              ▼
Reviewer 对每个打分 (0.0 - 1.0) + 给出理由
              │
              ▼
         最高分 > 阈值 → 执行
         最高分 < 阈值 → 不执行

命名规范

4o-r2-5-mini-v3-gepa

 4o       = 基础模型 GPT-4o
 r2       = Progressive Feedback, 最多 2 轮
 5-mini   = Reviewer 模型 GPT-5 mini
 v3       = Prompt 版本
 gepa     = 使用 GEPA 自动优化 prompt

评估指标:Helpfulness vs Harmfulness

为什么需要新指标

传统评估只看准确率,但 Reviewer 有副作用——它可能把正确的改错

指标定义

指标 定义 公式
Helpfulness 基础 Agent 错了 + Reviewer 修正了 修正的错误数 / 基础 Agent 总错误数
Harmfulness 基础 Agent 对了 + Reviewer 改错了 引入的新错误数 / 基础 Agent 原本正确的总数
Benefit-to-Risk Ratio 净收益 Helpfulness ÷ Harmfulness

直觉理解

Helpfulness = "救了多少次"
Harmfulness = "帮了多少倒忙"
Ratio 3:1   = "每救 3 次,帮 1 次倒忙"

实验结果

BFCL(单轮,无状态)

配置 相关性 无关检测 Helpfulness Harmfulness 比率
GPT-4o 基线 90.9% 84.9%
GPT-4o Reviewer (v1) 91.4% 89.6% 30.2% 14.2% 2.1:1
GPT-4o Reviewer (v2) 91.0% 90.4% 34.9% 12.9% 2.7:1
o3-mini Reviewer (v2) 91.8% 91.0% 36.8% 11.7% 3.1:1
o3-mini + GEPA (v3) 92.5% 90.4%

最佳提升:无关检测 +5.5%(84.9% → 90.4%)

τ²-Bench(多轮,有状态)

配置 航空 零售 电信 平均
GPT-4o 基线 42.0% 62.9% 41.2% 48.7%
Progressive Feedback (r5-4o-v1) 40.7% 62.6% 64.0% 55.8%
Best-of-N Selection (s5-v2) 48.0% 61.4% 48.2% 52.5%
Best-of-N Grading (g5-v2) 46.7% 65.8% 48.8% 53.8%

最佳提升:平均 +7.1%(48.7% → 55.8%)

错误类型分析

错误类型 基线 有 Reviewer 改善
违反策略约束 31% 18% -13%
缺乏上下文感知 24% 15% -9%
工具选择错误 改善明显

关键发现

1. 过度怀疑是主要失败模式

Reviewer 会错误地标记正确的 Tool Call 为"不完整"(因为它期望看到执行结果,但审查发生在执行之前)。

解决方案:在 Prompt 中加入关键指导:

[CRITICAL] Tool-only responses are complete. Do not mark tool-only responses
as incomplete for lacking user-facing answers, follow-up explanations, or
final results. Tool calls are standalone steps. Focus on whether the actual
tool calls are correct.

效果:冗余审查循环从 23% 降至 8%

2. 推理模型 > 标准 LLM 作为 Reviewer

Reviewer 模型 Benefit-to-Risk 说明
o3-mini 3.1:1 推理模型,最低 harmfulness
GPT-4o (v2) 2.7:1 标准 LLM
GPT-4o (v1) 2.1:1 标准 LLM,初版 prompt

推理模型的 false positive 更低(不会把正确的改错)

3. Progressive Feedback > Best-of-N

  • 无关检测高出 4-5%
  • 多轮场景平均高出 3-8%
  • Selection 在某些领域甚至低于基线

4. 跨域泛化需要适配

在 BFCL 上优化过的 prompt 直接用在 τ²-Bench 上会引入错误。单轮函数调用和多轮有状态 Agent 存在领域差异。

5. 重要局限:基线模型

论文中所有实验的基线 Agent 都是 GPT-4(非推理模型)。如果用推理模型作为基线,它可能从一开始就不会犯 Reviewer 所修正的那类错误。论文在 limitations 部分提到了这点,但低估了其影响


成本分析

延迟开销

场景 延迟倍数 说明
单轮高频应用 6.2x 每个 Tool Call 多一次 LLM 往返
多轮 Agent 2.4x 审查成本分摊到多轮中

Token 成本

每个 Tool Call = 2 次 LLM 调用(Agent + Reviewer)
Agent 密集型场景(每 session 多次调用)→ 成本显著增加

三重成本

成本类型 说明 影响程度
延迟 每个 Tool Call 多一轮 LLM 往返 对聊天/语音 Agent 致命
Token 双倍 LLM 调用 高频场景累积大
Harmfulness 3:1 比率意味着仍有 1/4 概率改错 高风险操作仍需谨慎

适用场景与局限

✅ 最佳适用场景

场景 原因
发送邮件 不可撤回
执行支付 资金损失
删除文件 数据丢失
写入生产数据库 数据完整性
任何无法干净回滚的操作 状态不可逆

✅ 适合组合使用的场景

延迟加载工具(Anthropic Tool Search)
  + 批量调用打包进沙盒 Python 脚本(Programmatic Calling)
  + Reviewer 在执行前检查调用(Apple Reinforced Agent)

❌ 不适合的场景

场景 原因
实时聊天机器人 6.2x 延迟不可接受
语音 Agent 延迟敏感
高频后台 Agent LLM 调用成本累积
基础模型已经很强 收益递减
沙盒代码执行 Reviewer 看不到执行结果

Reviewer 的检测边界

能检测:
  ✅ 工具选择错误
  ✅ 参数值明显错误
  ✅ 不应该调用工具(scope recognition)

不能检测:
  ❌ 微妙的参数错误
  ❌ 超出 Reviewer 上下文/训练数据的问题
  ❌ 需要执行结果才能发现的错误

vs 其他方案

方案 优势 劣势
Reviewer Gate 无需训练数据,推理时即插即用 延迟高,成本翻倍
Fine-tuning 零推理时开销 需要数据收集、训练、评估周期,可能过拟合
Tool Search 减少上下文,降低歧义 不处理参数错误
Programmatic Calling 高效,无 LLM 内循环 需要 LLM 写正确代码

参考资料

相关笔记