多数 Agent RL 从 base 或 SFT 模型起步,这套配方直接从推理优化模型(QwQ-32B、Qwen3-8B、gpt-oss-20b)做持续 RL。 三件事撑起它:按模型家族改编的交互相导(把多轮压成单轮 + 自管上下文)、全合成训练数据、以及把优势除以轨迹长度 T。 代价是配方逐模型定制,工具也只给三个。
推理模型会「想」,但不会「办」。论文要的是让它们在不被人类中途指挥的前提下,自己搜、自己读、自己写代码,把一篇 Deep Research 做出来。难点不在单步推理,而在几十步长程 rollout 上的 RL 训练会塌。
作者观察到两件事:Qwen 系模型在多轮对话里思考质量会在第一轮之后退化;而长轨迹在 batch 里占的 action 步骤更多,即使失败也会被强化,于是变成「反复调同一个工具」。对应两处改动:把历史压进单轮上下文 + clean_memory 自管记忆;把优势改成 A = (r − mean)/std/T。
结果上,gpt-oss-20b 起点最好:SFR-DR-20B 在 HLE 全文集 28.7%(Table 1),比其基座 17.3% 高 11.4 个百分点。Qwen 侧模型则更多靠「推理时改工作流」提分,RL 只再补几个点。
读完这节要知道:单智能体 DR 的自由度,恰好是它训练不稳定的根源。
Deep Research(DR)任务要求模型在多来源上大量搜索和推理,最终给出答案。论文把 DR 系统分成两类:多智能体按预定义流程分工(orchestrator、planner、coder、researcher…);单智能体只拿到用户问题,中间步骤没有任何外部指令,自己决定下一步(§2.1)。
论文选单智能体的两个理由写在 §1:“single agents can generalize better to unseen tasks”,以及单智能体可以再嵌进多智能体当子模块。代价是:工具调用顺序完全自由,这“demands advanced reasoning ability to plan and execute correct tool calls”(§1)。
§3.3 原文:“longer trajectories dominate the training loss, even if said trajectories are not necessarily of higher quality or correct. As a result, failing-but-long trajectories appear more frequently over time”。§4.2.2 补充:模型“degenerates into making repetitive, identical tool calls”。
这不是奖励设计的问题——每一步拿到的 reward 是同一个轨迹奖励 ri,没有任何中间奖励。问题在于同一组里,长度不同的轨迹在 step 级损失里的权重不一样。
论文还专门讨论了一种反直觉的可能性:“More Tool Calls Do Not Equate Better Scores”(§4.2.2)——调用次数多并不等于分数高,只有当调用“diverse and strategically executed”时才成立。第三章的交互就是把这句话变成一个可以亲手调的数。
读完这节要知道:对照表里哪些格子其实是「重跑过的数」,哪些没测。
OpenDeepSearch、WebThinker、MiroThinker 等把任务拆给多个角色。§2.1 的评价:多智能体“tend to specialize in pre-defined workflows and can achieve greater performance and efficiency”。
盲区:流程是人定的启发式,“not constrained by the predefined, heuristic-based workflows”正是论文认为单智能体能泛化的理由(§1)。
WebSailor、WebShaper 等从 base 或指令模型出发,先冷启动指令微调再 RL(§2.2 概括为“cold-start instruction-tuning followed by RL with customized objectives and roll-out strategies”)。
盲区:推理能力得在训练里重新获得或保住;论文选择的是“continual RL”而不是从头养。
起点是已经会长链思考的模型;目标是在保留推理的同时“endowing them with new agentic capabilities”(§2.2)。
论文自己也说这条路的难点是“reliably steering long-horizon chain-of-thought behavior during optimization”——03 节的内容就是怎么 steer。
Table 1 的完整版还有专有模型与多智能体分组,这里只转录单智能体分组和两款专有对照,其余未转录。所有数字均为 Pass@1;* 表示作者用开源代码 + 自家 blocklist 重跑,† 表示原文报告值但“do not mention or include leakage prevention efforts”(Table 1 表注)。HLE 列原文写作 “HLE/HLE-500”,这一分组未标注 HLE-500。
| Agent | 基座 | FRAMES | GAIA | HLE |
|---|---|---|---|---|
| Deep Research 专有 | o3 | — | 67.4 | 26.6 |
| GPT-5 专有 | GPT-5 | — | — | 35.2 |
| WebSailor-32B * 重跑 | Qwen2.5-32B | 69.78 | 44.0 | 10.75 |
| WebShaper-32B * 重跑 | QwQ-32B | 69.42 | 48.5 | 12.23 |
| AFM-32B † 原报告 | Qwen2.5-32B | 55.3 | — | — |
| SFR-DR-8B | Qwen3-8B | 63.3 | 41.7 | 13.2 |
| SFR-DR-32B | QwQ-32B | 72.0 | 52.4 | 16.2 |
| SFR-DR-20B | gpt-oss-20b | 82.8 | 66.0 | 28.7 |
GAIA 一列,原文对 WebSailor / WebShaper 分别还给了括号里的 † 值 53.2 / 53.3;本表只保留 * 重跑值,† 括号值未转录。HLE-500 子集仅在 MiroThinker-32B(11.8†)、WebThinker-32B(15.8†)、AFM-32B(18.0†)三个多智能体/单智能体基线上出现,不在本表。
读完这节能亲手推出「调得越多越差」这件事在什么条件下发生。
算法骨架仍是 REINFORCE 系(§3.3 称“a modern variant of the REINFORCE algorithm… which features clipped-surrogate losses”)。对一个输入 q,采样 G 条独立轨迹;每条轨迹所有 step 共享同一个轨迹奖励 ri,无中间奖励。step 级优势为:
原文对它的说明是一句话:“steps of longer rollouts have lower absolute advantage magnitudes than those of shorter rollouts”,并且“The normalization is designed to regulate and stabilize training when the trajectory length varies significantly”(§3.3)。注意它不改变组内谁排第一——只是把长轨迹上的每个 step 权重按 T 压小。
位置一 · §4.2.2 / Figure 2 图注:“with normalization, training is more stable… even though tool usage grows more moderately”;“our length normalization regulates tool usage”。
位置二 · Figure 2 曲线本身:蓝线(长度归一化)的平均轨迹长度全程在约 4–6 之间波动,阶段长度没有单调上升的趋势;红线(未归一化)从约 4.4 一路升到 7 以上,栏内标着 “HLE=7.8”,蓝线标 “HLE=13.0”。
两者怎么对应,原文没有进一步说明。
下面按 Eq. 1 在 step 级做一次简化模拟:一组 G 条轨迹,每条 Ti 步、共享奖励 ri。两个读数:①grid 份额——每条轨迹在「优势 × 长度」上的贡献占比,组内归一到 100;②每步平均额度——分到「每一次调工具」上的权重,同样组内归一。切换归一化开关,看长短轨迹的权重怎么重新分配。
口径:组内 mean / std 用总体标准差(除以 G,不是 G−1);每条轨迹所有 step 共用同一优势 Ai;grid 份额 = |Ai|·Ti,每步平均额度 = |Ai|,两者都按组内最大值归一到 100;轨迹长度 Ti = lo + (hi − lo)·i/(G−1) 在滑块的区间内等距铺开;T* = Σ|r| / Σ|A|,比值 = mean(T)/T*,均保留 1 位小数。
组 A(点「手算组 A」按钮):G=3,奖励 1 / 0 / 1,T 范围 2–8 ⇒ T = [2.0, 5.0, 8.0],阈值 4.0,归一化 ON。
① mean = 2/3 = 0.667;方差 = ((1−0.667)² + (0−0.667)² + (1−0.667)²)/3 = (0.111 + 0.444 + 0.111)/3 = 0.222;std = √0.222 = 0.471。
② A/T = [0.333/0.471/2.0, −0.667/0.471/5.0, 0.333/0.471/8.0] = [0.354, −0.283, 0.088];grid = |A·T| = [0.707, 1.414, 0.707] → 除 1.414 ⇒ 50.0% / 100.0% / 50.0%;每步 = [0.354, 0.283, 0.088] → 除 0.354 ⇒ 100.0% / 80.0% / 25.0%。
③ T* = Σ|r|/Σ|A| = 2.0 / 0.725 = 2.8 步;mean(T) = 5.0 ⇒ 5.0 / 2.8 = 1.8×;T > 4.0 的轨迹有 2 条(T=5.0、8.0);短轨迹占比 = 阈值内的每步额度之和 / 全组 = 0.354 / 0.725 = 48.8%(阈值内只有 T=2.0 这条轨迹)。
④ 切到未归一化(A):A = [0.707, −1.414, 0.707];grid = [1.414, 7.071, 5.657] → 20.0% / 100.0% / 80.0%,失败的 T=5.0 最重;每步 = |A| → 50.0% / 100.0% / 50.0%;T* = 2.0/2.828 = 0.7;比值 7.1×;短轨迹占比 = 阈值内 grid 份额 1.414 / 全组 14.142 = 10.0%。
⑤ 换成样本标准差(÷2)std = 0.577,组 A 的 A/T = [0.289, −0.231, 0.072]:grid 与每步额度的百分比不变(同除一个数);T* = 2.0/0.592 = 3.4,比值 5.0/3.4 = 1.5×。两种口径下「短轨迹每步权重更高、失败长轨迹每步权重更低」的方向一致,只有 T* 的绝对位置变。
组 B(点「手算组 B」按钮):G=2,奖励 1 / 0,T 范围 2–8 ⇒ T = [2.0, 8.0],阈值 4.0。
① mean = 0.5,std = 0.5;A/T = [1/0.5/2, −1/0.5/8] = [0.5, −0.125]。
② grid = |A·T| = [1.0, 1.0] → 100.0% / 100.0%;每步 = [0.5, 0.125] → 100.0% / 25.0%。
③ T* = 1.0 / 0.625 = 1.6;比值 5.0/1.6 = 3.1×;超过阈值的 1 条;短轨迹占比 = 0.5/0.625 = 80.0%(T=2.0 在阈值内)。
④ 未归一化:A = [1.0, −1.0];grid = [2.0, 8.0] → 25.0% / 100.0%——失败的长轨迹独占 100 的 grid,成功短轨迹只有 25;每步 = |A| → 100.0% / 100.0%(两条每步权重相同,长的那条还多了 4 倍步数);T* = 1.0/2.0 = 0.5;短轨迹占比 = 2.0/10.0 = 20.0%。
默认组校验:G=4、1 / 0 / 0 / 1、T 范围 2–8 ⇒ T = [2.0, 4.0, 6.0, 8.0]。mean = 0.5、std = 0.5;A/T = [0.5, −0.25, −0.167, 0.125];grid = |A·T| = [1, 1, 1, 1] ⇒ 全为 100.0%;每步 = [0.5, 0.25, 0.167, 0.125] ⇒ 100.0% / 50.0% / 33.3% / 25.0%;T* = 1.0/1.042 = 1.9,比值 5.0/1.9 = 2.6×;阈值内(T=2、4)的每步额度占比 = 0.75/1.042 = 72.0%。与页面初始读数逐位一致。
交互对账(覆盖与未覆盖):覆盖的是 Eq. 1(§3.3)的组内标准化与分步归一化、|A·T| 与 |A| 的两种份额、T* 与阈值判定。未覆盖:clipped-surrogate 具体损失、episode 过滤 / 部分 rollout / 缓存等训练系统行为、真实长度分布(页面把 T 在所选区间内等距铺开)、多轮 rollout 中优势随 step 变化的细节。这里的「T* 」是页面为了把「多调几次是否值得」变成可调参数而自定的阈值,不是原文概念。
全对组(zero-gradient 边界):奖励形态选「全对」后所有 r 相同 ⇒ 所有 r − mean = 0 ⇒ A = 0,页面显示 0% 与「—」。推断此时 std(R) = 0,Eq. 1 会除零;页面对这一情形直接给出 0,不模拟真实训练框架的 std 截断。这一组只说明一件事:组内没有奖励差,长度归一化无从比较。
读完这节要知道:除了 Eq. 1,还有过滤、部分 rollout、奖励和基础设施四件事在兜底。
“filter out invalid trajectories, such as those ending with truncation or incorrectly-formatted responses, from the replay buffer”;同时把组内正负样本比例控制在预设范围内,随机或启发式丢弃过多的一侧(§3.3)。原文:“without such measures, the training process is unstable and prone to model collapse”。
与 MoonshotAI 的做法不同,这里不「用新策略续写」,而是把部分 rollout 当作独立初始状态,用同一策略重新启动组级 Monte-Carlo——“This allows more exposure to and gradient updates from long-tail intermediate states”(§3.3)。
用同一个 baseline LLM 当 verifier。短格式:判断是否与标准答案语义一致,ri ∈ {0,1}。长报告:多阶段打分(事实性 / 合规 / 写作 / 引用质量),各类有固定权重,组内再按 verifier 排序产生 ranking score,总奖励是加权和加排序分(§3.3)。
rollout 异步多进程打满 SGLang 吞吐;工具箱全本地执行并缓存结果;策略推理、verifier、训练模型共置在同一批 GPU,梯度更新时把推理引擎挪开、反之亦然;对 OOM、超时、引擎挂起有恢复流程(§3.3)。
训练数据全合成,两类任务:短格式多跳 QA(迭代式逐步加难,另掺数学与代码推理)和长报告写作(LLM 生成指令与评分 rubric)。难度在 §3.2 给了两个锚点:OpenAI Deep Research(o3)在该短格式集上 “less than 65%”,最好的基线智能体 “less than 40%”;一个 o4-mini 智能体单题要“up to 50 tool calls”。这也是为什么 Table 1 里 SFR-DR 的对比对象覆盖了这么强的系统。
code_interpreter 是无状态的:每次独立运行、不共享变量、5 分钟超时;没有命令行、不能装包。脚注 1 列了黑名单:尝试 import os, sys, subprocess, socket, signal, multiprocessing, threading, ssl, pdb, resource, xmlrpc 等会直接报错。这条限制决定了 §07 的适用边界。
读完这节要知道:Qwen 系和 gpt-oss 走的是两套交互模板,记忆工具也不同。
论文形式化地定义一条 agentic 轨迹为有序集合 T(q) = (q, c₁, o₁, c₂, o₂, …, cₙ, oₙ, a),其中 ci 是含工具调用的模型响应,oi 是环境反馈,a 是最终答案;对推理模型,ci 与 a 还包含 thinking tokens(§3.1.2)。
Qwen / QwQ 的版本:记忆逼近预设上限 Lmem 时,agent 被告知已超过 buffer,此时除 clean_memory 外的任何工具调用都会得到 “memory overflow” 错误,直到成功清理上下文(§3.1.2)。若已清理 K 次,第 K 次之前的工具结果 oj 就被擦掉、不再出现在当前记忆里(脚注 3)。gpt-oss 版本则是「编辑或删除单条过去的结果」。
读完这节要知道:Qwen 系的涨点主要发生在 RL 之前;gpt-oss-20b 才是 RL 真正发力的那个。
Table 2 对比默认多轮模板与 SFR-DR 的工作流(pre-RL,即未做 RL)。原文口径:“most notably a 10% absolute increase on FRAMES for the 32B model”(§4.2.1)。下表所有提升均按绝对点差(百分点)与相对幅度两种口径并列给出。
| Agent | FRAMES | HLE |
|---|---|---|
| Qwen3-8B multi-turn | 52.5 | 8.8 |
| QwQ-32B multi-turn | 58.0 | 12.3 |
| SFR-DR-8B (pre-RL) | 58.8 | 9.9 |
| SFR-DR-32B (pre-RL) | 68.0 | 13.9 |
再叠加 RL 后(§4.2.1 与 Table 1 / Figure 2 交叉):8B 的 HLE 从 9.9 到 13.2,+3.3 个百分点(相对 33.3%);32B 从 13.9 到 16.2,+2.3 个百分点(相对 16.5%)。推断(由 Table 2 pre-RL 值与 Table 1 / Figure 2 post-RL 值相减;8B 的 13.2 同时在 Figure 2 的标注里出现)Qwen 系模型的 RL 增益,在 FRAMES 维度上没有对应数据,只能比 HLE——两者都远小于「换模板」在 FRAMES 上带来的 +6.3 / +10.0 个百分点。
+11.4 个百分点,即 相对提升 65.9%——原文 §4.1 明确写的是 “65% relative improvement over gpt-oss-20b”,与按 (28.7 − 17.3)/17.3 算出的 65.9% 一致。相对 Deep Research(o3)的 26.6 高 +2.1 个百分点(相对 7.9%);比同家族的 SFR-DR-32B(16.2)高 +12.5 个百分点(相对 77.2%)。
GAIA 上 66.0 vs o3 的 67.4,低 1.4 个百分点(相对 −2.1%),不是全面领先。FRAMES 82.8 为本表最高,但同表其他系统在该列多为 * / † 口径,不能直接当成同口径对比。
| 读数 | 数值 | 出处 |
|---|---|---|
| SFR-DR-8B 未归一化 HLE | 7.8 | Figure 2 栏内标注 |
| SFR-DR-8B 长度归一化 HLE | 13.0 | Figure 2 栏内标注 |
| 两者差(绝对 / 相对) | +5.2 / 66.7% | 13.0 − 7.8;再 /7.8 |
| RL 后工具调用增幅 8B / 32B / 20B | +11% / +64% / +28% | Figure 3(a) 柱顶标注 |
| RL 后每步响应长度变化 8B / 32B / 20B | +10% / +18% / −29% | Figure 3(b) 柱顶标注 |
另有两处值得记的对比:工具越多不等于越好——§4.2.3 指出 Qwen 系在不少样本上只做内部推理、几乎不调工具,而做工具调用的 20B 分数最高;每步响应长度——20B 每步 “less than 2,000 tokens”,比 8B / 32B “4-5 times fewer”(§4.2.4),但 RL 反而让它变短(图中 −29%),Qwen 系则 RL 之后变长(+10% / +18%)。
读完这节要知道:在哪些条件下这套数字不能直接搬到你的场景。
§3.1.2 明说 “specific model families have distinct model characteristics that do not allow for a one-size-fit-all training formulation… we tailor our inference setups on a per-model family basis”。Qwen / QwQ 用单轮重构,gpt-oss 用默认 harmony 多轮;记忆工具也不同(clean_memory vs 编辑单条结果)。换基座就得重调。
同样的 Eq. 1 与数据,20B(gpt-oss-20b)拿到 28.7,32B(QwQ-32B)只有 16.2(Table 1)。§4.2.3 把原因归到 “gpt-oss-20b appears better primed for agentic training, as indicated by its pre-RL number of tool calls”。这说明配方效果和起点强耦合,不能按参数量推断。
只有三个工具;browse_page 抹掉所有超链接;code_interpreter 无状态、无 shell、不能装包,还得避开一长串 import 黑名单(脚注 1)。需要「点链接浏览」「装依赖跑脚本」「操作 GUI」的任务,本文没有验证。§3.1.1 的理由是 “not render any training tasks trivially easy”——这是训练设计,不保证部署时够用。
Table 1 表注写的是 “Pass@1”,全文未见多次采样的方差或置信区间。推断表内 0.1 级的差距(例如 20B 的 28.7 与 o3 的 26.6,差 2.1 点)需要谨慎解读。
Table 1 表注区分了三类数:作者直接引用的 OpenAI 值、作者用自家 blocklist 重跑的 * 值、以及没有泄漏防护信息的 † 值。§4.1 原文:“we are unable to confirm if contamination precautions exist”。开放问题:本文自己的 2100+ 题全文集与 500 子集之间,被 [11] 估计为 “up to 3.4%” 的污染样本分布如何,论文未展开。