搜索 RL 要靠外部引擎产生轨迹,而 Search-R1 的 <search> 结果每一步都产生 API 费用;ZeroSearch 换成另一个微调过的 LLM 当引擎,又多一份模型开销。
这篇论文先测出一件事:答案常常就在参数里——Llama-3.1-8B-Instruct 在 Bamboogle 上 pass@1024 达到 87.2%,比 pass@1 高约 2.5 倍。于是它让策略模型自己扮演搜索引擎,用一份格式奖励 + 规则奖励把这种内隐搜索训成稳定的单次能力。
代价写在论文自己的表里:主表领先只对 Llama 成立,换成 Qwen2.5-7B 就落后于 ZeroSearch。
作者先不看训练,而是只做推理:让模型在一次生成里自己写 <search> 和自我作答 <information>,重复采样 K 次算 pass@k。
K 越大越准,曲线遵循 log c ≈ a·Kb 的拟合——说明知识在参数里,缺的是「把它稳定取出来」的方法。
取不出来就训练。RL 目标 (Eq. 4) 里本来要边训边查外部引擎;当检索器就是策略模型自己时 R 的分布与 πθ 相同,目标退化成 Eq. 5——「全模拟」(Full-Sim)搜索 RL。
奖励是结果对错(Eq. 6:+1 / −1)与格式布尔量 fformat ∈ {True, False} 按 λf = 0.1 组合成 Eq. 7 的四个常数(1 / 0.9 / 0.1 / 0);训练时把 <information> 的 token 从损失里屏蔽。
结果分两半。Llama-3.1-8B-Instruct 六个 QA 基准 EM 平均 43.1,高于训练时用 Google 的 Search-R1(37.1)和半模拟的 ZeroSearch(41.5),训练时间约为 ZeroSearch 的 1/5.53。 但把它训出来的技能直接接到真实 Google 上,Llama 反而掉了(K=3 时 35.5),只有 Qwen2.5-7B 涨到 47.9;而且 Qwen2.5-7B 上 SSRL 本身就低于 ZeroSearch。
读完这节,你要知道为什么作者先测 pass@k、再谈训练。
把 LLM 训成搜索智能体的标准做法是:模型写 <think>、发出 <search> 查询、拿回 <information>、再思考,直到给出 <answer>。Search-R1 在本地维基语料上跑这套流程,在线版本则直接打 Google / Bing。RL 训练需要大量 rollout,而每条轨迹里可能有多次搜索调用——§1 原句是「interacting with real web search engines remains costly …, especially given the large number of rollouts and multi-turn tool calls required during RL training」,即成本来自实时网页搜索交互,训练期 rollout 数量与多轮工具调用会把它放大 (§1)。
但在换环境之前,作者先问了一个更基础的问题:如果完全不搜索,模型自己知道多少? 这正是 pass@k 能回答的问题:给定一个问题采样 K 个答案,其中至少一个正确就算命中。它衡量的是「知识库覆盖率」,而不是「一次答对的稳定性」。两者之间的差距,就是训练要补的空间。
实验覆盖 Llama-3.x、Qwen2.5、Qwen3 三个家族和 0.6B–72B,共七个基准(Table 2):TriviaQA、NQ、HotpotQA、2Wiki、Musique、Bamboogle 属于事实/多跳问答,BrowseComp 是开放网页浏览题。采样温度 0.7、top-p 0.95、max tokens 8192 (§2.3)。
两个结果值得记住,它们分别说明「有上限」和「上限高」:
87.2%,论文原话是「a 150% improvement over pass@1 performance」。按字面反推 pass@1 ≈ 87.2 / 2.5 = 34.88 推断(依据 §2.4 原文与 Table 15:Table 15 的 caption 原文为「Comparison of actual vs. fitted values, residuals, and relative errors for three Llama models across different K values」,只给 Llama-3.2-3B / 3.1-8B / 3.1-70B 三个模型在 K = 20…210 下的实际值与拟合值对比;其中 Llama-3.1-8B-Instruct 的 actual 在 K=20 为 25.53、K=210 为 67.83,表里没有单列 Bamboogle,故 34.88 只是按「150%」字面反推)。论文在 §2.5.2 试了 maj@k(多数投票):即使把样本数加到 1024,提升依然很小,因为错误答案会成批地重复出现(Figure 6)。这就是 SSRL 的切入点——不靠事后投票,而是训练模型自己把内隐知识用对。
顺带一个与直觉相反的观察:数学 RL 里常被当作好底座的 Qwen,在自搜索场景的 pass@k 上限反而低于 Llama (§2.4),作者据此认为「搜索先验」与「推理先验」不是同一件事。
论文自己的术语表(Table 11,§3.5.3 末)把「训练/推理时用谁做搜索引擎」分成四档,这里是其中三档。
训练时用 e5 + 维基语料检索,上线接 Google。知识新鲜、噪声真实,但 RL 要海量 rollout,每步搜索都是成本。
用一个微调过的 LLM(论文称「Simulation LLM」)模拟搜索返回。便宜,但多养一份模拟器,而且引擎和被训模型是两份参数。
只训一份模型,它生成的 <information> 就是检索结果。零外部调用,但知识冻结在预训练数据里。
单看训练集配置也能看出差距:论文在附录 B.2.1 里写明 search baselines 与 ZeroSearch 都沿用 R1 的设置——batch 256、lr 1e-6,并且 ZeroSearch 的 max turn 是 2;Search-R1 在测试阶段换成 Google。SSRL 自己则是每条 prompt 采 5 条 rollout、训练 5 个 epoch、max response length 4096,训练全在 8×A800 单节点上 (§3.3)。
代价对照是这篇的核心卖点,但对照只在一个模型家族上全面成立——见 §06。
看懂这两个式子,再加上 §3.2 的信息屏蔽与复合奖励,,基本就拿到了这篇的全部机制。
rewards 用的不是 reward model,而是两个可验证信号(§3.2)。附录 C 的 Listing 1 给了格式奖励的判定函数,它返回 0~1 的连续分数 s(正文 Eq. 7 的 fformat 却是 True/False,两者如何对应论文未说明,见下);结果奖励是个符号函数:
λf = 0.1 原文:「to prioritize correctness while maintaining structured reasoning」注意 Eq. 7 的布尔 fformat 与附录 C Listing 1 的连续分数是两套东西:Listing 1 的 format_reward 最后一行返回 min(score, 1.0) * ratio(think ≤ 8 时),可以取 0~1 之间的任何连续值(如 A 用例的 0.5)。论文正文没有说明这个连续分数 s 如何映射到 Eq. 7 的 Boolean fformat;下面分别称它们为「Listing 格式分 s」与「Eq. 7 的 f」。这是原文自身未接上的两处(Listing 1 是代码实现,Eq. 7 是正文公式),页面并列呈现,不做消解。
模拟器先按 附录 C Listing 1 原样算连续分数 s,再按 Eq. 7 的布尔口径给最终奖励;两者之间的映射见下方「页面约定」。覆盖 Listing 1 的这些检查:标签白名单(6 个用例都假设通过,分支保留)、search_num = information_num、score = (1/max_turn)·think_num(max_turn = 2)、ratio、think > 8 返回 0。未覆盖(用例均假设通过):空内容、search 内容必须单行、占位词(your query / your thoughts / your answer / your information)、len(tags) < 4、起始必须是 <think> 后接 </think>、结尾必须是 <answer></answer>、以及中间每个 search 后必须紧跟 /search · information · /information 的配对与顺序。此外 Listing 1 本身没有「think / search / info 至少 1 个」这一步——那只是页面按用例结构直接给的简化假设。页面约定:f = (s > 0),即 Listing 返回正分记为 True、返回 0 记为 False。下面的 f 与 r 都按这条约定 + Eq. 7 计算(λf = 0.1)。
组 1:用例 A(2 think、1 search、1 information),答案正确,Tag 取 ✓。
think /think search /search information /information answer /answer 全在白名单里,search_num = information_num = 1,结构通过。score = (1/max_turn)·think_num = (1/2)·2 = 1;think_num = search_num + 1,ratio = 1;think_num ≤ 8 → s = min(1,1)·1 = 1。s = 1 > 0 → f = True。对 ∧ f=True → 1。同一 Tag 取法若把 f 判为 False,Eq. 7 给 1 − λf = 0.9(而不是 1)。组 2:用例 C(4 think、3 search、3 information),答案错误,Tag 取 ✓。
score = (1/2)·4 = 2;think_num = search_num + 1 = 4 → ratio = 1;min(2,1)·1 = 1,think_num ≤ 8 → s = 1。f = (s > 0) = True。错 ∧ f=True → λf = 0.1。错 ∧ f=False → 0。另附边界与口径:用例 B(3 ≠ 1)与用例 F(2 ≠ 1)在 Listing 1 的 search_num != information_num 处返回 0,故 s = 0 → f = False:答案对时 0.9、错时 0。用例 D 的 think_num = 9 > 8 直接返回 0,同上。Eq. 7 不区分 s 的大小:f 只有 True/False 两档,Listing 的连续 s 只决定 f 的取值(页面约定 f = (s > 0)),这是 Eq. 7 原文口径。以上均为确定值,无标准差。
<information> 不做 lossSearch-R1 那类工作中,外部检索到的文本天然不计入策略损失。在 SSRL 里 <information> 是模型自己编的——很自然会想「那就一起训吧」。论文的做法相反:仍把它们从损失里屏蔽。原因在 §3.5.1 给了:屏蔽(preventing the model from simply copying retrieved information)迫使模型更深入地走推理过程,屏蔽后不再能「拷贝」,训练动态显示 search 次数显著增加(附录 B.3.3 · Figure 14 左),轨迹更完整、推理更深。
这节讲清楚训练配置与「为什么离线反而更快」。
| 项 | 设置 | 出处 |
|---|---|---|
| 算法 | GRPO(默认),另测 PPO / REINFORCE++ / DAPO / KL-Cov | §3.3, Table 10 |
| 训练数据 | NQ + HotpotQA 混合 | §3.3 |
| batch / lr / warmup | 256 / 1e-6 / 62 步 | §3.3 |
| rollout | 每条 prompt 5 条;temperature 1.0 | §3.3 |
| KL 系数 β | 0.001 | §3.3 |
| max response length | 4096 | §3.3 |
| epoch 选点 | 5 epoch,取验证集平均最高的 checkpoint | §3.3 |
| 硬件 | 单节点 8× A800 | §3.3 |
训练配置(§3.3 · Table 10 给出算法对比)。附录 B.3.4 的 Table 25 另测 group size = 10:Llama-3.2-3B 的 avg 从 35.2 到 35.5、Qwen2.5-3B 反而从 26.0 掉到 24.5。
为什么 Fully-Sim 能省时间?关键在于信息源不是外部服务:一条 rollout 只需一次前向,<information> 由同一个策略一并生成;turns 由模型决定,而不是等 API 返回。§3.4.1 的 Figure 7 显示 Llama 训练初期 response length 和 search 次数都在下降——模型先被格式奖励逼回结构,后期才发展出拆题与自我反思。
Figure 8 是作者对效率的量化:同模型同硬件,SSRL 完成训练所需时间只有 ZeroSearch 的 1/5.53。注意作者给的是「reduction」,而 Figure 8 左图纵轴是 training steps 对 hours,即「达到相同步数所需的墙钟时间」推断(依据 Figure 8 左图轴标注:ZeroSearch 约 25 小时、SSRL 约 5 小时),不是吞吐率。
在线引擎下,多 rollout 就是多 API 调用;论文在 §3.5.4 指出,正因为训练完全离线,更多 rollout 不会带来额外成本——这解释了为什么它能放心每条 prompt 采 5 条、做 5 个 epoch。
对照 Figure 1 左与 §2.2 的 Prompt 模板(Table 1)、§3.2 的信息屏蔽与 Eq. 6–7,把「训练一条 rollout」拆成五个动作。
把「训练最后一步选点」也算进去:每个 epoch 结束看验证集平均 EM,保留最高的 checkpoint。这条和 Table 25(附录 B.3.4)的 group-size 结果放在一起看,说明论文对训练稳定性并不完全不在乎——它花了篇幅说明「有信息屏蔽时 search 次数更高」(附录 B.3.3, Figure 14 左)。
两处结论:同一方法在论文自己的附录表里就出现了反例;Sim2Real 是分模型成立的。
训练数据 NQ + HotpotQA,评测同一批六基准,BrowseComp 因难度和训练数据缺失被排除(§3.3)。下表只挑与 SSRL 最直接可比的一列 Avg。
| 模型 | 类型 | Search-R1-B | Search-R1-I | ZeroSearch-B | ZeroSearch-I | SSRL-B | SSRL-I |
|---|---|---|---|---|---|---|---|
| Llama-3.2-3B | 对照 | 32.6 | 28.2 | 34.0 | 28.5 | 30.5 | 35.2 |
| Llama-3.1-8B | SSRL 领先 | 40.4 | 37.1 | 27.9 | 41.5 | 34.4 | 43.1 |
Table 3(节选)· Avg = NQ、TQ、HotpotQA、Musique、2Wiki、Bamboogle 六基准 EM 平均 · B = Base 起点,I = Instruct 起点 · 本表每个模型节选 6 行,完整 12 行见原文
细拆一下这组数(Python 复算):
| 模型(Qwen2.5-7B-Instruct) | NQ | TQ | HotpotQA | Musique | 2Wiki | Bamboogle | Avg |
|---|---|---|---|---|---|---|---|
| Search-R1-Instruct | 42.4 | 63.4 | 32.8 | 17.4 | 33.2 | 26.4 | 35.9 |
| ZeroSearch-Instruct | 43.6 | 65.2 | 34.6 | 18.4 | 35.2 | 27.8 | 37.5 |
| Self-Search-Instruct | 31.4 | 44.4 | 26.0 | 11.8 | 31.0 | 36.8 | 30.2 |
Table 23(节选,附录 B.3.1,Qwen2.5-7B-Instruct 六基准 EM)· 同一模型上 SSRL 30.2 比 ZeroSearch-Instruct 37.5 低 7.3 个百分点,相对低 19.5%(7.3 / 37.5)
横轴是五次设置,纵轴为该模型的六基准 Avg EM。K 指「用真实 Google 替换模型自编信息的最多轮数」,见 §3.4.2。
读法:Qwen2.5-7B 从纯 SSRL 30.2 一路涨到 K=3 的 47.9(+17.7 个百分点,相对 +58.6%),是全表最漂亮的一段;Llama-3.2-3B 在 K=3 小幅涨到 41.9;但 Llama-3.1-8B 从 43.1 掉到 K=3 的 35.5(−7.6 个百分点,尽管 K=1 时还有 41.6),Qwen2.5-3B 在 K=1 时仅比纯 SSRL 高 3.8 个百分点。
还有一组同样值得看的数据:只训 TTRL、完全不用标准答案(Table 6),比同数据的 GRPO 高得多。Llama-3.2-3B 从 35.2 到 56.1(+20.9 个百分点,相对 +59.4%);但 Llama-3.1-8B 只有 48.7(+5.6 个百分点,相对 +13.0%)。作者在 §3.4.3 也承认 TTRL 模型「over-relying on internal knowledge」,Sim2Real 时几乎只搜一次。注意 Table 8 只列了 Llama-3.2-3B 与 Qwen2.5-3B:3B 的 TTRL→Sim2Real 从 56.1 到 54.5,Qwen2.5-3B 从 43.5 到 42.9。
规律:SSRL 抬高的是内隐知识利用率,不是「接过 Google 就会用」。这一点与 §2.5.1 的发现一致:Self-Search 设定下,加长思考、多轮自搜索、加反思都「同 token 预算下不如朴素重复采样」(Figure 4、5)。
一条是「方法本身的前提失败」,两条是「换环境后反而变差的已知形态」。
论文在 §3.4.2 明说「inherent knowledge within these models remains fixed」。对时效性问题、内部文档、私有库,Full-Sim 根本无从检索。附录 B.3.5 的 Table 27 也给了旁证:SimpleQA 上纯 SSRL 只有 2.7–7.0,接真实搜索 / Entropy-guided 后跳到 30–51——靠的是外部知识。
Llama-3.1-8B 在 K=1 时 41.6、K=3 时 35.5,作者把原因归到「self-search generated information 与外部信息之间的 gap」。如果目标就是「训完立刻能用真引擎」,那 Qwen2.5-7B 的经历(30.2 → 47.9)才是正面例子;同一个方法换模型就能反转。
§2.5.1 报告的 Qwen3 结果显示,更多 thinking token 并不换来更高准确率;同预算下 Multi-turn 与 Reflection 通常还比朴素重复采样差。作者的解释是这时的瓶颈是「知识使用」而非「推理」(§2.5.1 末:「knowledge utilization may be more advantageous than reasoning in these scenarios」)。
min(score, 1.0) * ratio if think_num <= 8 else 0.0,search 与 information 数量不等则在更早处返回 0;但正文 Eq. 7 只按布尔 fformat 给四个常数,「s → f」的映射论文未说明。页面模拟器按 Listing 1 算连续 s、再按页面约定 f = (s > 0) 套 Eq. 7(详情见 §03 格式分说明);这意味着需要长链自我反思的任务可能被格式约束卡住推断。一句话:SSRL 是「在知识已经够用的问题上,把答案更稳定地取出来」的一种廉价训练方案;知识本身不够、或部署时依赖实时外部信息时,它不能替代 Full-Real 检索。