Skip to main content

ART·E — 用 GRPO 把 8B 小模型训成邮件搜索 Agent,超越 o3

原文:Building ART·E: Reinforcement Learning for Email Search Agent Development | 开源模型:OpenPipe/art-e-008 | 训练代码:github.com/OpenPipe/ART

这篇文章基于 OpenPipe 团队的技术博客深度扩写。我以第一视角重新梳理了他们用 GRPO 把 Llama-3.1-8B 训成邮件搜索 Agent 的完整过程——从 Enron 邮件语料造数据,到 3 个工具的极简 Agent 环境,到多目标奖励函数设计,到 15 轮训练迭代的调参教训。最终这个 8B 小模型在邮件搜索任务上比 o3 更快、更便宜、更准确。


这篇文章说了什么

OpenPipe 团队做了一个叫 ART·E 的项目——用 GRPO 强化学习训练一个小模型当邮件搜索 Agent。给定一封邮件 inbox 和一个自然语言问题(比如"我女儿教室聚会的 RSVP 是什么"),Agent 通过搜索邮件、阅读邮件内容、返回最终答案来完成任务。

关键结果:

  • 比 o3 更准:ART·E 答对了 60% o3 答错的问题
  • 比 o3 更快:速度是 o3 的 5 倍(更少的工具调用轮次)
  • 比 o3 更便宜:运行成本是 o3 的 1/64
  • 训练成本:单张 H100,总花费不到 $80

核心结论:Agent RL 训练不需要海量标注数据。只需要一个可验证的奖励函数 + 一个合理的 Agent 环境 + 少量合成数据,就能在小模型上跑出比大模型更好的效果。


有效的实验就这几招

方法做了什么效果
多目标奖励函数同时优化答案正确性 + 最少轮次 + 反幻觉,权重可调速度 5x、幻觉减少、准确率反超 o3
减少轮次奖励每多一轮给少量负奖励,鼓励模型一步到位最终比 o3 平均少用近一整轮
幻觉惩罚错误答案给显著负分(比"我不知道"更差)训练后模型幻觉率低于 o3
Env 极简设计只有 3 个工具:search_emails、read_email、return_final_answer极简的环境让模型更快收敛,不会被复杂工具干扰
合成 QA 数据基于 Enron 邮件语料 + GPT-4.1 生成 4000 条 Q&A,带 "how_realistic" 评分过滤4,000 条足矣,数据质量比数量重要
15+ 指标监控包括 answer_correct、sources_correct、num_turns、hallucination、bad_tool_call 等及时发现 reward hacking、及时发现训练卡住

试了但没用的方法:中间奖励(partial credit)——给"搜到了目标邮件""读了目标邮件""来源邮件选对了"等中间步骤打分。理论上这些中途奖励应该让梯度更密集,但实际上没有加速训练,因为模型在训练早期就已经能足够频繁地找到正确答案,直接从最终结果学到了。

一个反面教训:给"多走几步"加正分 → 模型学会了在最后一轮反复重复同样的 tool call,直到达到步数上限。 奖励函数的设计要非常小心——模型总会找到你没想到的捷径。


一、先搞懂这些概念

1.1 邮件搜索 Agent 的任务

这是一个典型的多轮 Agent 任务。Agent 拿到一个自然语言问题和它能访问的邮件 inbox,需要通过"搜索→阅读→判断→回答"的循环来找到答案。

用户问题: "What time is my brother's flight on Friday?"

Agent 的执行过程:
Step 1: search_emails("brother flight Friday")
→ 返回 10 条匹配邮件摘要(含 message_id)
Step 2: read_email("msg_12345")
→ 返回完整邮件正文:"Your flight CO1984 departs SFO at 3:45 PM..."
Step 3: return_final_answer("Your brother's flight departs at 3:45 PM on Friday",
sources=["msg_12345"])

看似简单,但实际难点在于:

  • 搜索关键词怎么选:"brother flight Friday" 还是 "brother" + 日期推演?模型要根据第一次搜索结果决定下一步
  • 哪封邮件值得点开读:关键词搜索可能返回 10 封相关但不同的邮件,模型要判断哪封真正包含答案
  • 答案的出处:不能编,必须附上来源邮件 ID

1.2 3 个工具的极简环境

Agent 只有且仅有 3 个工具:

工具功能参数
search_emails全文搜索邮件,返回最多 10 条结果(含 message_id + 匹配片段)keywords, sent_after, sent_before
read_email读取指定邮件的完整正文message_id
return_final_answer提交最终答案(含来源邮件 ID 列表)answer, sources

环境底层是 SQLite + FTS5 全文搜索引擎。没了。

OpenPipe 团队强调:Agent 循环本身极其简单——没有递归调用、没有回溯、没有复杂编排。就是:调 LLM → 解析 tool call → 执行工具 → 把结果追加到对话历史 → 循环,直到模型输出最终答案或超过 10 步。

1.3 GRPO 训练循环

