Search-R1: Training LLMs to Reason and Leverage Search Engines with Reinforcement Learning
速读卡片 (TL;DR)
一句话:把搜索引擎当作 environment 的一部分,让 LLM 在 <think>/<search>/<information>/<answer> 这套结构里自主地选择什么时候、查什么、查几次,只用 exact-match outcome reward 训 PPO/GRPO,但对检索回来的 token 做 loss masking ——这一个细节是稳定训练的核心。
立场:Search-R1 是 DeepSeek-R1-Zero 的"加搜索"自然延伸——证明纯 outcome reward + RL 足以让 LLM 学会 multi-turn search 这一类需要外部世界交互的能力,前提是别把 environment 返回的 token 也当成自己的输出去做梯度。
1 · 动机:为什么 RAG / SFT-Tool-Use 都不够
1.1 历史脉络:LLM + 外部知识三个时代
2020 - 2024 年间,把外部知识喂给 LLM 一共出现过三套主流范式。每一套都解决了上一套的某个痛点,但都留了一个新坑给下一套。
1.2 别的方案为什么不够
Paper Section 2 把这件事讲得偏温和,这里展开一下每个 baseline 实际卡在哪里:
| 方案 | 核心机制 | 致命短板 |
|---|---|---|
| RAG (Lewis 2020) | 固定 1 轮 retrieve,把 top-k 拼进 prompt | 多跳 QA 第二跳的 query 需要看到第一跳的答案才能写——单轮 RAG 没机会 |
| IRCoT (Trivedi 2022) | Prompted iterative retrieval | 什么时候停、写什么 query 都靠 in-context demonstration,小模型/陌生 domain 立刻崩 |
| ReAct (Yao 2023) | Prompt 让 LLM 输出 Thought/Action/Observation | 同上,frozen LLM,不优化交互能力 |
| Toolformer (Schick 2023) | 自蒸馏 trajectory + SFT | 标注成本高;search 是离散非可微操作,SFT 等价于 imitation,不能修自己犯的错 |
| Self-RAG (Asai 2024) | SFT + reflection tokens | 仍是 SFT 框架,且 reflection 信号需要 GPT-4 教师 |
| Search-o1 (Li 2025) | 把推理模型 (o1-style) 套 prompt 调 search | 不训,小模型上反而比 RAG 还差(见 Table 2 0.206 vs 0.304) |
| R1-zero (Guo 2025) | 纯参数化推理 + outcome RL | 不能访问外部知识,过期信息 / 长尾事实直接幻觉 |
注意一个微妙之处: Toolformer 这条线之所以走不下去,核心不是"工具难学",而是 search 这一步在 forward 里是 非可微 的 ——你没法让 search 操作对 loss 求梯度,所以 SFT 等于先用 teacher 标轨迹再 imitate,模型永远学不到"我这条 query 写错了→retrieve 拿回垃圾→应该改写 query"这种纠错回路。RL 在这里的优势不是"更强",而是"它原生就不需要 retrieve 步骤可微"——只需要最后能给 trajectory 打分。
1.3 为什么这事不平凡
把 RL 接到 search 上听起来直白:就把 search 当工具调用嘛。但作者点出了三个非平凡的工程/理论难题:
- RL framework & stability: 在 rollout sequence 里,LLM 自己生成的 token 和 search engine 返回的 token 混在同一条序列。PPO/GRPO 默认对整条 sequence 算 token-level loss——但 retrieved tokens 不是策略生成的,对它们算 policy gradient 等于"奖励模型记住这段网页文本",训练会失稳。
- Multi-turn interleaved reasoning: 不像数学题那种 single-shot CoT, search 任务的 trajectory 长度不固定,一次还是五次取决于问题难度。RL 训练要能 handle 变长 rollout、要能让 model 自己决定 stop。
- Reward design: 给 process reward (中间每一步好不好) 听起来合理,但需要 reward model,而 reward model 在大规模 RL 里出名地脆弱 (reward hacking)。能不能只用最终答案对不对 这一个 0/1 信号训出多步 search?——R1 在数学上证明可以,作者要把这个结论搬到 search 上。
2 · 背景速查
| 术语 | 含义 |
|---|---|
| PPO | Proximal Policy Optimization. Actor-critic, 用 clipped ratio 限制策略更新幅度,需要一个独立的 value head/critic 估 advantage (GAE)。 |
| GRPO | Group Relative PO (DeepSeek). 抛掉 critic, 一个 prompt 采 G 条 rollout, 用组内平均 reward 当 baseline 算 advantage。收敛快,但训练后期可能 reward collapse。 |
| RAG | Retrieval-Augmented Generation. query → retriever (E5/DPR) → top-k passages → concat 进 prompt → LLM 生成。 |
| multi-hop QA | 答案需要 2 个以上事实串起来。例: "Curious 香水的代言人出生在哪个城市?" 需要先查代言人 = Britney Spears, 再查 Britney 出生地。HotpotQA / 2WikiMultiHopQA / Musique / Bamboogle 都是这类。 |
| exact match (EM) | 预测字符串 normalize 后是否等于 gold answer。Search-R1 唯一的 reward。 |
| retrieved-token mask | 本文核心。在 <information>...</information> 里的 token 全部不参与 policy gradient 和 KL 计算。 |
| rollout | 从当前 policy 采一条 trajectory 的过程。本文 rollout 里 LLM 会主动调用 search engine, 所以 environment 真的参与 trajectory 的形成。 |
| E5 retriever | Microsoft 的 dense embedding retriever, 本文检索器选择。Knowledge corpus 是 2018 Wikipedia dump。 |
速复习 · PPO 目标 (single-step, 无 search 版)
其中 rt(θ) = πθ(yt|·) / πold(yt|·)。Search-R1 在这个 sum 前面挂一个 indicator I(yt)=1 仅当 yt 是 LLM 自己生成的 token (而不是 retrieved 的)。
速复习 · GRPO 与 PPO 差在哪
GRPO 把 critic 砍了,改用 group-relative baseline: 对同一 prompt 采 G 条 rollout, advantage Âi,t = (Ri − mean(R)) / std(R)。少一个网络,显存省一半,但因为 advantage 全局共享,稍稳定性差。GRPO 还把 KL 从 reward 移到 loss 里直接加。
3 · 方法详解
3.1 训练范式: rollout 时让 environment 参与 trajectory generation
普通 RLHF/R1 的 rollout 很简单——LLM 自己一路 sample 到 <eos>,environment 不出现。Search-R1 不一样: rollout 是一个真正的 agent-environment 循环,LLM 生成到 </search> 就被打断,parse 出 query 去打 retriever,把返回 doc 塞进 <information>...</information> 再交回 LLM 续写。
</search> 或 </answer> 才暂停。Worked example: 看一条 rollout 实际长什么样
Paper Appendix 给的 Case Study 11 用的题: "Curious 是哪位歌手代言的女性香水?这位歌手出生在哪个城市州?" Ground truth: McComb, Mississippi。R1 (无 search) 答错: "Houston"——因为它幻觉成了 Beyoncé。Search-R1 的 rollout 实测如下 (略缩):
[user] Curious is a women's fragrance by a singer born in what city and state?
[LLM 自生成]
<think> I need to find out which city and state a singer, by whom the women's fragrance
"Curious" was created, was born in. </think>
<search> Curious fragrance information </search>
↑ 解析到这里就被打断
[Environment 注入,不参与 loss]
<information> Doc 1 (Title: "Curious (fragrance)") ... Curious is a women's fragrance
by Britney Spears for Elizabeth Arden ... </information>
[LLM 自生成]
<think> I need to find out which city and state Britney Spears, the singer behind
"Curious" fragrance, was born in. </think>
<search> Britney Spears birthplace </search>
[Environment]
<information> ... Spears was born in McComb, Mississippi, the second child of ... </information>
[LLM 自生成]
<think> Since Britney Spears was born in McComb, Mississippi, I need ... </think>
<search> McComb, Mississippi location </search>
<information> ... McComb is a city in Pike County, Mississippi ... </information>
<think> I have found ... </think>
<answer> McComb, Mississippi </answer> ← EM(pred, gold) = 1, reward = 1
注意第三次 search 是"过度小心"——模型已经有 McComb 了还要确认一下,这本身是训练里学出来的 self-verification 行为,paper 在 case-study 里专门讨论这件事。
3.2 Retrieved-token masking (本文最关键的方法细节)
这是 Search-R1 的命门。先问"为什么不做 mask 会出事?"
PPO/GRPO 默认对整条 rollout sequence 上每个 token 都算 ratio πθ(yt|y<t)/πold(yt|y<t) 然后乘 advantage。如果 yt 是检索到的 doc 里的 token (它压根不是 policy 采出来的, 而是 environment 写进去的), 那么这一项的语义就崩了:
- policy "想说"什么完全不影响 yt 的出现——但 PPO 仍然给它分配一个 (positive or negative) advantage
- 对正样本: 模型被推着提高 retrieved 段落里那段 wikipedia 文本的 likelihood ——等于在拟合 retrieved corpus 而非学习交互能力
- 对负样本: 模型被推着压低这段文本的 likelihood,可能学出"以后就别相信 retrieve 回来的东西"的反向偏好
- 两种都让 reward 信号通过无关变量(retrieved text 内容)漏出去,梯度 noise 飙升,训练失稳
Worked example: 数值化看看 mask 的影响
设 rollout 长度 |y| = 1000 tokens,其中 LLM 自生成 350,检索注入 650 (3 个 passages × 200+ tokens 很常见)。假设 advantage A=+1 (答对了)。
| w/o mask | w/ mask | |
|---|---|---|
| 对 LLM tokens 算 gradient | 350 项 | 350 项 |
| 对 retrieved tokens 算 gradient | 650 项 (无意义信号) | 0 项 |
| 归一化分母 (token 数) | 1000 | 350 |
| 有效"信号比" | 35% | 100% |
定量上,paper Table 4 直接给了消融: Qwen2.5-7B-base + PPO, 平均 EM 从 0.343 (无 mask) 提升到 0.431 (有 mask), 相对提升 26%。每个数据集都涨,multi-hop 涨得更多 (HotpotQA: 0.325 → 0.433, Bamboogle: 0.304 → 0.432)。
3.3 Reward design: outcome-only, 仅 EM
整个 reward 就一行: r(x, y) = EM(apred, agold) ∈ {0, 1}。
没有:
- 没有 process reward ——不奖励"你 search 得好"、"你 think 得对"
- 没有 format reward ——不强制要求出现
<think>tag (因为模型很快自然学会了,不需要额外奖励) - 没有 neural reward model ——避免 reward hacking,跟 DeepSeek-R1-Zero 一致
"为什么这样设计 / 反向论证": 如果引入 process reward (比如奖励每次 search 都成功 retrieve 相关 doc),会有两个 failure mode:
- 模型为了刷 process reward 学会多 search 但 search 没用 ——增加无谓 retrieve 次数
- 需要训练一个 retrieve-quality reward model,而这个 model 本身可能不准, hack 起来比 outcome reward 还容易
实测 Figure 2(d) 显示模型在没人教的情况下也会逐步学到"多 search 几次", valid search count 从 ~1.4 涨到 ~2.0 —— 因为多 search 真的能提高最终 EM,outcome reward 自己就把这件事 incentivize 了。
3.4 Training Template
训练用的 system prompt 几乎是空的:
Answer the given question. You must conduct reasoning inside<think>and</think>first every time you get new information. After reasoning, if you find you lack some knowledge, you can call a search engine by<search> query </search>, and it will return the top searched results between<information>and</information>. You can search as many times as you want. If you find no further external knowledge needed, you can directly provide the answer inside<answer>and</answer>without detailed illustrations. ... Question: {question}.
注意作者刻意不规定:
- 必须 search 几次
- 必须先 think 再 search 还是反过来
- 什么时候该用 reflection / self-verification
"We deliberately limit our constraints to this structural format, avoiding any content-specific biases"——让 RL 的 learning dynamics 保持可观测、未污染。
4 · 公式: 带 mask 的 PPO / GRPO 目标
4.1 总目标 (Eq. 1)
记号: y = πθ(·|x) ⊕ ℛ —— 交错 rollout sequence。条件 "; ℛ" 表示这条 sequence 是带检索器一起生成的。这件事最大的语义差异: 同一个 prompt x 在不同 random seed 下会得到结构完全不同的 y (search 几次、查什么都可能变),而 RAG 范式下 y 是 deterministic 的 retrieve+generate。
4.2 PPO with Search Engine + masking (Eq. 2)
1 / Σt=1..|y| I(yt) · Σt : I(yt)=1
min( ρt(θ) At, clip(ρt(θ), 1−ϵ, 1+ϵ) At )
]
其中 ρt(θ) = πθ(yt | x, y<t; ℛ) / πold(yt | x, y<t; ℛ), 是 importance ratio。 At 用 GAE 估。
逐项拆解:
- 外层期望: 从 old policy 采 trajectory (PPO 的 off-policy 写法)。注意采的时候 ℛ 真实参与——所以 rollout 必须 online 跑搜索,不能预先离线生成。
- 红色归一化分母 1/Σ I(yt): 只对 LLM tokens 数目归一,不算 retrieved tokens 进分母。Paper 把这件事写在公式里 ——很多实现里会忘掉这一步导致 effective loss 被 retrieved 长度稀释。
- indicator I(yt): 这个 mask 在 forward 里就已经知道——你 parse rollout sequence 时,
<information>...</information>的 span 是 environment 写进去的,直接打 mask=0。 - clip ratio: PPO 标配,ϵ 一般 0.2,限制单步更新幅度避免 policy 跳出 trust region。
4.3 GRPO with Search Engine + masking (Eq. 3)
(1/G) Σi=1..G 1 / Σt I(yi,t) · Σt : I=1 min(ρi,t Âi,t, clip(·) Âi,t)
− β · 𝔻KL[ πθ ‖ πref ]
]
差异点 vs PPO:
- 外层多了对 G 条同 prompt rollout 取平均 (group size G 一般取 5–8)
- Âi,t = (Ri − meanj(Rj)) / stdj(Rj) ——组内 z-score,无需 critic
- KL 从 reward 里挪到 loss 末尾直接加 (PPO 的写法里 KL 通常 shaped 进 reward,GRPO 这样写更稳)
- 关键: paper 明确写"retrieved token masking is also applied when calculating the KL divergence loss" —— KL 也只在 LLM tokens 上算
4.4 退化检验
当 I(yt) ≡ 1 (没有 retrieved tokens), 且 trajectory 只有一步 (无 search),公式退化回标准 PPO/GRPO。所以 Search-R1 可以看作把标准 RL 的 sample 空间从 "single response" 扩展到 "interleaved response + retrieval",再加一个 token-level mask 把 environment 段切掉。这是个很干净的扩展。
4.5 物理直觉
把 mask 想成: RL 只对"我能控制的东西"算账。Search engine 返回什么不在 policy 的控制下,所以不能也不应该归功/归罪给它。这跟经典 RL 里 "stochastic environment transition 不能反传梯度" 是同一个直觉的离散版本。
5 · 实验关键结果
5.1 主表 (Table 2 of paper, Qwen2.5-7B-Base + PPO)
| Method | NQ† | TriviaQA* | PopQA* | HotpotQA† | 2Wiki* | Musique* | Bamb.* | Avg. |
|---|---|---|---|---|---|---|---|---|
| Direct inference | .134 | .408 | .140 | .183 | .250 | .031 | .120 | .181 |
| RAG | .349 | .585 | .392 | .299 | .235 | .058 | .208 | .304 |
| Search-o1 | .151 | .443 | .131 | .187 | .176 | .058 | .296 | .206 |
| R1-base (无 search) | .297 | .539 | .202 | .242 | .273 | .083 | .296 | .276 |
| Reject. sampling (SFT-trajectory) | .360 | .592 | .380 | .331 | .296 | .123 | .355 | .348 |
| Search-R1-base | .480 | .638 | .457 | .433 | .382 | .196 | .432 | .431 |
† = in-domain (训练里见过 NQ + HotpotQA), * = out-of-domain。所有 7 个数据集都 SOTA。平均 EM 从 RAG 的 0.304 → 0.431, 相对提升 41.7% (paper 摘要写 24%, 但摘要里的 24% 是对 RAG baseline 平均的 average relative improvement, 算法不同; conclusion 段写的 41% 才是最大版本,两者都正确,只是分母选法不同)。
5.2 retrieved-token masking 消融 (Table 4, 最 load-bearing)
| Method | NQ | TriviaQA | PopQA | HotpotQA | 2Wiki | Musique | Bamb. | Avg. |
|---|---|---|---|---|---|---|---|---|
| w/ mask | .480 | .638 | .457 | .433 | .382 | .196 | .432 | .431 |
| w/o mask | .388 | .567 | .391 | .325 | .321 | .108 | .304 | .343 |
掉 9 个点。每个数据集都掉。这是整篇 paper 最重要的单一证据: 去掉 mask, RL 几乎白训, 跟 rejection-sampling SFT 同档。
5.3 PPO vs GRPO (Section 5.1 + Table 3)
- GRPO 收敛快 (~100 steps), PPO 慢 (~200 steps), 因为 PPO 要先训 critic warm-up
- GRPO 训久了会 reward collapse, PPO 平稳。Paper Figure 2(a) 里 GRPO 在 ~400 步后突然掉
- 最终性能相当, 但 PPO 更稳。Paper 默认 PPO
5.4 训练动态 (Figure 2)
三件有意思的事:
- Response length 走 V 字: 前 100 步降 (砍 filler words), 后面升 (开始多次 search 导致检索注入变长)。同时 train reward 一路升。
- Valid search count 从 ~1.4 → ~2.0: 模型自己学会多查。不是被 process reward 推的,纯 outcome reward 就把这件事 incentivize 了。
- Base vs Instruct: instruct 起点高, base 收敛慢但最终追平。意味着如果你不在乎 wall time 只在乎 final perf, base + RL 就够了。
6 · 与同类工作对比
| 方法 | 训练? | 多轮 search? | 核心信号 | vs Search-R1 缺什么 |
|---|---|---|---|---|
| RAG (Lewis 2020) | × | 单轮 | — | 不学 query 改写,多跳无能 |
| IRCoT (Trivedi 2022) | × (prompt) | ✓ | — | 不训,泛化差 |
| ReAct (Yao 2023) | × (prompt) | ✓ | — | 同上 |
| Toolformer (Schick 2023) | SFT | 多轮 | imitation | 需 trajectory 标注,不能纠错 |
| Self-RAG (Asai 2024) | SFT | ✓ (reflection) | GPT-4 teacher | SFT 框架,reward 不是 task outcome |
| LeRet (Hsu 2024) | RL | 单轮 query 重写 | retrieval recall | 仅训 query 写法,不学 reasoning 结构 |
| Search-o1 (Li 2025) | × (用 R1/o1 prompt) | ✓ | — | 不训; 小模型反而拖累 |
| R1-Zero (Guo 2025) | RL outcome | 无 search | EM | 无外部知识,纯 parametric |
| ReTool (concurrent 2025) | RL outcome | 多轮 (code tool) | execution outcome | 不同 tool 域(code),但思路同款 |
| Search-R1 | RL outcome | ✓ 多轮 | EM + mask | — |
简单读法: Search-R1 = R1-Zero + 外部 search + retrieved-token mask。它在 paradigm 层面没有发明新东西,但把"outcome RL 能学多步 tool use"这件事在 search 这个最重要的 tool 上做实了,是后来一整批 agentic-RL-for-search 工作的祖师爷。
7 · 局限 / 个人 take / 待验证问题
- Search 是静态语料的 retrieval, 不是真 web: paper 用 2018 Wikipedia dump + E5。真 web search (Bing/Google) 上 noise 大得多, retrieved doc 可能完全不相关 / 含广告。 mask 一定还在帮忙, 但模型在挑 doc 上的能力没被这套 setup 压力测试。
- Outcome reward = EM 太脆: 对开放问答 (生成式答案,非短答案) EM 几乎都是 0。Search-R1 的 reward 不能直接迁到 LFQA / report-writing 这种任务上, 需要更鲁棒的 verifier (LLM-as-judge 或 ground-truth answer set)。
- GRPO 的 reward collapse 没解释清楚: paper 只是观察到 GRPO 训久了崩,没分析 root cause。是 group baseline 的方差问题?还是 multi-turn rollout 让 advantage 估计偏?这是 follow-up 工作可以挖的点。
- Action budget B 是个未调超参: 内层 while loop 最大 B 次 search,paper 没明说 B 取多少。如果 B 太小,multi-hop 数据集吃亏;太大,训练 wall time 飙升。这是 productionize 时的关键调节阀。
- 没和 process-reward baseline 公平对比: paper 论证"outcome reward 够了",但没真把一个 retrieve-quality reward model 接上做对照实验。我会想知道在 PopQA 这种高度依赖单次 retrieve 准确性的任务上, process reward 是不是确实没用。
- Retriever 选择影响有限,但没测最差情况: paper Appendix G 测了 top-k 数量,没系统测 retriever 强弱 (E5 vs BM25 vs Contriever)。如果换 BM25 这种弱 retriever, RL 还能不能学到东西? 学到的是 "改 query 弥补 retriever 弱"还是直接卡死?
待验证 follow-up 问题清单
- 把 retriever 从 E5 (dense) 换成 BM25 (sparse), Search-R1 的 RL 训练曲线和最终 EM 会怎么变? 是否 RL 反而更需要 (因为要靠改 query 弥补检索弱)?
- retrieved-token mask 在 KL 项上的影响单独有多大? paper 只汇报 policy gradient 项 + KL 项一起 mask,没拆开消融
- 在 Bamboogle (4-hop 极端 multi-hop) 上,Search-R1 真的学到了"4 跳"还是只是"碰巧第 2 跳查到了答案"? 需要分析 valid search 分布
- 把 outcome reward EM 换成 LLM-as-judge,在 LFQA 上能否 work? reward hacking 风险有多大?
- Search-R1 学到的 search behavior 是否可以 zero-shot transfer 到 code / calculator 这些 tool? 还是 search-specific?
- GRPO reward collapse 的具体临界点 ——是 group size、KL coef、还是 rollout 长度 dependent?
Memory points · 冷启动复盘
<think> reasoning · <search>query</search> 触发 retrieve · <information> environment 注入 · <answer> 终止并打 EM。