ART·E 的训练循环是这个样子:

1. 从数据集取 12 个问题(和它们的正确答案)
2. 对每个问题,跑 4 次 rollout(生成 4 条完整的 Agent 执行轨迹)
3. 用奖励函数给 4 条轨迹分别打分
4. 用 12 组 × 4 = 48 条轨迹 + 它们的分数,计算 GRPO loss 并更新模型
5. 每 30 步跑一次验证:100 条验证问题,计算准确率
6. 回到步骤 1,直到验证集上不再提升

注意几个细节

  • num_generations=4(每个 prompt 生成 4 个候选),比通常的 8 要少——因为邮件 Agent 的轨迹很长(多轮交互),4 个已经很耗显存
  • 验证集 100 条、每 30 步验证一次——频繁验证对于发现 reward hacking 很关键
  • 训练在单张 H100 上跑,15 轮迭代

二、数据:基于 Enron 邮件语料的合成 Q&A

2.1 为什么用 Enron

Enron 是 2001 年一家能源公司,因大规模会计欺诈被起诉,诉讼过程中约 50 万封真实邮件 被公开。这是目前能拿到的最大的真实英文邮件语料。

一个自黑的建议:如果你也打算从事大规模会计欺诈,记得不要保留邮件。

2.2 如何合成 Q&A

随机选了 28 个员工 inbox(20 个训练、8 个测试),每个 inbox 至少 5000 封邮件。然后:

  1. 每个 inbox 里每次取 20 封邮件为一个 batch
  2. 每批邮件扔给 GPT-4.1,让模型生成 Q&A 对(问题 + 正确答案 + 来源邮件 message_id)
  3. 同时让模型输出一个 how_realistic 评分(0-1),这个评分在过滤不像是真人会问的问题上很有效
  4. 最终生成约 4000 条 Q&A

生成的数据样例:

问题答案
What issues will be discussed at the Tuesday afternoon meeting with EES?强制公用事业公司支付拖欠的 PX 信用额度、新的 1 美分附加费是否转嫁给客户、是否将客户退回 utility bundled service
When is the Astros group game against the Cubs?Thursday, April 27, at 3:05 PM
What countries are on the boycott list for e-commerce trading?Bahrain, Iraq, Kuwait, Lebanon, Libya, Oman, Qatar, Saudi Arabia, Syria, UAE, Yemen
What is my confirmation number for my Continental Airlines flight to Colorado Springs?N1BTZH

合成数据最大的坑:GPT-4.1 生成的 Q&A 有时候答案本身就是错的——因为它对邮件的理解有偏差。所以评估时用的正确答案是人工二次校验过的。


三、奖励函数:多目标的艺术

OpenPipe 的奖励函数是一个典型案例——不是一道单选题,而是一张多维度打分表

3.1 三大奖励维度

维度权重逻辑
答案正确性最高LLM Judge 判断 Agent 的最终答案跟标准答案是否一致
最少轮次低(额外加分)在答对的前提下,轮次越少越好——这是延迟的代理指标
反幻觉惩罚高(负分)如果答错了,给显著负分——比"我不知道"更差

3.2 最少轮次奖励的妙用

他们给了一个很小的"额外加分":答案正确的情况下,用的轮次越少,奖励越高。

为什么是延迟的代理指标?因为 Agent 的速度瓶颈不是 LLM 推理一次的速度,而是多少轮 round trip——每一轮都要调 LLM、解析 tool call、执行工具、把结果塞回 prompt。轮次越少,用户等待越短。

训练结束后,ART·E 的平均轮次比 o3 少了近 1 整轮——这意味着即使单次推理速度相同,用户感知延迟也缩短了 20-30%。

3.3 幻觉惩罚

让模型答错不如让它说"我不知道"。答错会给用户虚假信息(在金融/邮件场景这可能会有实际损失),而说"不知道"至少是诚实的。

所以奖励函数的梯度:

  • 正确答案 → 高分
  • "我不知道" → 低分但不惩罚
  • 错误答案 → 负分(比"我不知道"更差)

训练后,ART·E 不仅答对率比 o3 高,幻觉率也比 o3 低

3.4 中间奖励为什么失败

他们尝试了对中间步骤打分的 partial credit:

  • 模型是否在某一步搜到了正确的邮件 → +分
  • 模型是否在某一步读了正确的邮件 → +分
  • 模型是否把正确的邮件列为了来源(即使答案错了)→ +分

结果:这些中间奖励基本没有加速训练。

原因是:任务本身没有难到模型完全找不到方向。模型从一开始就能——虽然不是每次都——找到正确答案。来自最终答案的稀疏奖励信号已经足够了。

关键教训:中间奖励是双刃剑。如果设计了不该设的中间目标,模型会去优化这些目标而不是真正想优化的事。早期一个实验给"多走几步"加分 → 模型学会了在最后一步反复重复同一个 tool call,直到 10 步耗尽。

"Show me the incentive and I'll show you the outcome." — Charlie Munger(原文引用)


四、训练监控:15+ 个指标的意义

OpenPipe 的 ART 框架把每个 rollout 的每个维度都做了结构化度量,总共 15+ 个指标:

class FinalRubric:
answer_correct: bool = False # 最终答案是否正确
sources_correct: bool = False # 来源邮件是否列对
num_turns: int = 0 # 用了多少轮
attempted_answer: bool = False # 是否尝试回答(vs 放弃)
ever_found_right_email: bool = False # 某一步是否搜到了正确邮件
ever_read_right_email: bool = False # 某一步是否读了正确邮件
cant_parse_tool_call: bool = False # 工具调用 JSON 解析失败
bad_tool_call_name: bool = False # 调了不存在的工具
bad_tool_call_args: bool = False # 参数不对
ran_out_of_turns: bool = False # 超过最大步数
returned_i_dont_know: bool = False # 主动说不知道
num_sources: int = 0 # 列了多少条来源
ever_tried_to_read_invalid_email: bool = False # 试图读不存在的邮件 ID
prompt_tokens: int = 0 # 输入 token 数
completion_tokens: int = 0 # 输出 token 数

4.1 为什么要看这么多指标

GRPO 训练中最隐蔽的失败模式:reward 在涨,但模型在做跟你预期不同的事。

你只看 reward curve 往上升,以为训练正常。实际:

  • 模型可能学会了钻奖励函数的空子(reward hacking)
  • 模型可能陷入了某种退化的策略(比如每条都调 search → 永远停在第一步)
  • 模型的所有输出可能都趋同了(zero-std 问题)

所以必须同时看多种指标,而且要定期抽查实际输出。 OpenPipe 团队跑了 15 个训练 job(大部分只跑了几小时),每次失败都靠这些指标定位问题。

4.2 最关键的监控信号

信号含义怎么办
Reward 标准差→0所有 rollout 分数趋同,训练卡住增加 rollout 数量、让奖励函数更细粒度、降低学习率、增加场景多样性
Number of turns 持续上升模型学到了"多兜圈子"的坏习惯检查奖励函数是否鼓励了多轮次
Hallucination 率不降反幻觉惩罚不够重加重幻觉惩罚、检查"我不知道"是否得到了合理奖励
Cant parse tool call 率不降模型学不会输出格式格式奖励不够好、可能需要先 SFT 再 RL

五、训练基础设施:ART 框架

OpenPipe 开源了他们的训练框架 ART(Agent Reinforcement Trainer),专门为多轮 Agent 的 GRPO 训练设计。

ART 的核心设计理念:

  • Rollout 函数标准化:每个 Agent 环境只需要实现一个 rollout 函数(输入 prompt → 跑完整个 Agent loop → 输出完整轨迹)
  • 指标系统结构体化:每个 rollout 返回一个 Pydantic 结构体,所有指标自动上报到 W&B 和日志
  • Checkpoint 自动保存:reward 最高的模型自动保存

关键参数

  • rollouts_per_prompt=4:每个 prompt 生成 4 条轨迹
  • steps=30 验证一次
  • 单 H100 可跑,框架支持多 GPU

六、工程启示

6.1 先尽力把 prompted 模型推到极限

在开始 RL 训练之前,OpenPipe 花了很多时间 benchmark 各种模型(GPT-4.1、Claude、o3 等),反复修 Agent loop 的 bug、调整 prompt、确认工具确实能返回正确结果。

为什么?

  1. 你可能发现不需要训练——现成模型就够了
  2. 很多时候模型表现差是因为你没给够上下文、工具实现有 bug、目标定义模糊——这些问题 RL 也修不了
  3. 知道 prompted baseline 后,你的 RL 模型超越 baseline 时才能确认训练真的有效果

6.2 奖励函数是你的 UI

用户的"满意"最终只有你能定义。奖励函数就是把"什么是好"翻译成"多少分"的翻译器。这个翻译要做到:

  • 高分的输出真的是你想要的(有效性
  • 低分的输出真的是你不想要的(区分度
  • 模型不能找到漏洞(鲁棒性

6.3 不到 $80 的训练成本意味着什么

单张 H100、不到 $80,训出来的模型比 o3 更快更准。这意味着用 RL 训练垂直 Agent 的门槛已经非常低了——不再是大厂专属。

6.4 跟其他 GRPO Agent 项目的对比

维度ART·ERLVR Tool Calling基金助手
Agent 类型多轮搜索 Agent单轮工具调用多轮 SubAgent
工具数量35+3(评估)6
多目标奖励✅(正确性+轮次+反幻觉)✅(三层分级)✅(复合加权)
中间奖励❌ 失败❌ 未尝试⚠️ 部分有用
开源程度模型+代码全开源平台托管-
训练成本小于 $8040 分钟 serverless-

共同主线:奖励函数设计 + 小模型替代大模型 + 极简 Agent 环境 = 可靠的垂直 Agent。