长上下文 RL 训练数据该怎么造?让搜索 Agent 帮你筛干扰项

一篇把"训练数据构造"和"过程监督"两件事一起重做的长上下文 RL 论文


写在前面

你有没有这种感觉:长上下文模型这两年在 needle-in-a-haystack 这种针刺任务上已经接近满分,但一旦把问题换成"在 128K 文档里做多跳推理",表现立刻塌方?

这其实不是模型 attention 不够长。是它从来没被认真训练过——在一堆真正容易混淆的干扰文档里,把推理一步一步做完。

随手翻开一个长上下文 RL 项目的训练数据,你大概率会看到这样的配方:拿一个多跳问题、把几个金标准段落塞进去、然后随机从语料里抽一堆段落补到 128K。这套做法在过去一年是事实标准。但问题在哪里?随机抽的段落和问题语义几乎不沾边,模型一眼就能过滤掉。等于在练"找茬",只不过茬本身是粉色背景上的一只大象。

最近 arXiv 上挂出一篇叫 LongTraceRL(arXiv: 2605.31584)的论文,把这件事重做了一遍。它的两个核心动作非常朴素,但放在一起出奇地有效:

  • 干扰项怎么造:让一个搜索 Agent 先去做这道题,把它读了但最后没引用的文档当成"高混淆度"干扰项,把它搜到了但根本没打开的当成"低混淆度"干扰项,按层叠加到训练上下文里。
  • 奖励怎么算:除了答案对错的 outcome reward,再加一个 rubric reward——沿着推理链上的金标准实体做细粒度过程监督,但只奖励答案正确的样本,避免 reward hacking。

效果:在 Qwen3-4B 上长上下文五个 benchmark 平均 53.3 → 59.0(+5.7),其中最难的 AA-LCR 涨了 8.6 个点。30B 上也能再涨 3.2 个点。

下面把这套东西拆开聊。


论文信息

  • 标题:LongTraceRL: Learning Long-Context Reasoning from Search Agent Trajectories with Rubric Rewards
  • arXiv:2605.31584
  • 作者:Nianyi Lin, Jiajie Zhang, Lei Hou, Juanzi Li
  • 链接:https://arxiv.org/abs/2605.31584

为什么"干扰项的质量"是长上下文 RL 的瓶颈

先把问题摆清楚。

长上下文推理任务的本质是什么?它不是"在 128K 里找一根针"——那是检索。它是"在 128K 里有 5 根真针、95 根假针,你要把真假分清楚,再把 5 根真针按顺序串起来"。

所以训练数据有两个东西决定难度:金标准段落本身的多跳深度、以及干扰段落的"混淆能力"。前者大家都在做(多跳 QA 已经很卷了),但后者一直被低估。

之前主流方法是这样造数据的:

干扰来源 做法 问题
random 从语料里随机抽段落 几乎和问题完全无关,模型一过 attention 就丢掉
search 用问题去 BM25/dense retriever 检索 top-k 后剔除金标准 表面相关,但缺乏"有人真的考虑过它"的信号

LongTraceRL 给了一个数据:用 random 干扰造出来的 128K 训练上下文里,干扰段落和金标准实体的重合率宏观平均只有 1.35 个百分点。这是什么意思?模型根本不需要"推理",只要"有这个实体名就抄过来"就能答对。

这就是过去这套训练范式的核心漏洞。模型学到的不是长上下文推理,是长上下文关键词匹配

说到这里我得插一句。这其实和早年阅读理解数据集的老问题一模一样——SQuAD 时代大家发现模型在做的事是"复制问题里出现过的名词附近的 span",根本没在理解。十年过去了,长上下文 RL 又掉进了同一个坑。


核心洞察:搜索 Agent 已经替你筛过一遍了

LongTraceRL 的第一个聪明的地方在这里。

如果我们想要"语义上真的容易让人混淆的干扰文档",最直接的标准是什么?有没有一个真的在解这道题的智能实体(人或 Agent)认真考虑过它,然后又最终拒绝了它

人的认知里这是显然的——你在写一篇综述,引用了 50 篇,但你大概读过 200 篇,再之前你扫过 1000 篇。那 1000 篇里,被你读但没引用的 150 篇,恰恰是和你的论题最容易"看起来相关但其实没用"的那批。

LongTraceRL 把这个逻辑搬到了 Agent 身上。具体流程见下图:

图1:LongTraceRL 与之前长上下文 RL 方法的对比。左:之前依赖 easy distractors 和 outcome-only 奖励;右:LongTraceRL 用 agent 轨迹分层造干扰、加 rubric reward 做过程监督

图 1:左边是之前的长上下文 RL 方法:随机抽干扰、只看答案对错;右边是 LongTraceRL:让 Agent 先做一遍题,按"读了 vs 只搜到"分层抽干扰,再加沿推理链的实体级 rubric reward。

整套数据构造管道分四步:

图2:LongTraceRL 训练数据构造 pipeline——KG 随机游走→多跳 QA 合成→搜索 Agent 跑轨迹→分层抽干扰→拼成 128K 上下文

图 2:从 Wikipedia 超链接图开始随机游走 8 跳,LLM 合成多跳问题,然后部署搜索 Agent 跑 K=5 条轨迹,按"读了未引用 vs 搜到未打开"把检索文档分两层,组装成 128K 训练上下文。

我把每步的细节按工程视角讲一下。

第一步:用知识图谱随机游走生成多跳问题

在 KILT 的 Wikipedia 超链接图上跑随机游走。从种子实体 \(v_0\) 出发走 \(k=8\) 步,每步让 LLM 从最多 5 个未访问的候选邻居里挑一个最相关的接下去,偶尔插入"疯狂跳跃"避免被局部子图困住。

走完得到一条 8 跳路径 \(P=[v_0, v_1, \ldots, v_8]\)。把这条路径和每个节点的 Wikipedia 段落喂给一个强 LLM,生成一个多跳问题,约束是:

  • 答案是 \(v_8\) 的某个具体属性
  • 推理必须严格走完路径上每个实体,不能跳过
  • 所有可识别信息(人名、日期、地点)都要改写,避免关键词捷径

这一步出来三样东西:问题文本、唯一答案、沿推理链的金标准实体集合 \(\mathcal{E}=\{e_1, \ldots, e_8\}\) 及其原始段落。这个 \(\mathcal{E}\) 是后面 rubric reward 的灵魂。

第二步:让搜索 Agent 跑 K=5 条独立轨迹

部署一个有深度搜索能力的 Agent(搜索、打开、引用三种动作),让它去解这道题。每条轨迹被记录成 \(\tau = [(a_1, d_1), (a_2, d_2), \ldots]\),其中 \(a_t\) 是动作类型、\(d_t\) 是涉及的文档。

每个问题跑 5 条轨迹。只保留至少一条达到正确答案的问题——5 条都失败的问题直接丢掉。这一步过滤之后,留下来的轨迹反映的是 Agent 真实、目标导向的搜索行为,而不是瞎走。

第三步:按"做题人的注意力梯度"分层抽干扰

这是整个工作的灵魂动作。Agent 在解这道题的过程中会接触到大量文档(不算金标准的那些),按它的"投入程度"分两层:

  • 第 1 层(高混淆度):Agent 打开读过但最终没引用的文档。Agent 之所以会打开,说明搜索结果摘要看起来确实和问题相关;之所以没引用,说明读完之后判断它没有真正解题需要的信息。这种文档主题相关但答案误导,是最难的干扰。
  • 第 2 层(低混淆度):在 Agent 的搜索结果里出现过、但Agent 看了一眼摘要就跳过的文档。表面相关但被快速判断不重要。

第四步:traj-tiered 策略组装上下文

从金标准段落开始,先填第 1 层干扰直到接近 128K,不够再用第 2 层补上。所有文档随机打散位置,避免位置捷径。

下面这张表非常说明问题:

干扰策略 干扰文档总数 含 rubric 实体的干扰数 实体召回率 (%) 微平均重合 (%) 宏平均重合 (%)
random 45,392 565 0.16 1.24 1.35
search(BM25 + 剔除金标) 31,412 4,372 2.47 13.92 15.00
traj-random(轨迹中随机抽) 64,066 26,528 8.59 41.41 42.16
traj-tiered(本文) 62,137 29,050 10.34 46.75 50.03
· 第 1 层(读未引) 18,206 10,629 14.65 58.38 63.23
· 第 2 层(搜未读) 43,931 18,421 8.56 41.93 41.75

表 1:不同干扰策略下干扰文档与 rubric 实体的重合率统计。第 1 层干扰在宏平均上达到 63.23%,几乎是 random 的 47 倍。

这张表的意思是什么?在 random 干扰里,128K 上下文中几乎没有一个干扰文档提到推理链上的实体(1.35%)。模型完全可以靠"哪段提到了人名 X,就抄过去"答对题。但在 traj-tiered 第 1 层干扰里,超过 60% 的干扰文档都提到推理链上的实体——模型必须真的判断"这段虽然提到了 X,但说的不是题目要的那个角度",才能不被骗。

我自己第一次看到这个数字的反应是"这个 gap 也太大了"。然后我意识到:之前一年很多长上下文 RL 工作的提升,可能很大一部分是吃在简单干扰的红利上,模型没真的学会推理。


Rubric Reward:沿推理链的实体级过程监督

干扰造硬了,第二个问题来了:怎么知道模型是真的把推理走完,还是靠运气拼出了答案

只看答案对错(outcome-only reward)的问题在长上下文里特别突出——一个 8 跳问题,模型很可能跳过中间 5 跳直接猜对终点。这次是对的,下次换一道题就不对了。但 outcome reward 没法区分这两种"对"。

LongTraceRL 的思路非常直接:既然我们在生成数据时已经记录了沿推理链的金标准实体集合 \(\mathcal{E}\),那就用模型响应里实际提到的金标准实体的召回率作为过程信号。

原始 rubric 分数:

\[\hat{r}_{rb} = \frac{|\{e \in \mathcal{E} \mid e \text{ 出现在响应中}\}|}{|\mathcal{E}|}\]

这个分数衡量"模型推理时引用了多少推理链上必经的实体"。

但直接用这个分数会有两个问题:

问题一:不同问题的 \(|\mathcal{E}|\) 不一样、难度不一样,分数没法跨问题比较。

GRPO 本来就是组内归一化的算法(一个问题采 G=8 个响应,组内做 advantage 计算)。LongTraceRL 顺着这个思路在组内做归一化:

\[r_{rb} = \begin{cases} \dfrac{\hat{r}_{rb}}{\max_{j \in [G]} \hat{r}_{rb}^{(j)}}, & \text{if } \max_{j \in [G]} \hat{r}_{rb}^{(j)} \gt 0 \\ 0, & \text{otherwise} \end{cases}\]

把组内最高分作为参考,让所有响应的 rubric 分都落在 [0, 1]。

问题二:如果对答错的样本也给 rubric reward,模型会学到"反正只要狂列实体名就有分"——典型的 reward hacking。

LongTraceRL 的解法非常干脆——只对答案正确的响应给 rubric reward

\[r = \begin{cases} (1-\alpha) \cdot r_{oc} + \alpha \cdot r_{rb}, & \text{if } r_{oc} \gt 0 \\ 0, & \text{otherwise} \end{cases}\]

\(\alpha\) 是过程监督权重,论文里默认 \(\alpha=0.3\)

这个 "positive-only" 的设计其实非常关键。下面消融会看到,把它去掉(即对答错的也给 rubric reward)平均分会从 59.0 掉到 57.1,AA-LCR 上直接掉 4.8 个点。

这里我想多说一句——这个设计的精神和 process reward model(PRM)有点像,但实现上简单太多了。PRM 需要一个独立的过程评分模型,训练它本身又是一堆问题。LongTraceRL 直接利用了"数据生成时知道推理链上每个实体"这个先验,绕开了 PRM 这一整套基础设施。能这样做的前提是数据是合成的、推理链可控——这恰恰是 KG 随机游走那套数据生成方式带来的红利。两个组件互相成就。


实验:5.7 个点提升来自哪里?

主表如下(Qwen3-4B,5 个长上下文 benchmark 的平均,越高越好):

方法 AA-LCR MRCR FRAMES LongBench V2 LongReason Avg
Base 33.2 36.2 76.7 41.7 78.5 53.3
DocQA 28.8 41.9 78.3 44.6 79.9 54.7
LoongRL 32.0 38.2 75.8 41.8 78.7 53.3
LongRLVR 37.5 41.8 78.5 43.8 80.7 56.5
LongTraceRL 41.8 45.8 79.5 44.1 83.8 59.0

表 2:Qwen3-4B 上的主结果。LongTraceRL 在最难的 AA-LCR 上比 base 涨 8.6 个点,比次好的 LongRLVR 涨 4.3 个点。

几个关键观察。

观察一:DocQA 在 AA-LCR 上反而比 base 还低(28.8 vs 33.2),LoongRL 也持平。这说明简单堆 RL 训练并不必然带来长上下文推理能力的提升——如果训练数据没有足够强的干扰,RL 反而可能让模型过拟合到简单模式。

观察二:AA-LCR 上的提升远大于其它 benchmark。AA-LCR 是 100 道专家精心设计的多跳推理题,平均 100K tokens,是表里最考验"在干扰中坚持推理"能力的。8.6 个点的涨幅几乎是所有方法在这个 benchmark 上的天花板。

观察三:在更大的 Qwen3-30B 上,从 60.5 → 63.7(+3.2),AA-LCR 单项 47.0 → 53.5(+6.5)。说明这套方法不是只在小模型上 work,scale up 到 30B 仍然有显著提升。

但有个值得注意的点——在 DeepSeek-R1-8B 上,提升只有 +1.1(42.7 → 43.8),而其它三个 baseline(DocQA/LoongRL/LongRLVR)甚至让 R1-8B 性能下降。这背后我猜想可能是 R1 的 reasoning 模式和论文采的 rollout 长度(32K)冲突——R1 喜欢写很长的链式思考,32K 预算根本不够。论文里没明确解释这一点,是个开放问题。

训练动态:rubric reward 真的在引导更深的推理

图3:训练动态四件套——(a) 不同规模下 rubric/outcome reward 上升曲线 (b) 加 vs 不加 rubric reward 的 outcome reward 对比 (c) rollout 长度 (d) 截断率

图 3(a):4B/8B/30B 三个规模上 rubric reward 都稳定增长,说明模型逐步学会引用推理链上的金标准实体。

图3(b):加了 rubric reward 后 outcome reward 反而上升更快、更高

图 3(b):LongTraceRL(蓝)的 outcome reward 在训练后期超过了不加 rubric 的 LongTraceRL-GRPO(橙)——证明 rubric reward 不仅监督过程,最终也帮助模型答对更多题。

图3(c):rollout 长度

图 3(c):加 rubric reward 之后 rollout 平均长度明显更长——模型被鼓励做更深的推理而不是抄近路。

图3(d):截断率

图 3(d):120 步左右,许多 rollout 触到 32K 预算上限,但 positive-only 策略把策略往"短而准确"的方向拉回,截断率没失控。这正是防止 rubric reward hacking 的自调节机制。

图 3(b) 是我觉得最有说服力的一张。一个常见质疑是"加 rubric reward 会不会让模型为了堆实体而忽略最终答案"。这张图直接打消了这个疑虑——outcome reward 反而比 outcome-only 训练更高。两个目标不仅没冲突,rubric 还在帮 outcome 涨。


三个消融实验:每个都很关键

消融一:rubric weight \(\alpha\) 怎么取?

α AA-LCR MRCR FRAMES LongBench V2 LongReason Avg
0.1 39.2 46.1 79.0 44.2 82.8 58.3
0.3 41.8 45.8 79.5 44.1 83.8 59.0
0.5 39.0 43.7 77.5 43.5 81.7 57.1

\(\alpha=0.3\) 是甜点。0.1 时过程信号不够强,AA-LCR 这种最难的 benchmark 受影响最明显(41.8→39.2);0.5 时 rubric 权重过大,模型开始走"列实体名"的捷径,全面下滑(57.1,比 0.1 还低)。

消融二:干扰策略对比

干扰来源 AA-LCR MRCR FRAMES LongBench V2 LongReason Avg
random 34.2 40.1 78.0 43.8 82.4 55.7
search 34.2 43.2 79.0 43.9 83.3 56.7
traj-random 35.5 44.2 79.9 44.6 82.8 57.4
traj-tiered 41.8 45.8 79.5 44.1 83.8 59.0

干扰难度排序和下游性能排序完全一致——干扰越难,模型最终越强。其中 random→search 涨 1 个点(说明语义相关有用但有限),traj-random→traj-tiered 涨 1.6 个点(说明在轨迹内部进一步分层、优先用读未引这种最难的,仍然有显著增益)。

最贵的提升是从 search 到 traj 系列:57.4 - 56.7 = 0.7→2.3 个点。这本质上是"在搜过的之上,再加上读过但没用上的"这一信号。

消融三:positive-only 到底有多关键?

奖励策略 AA-LCR MRCR FRAMES LongBench V2 LongReason Avg
Pos+Neg(答错也给 rubric) 37.0 40.5 79.5 45.5 83.1 57.1
Positive-only 41.8 45.8 79.5 44.1 83.8 59.0

平均掉 1.9 个点,AA-LCR 单项掉 4.8,MRCR 掉 5.3。这是消融实验里最大的单项差距之一。

为什么?看图 4:

图4:奖励策略对比——加权奖励曲线显示 Pos+Neg 让模型为了堆 rubric 实体而牺牲 outcome 正确率

图 4:左边的 Pos+Neg 策略下 rubric 和 outcome reward 都比 positive-only 低。combined raw reward 看起来高,是因为答错的样本也在堆实体名拿分——但这是有毒的梯度,最终让模型学到"枚举上下文里类似实体"的捷径。

这一点很反直觉但非常重要。一个看起来更"信息丰富"的 reward 信号(每个样本都有 rubric 分),实际效果反而更差。原因是给答错的样本 rubric reward,等于在告诉模型——哪怕路走错了,只要把沿途景点都列出来也算半分。模型当然会朝最容易拿分的方向跑:只列实体不思考。


一个真实的失败案例 vs 成功案例

论文附录给了一对很说明问题的对照案例:

图5:LongTraceRL-4B 一个完整的训练 rollout,模型在合成多跳问题上沿着推理链依次定位实体

图 5:LongTraceRL 在合成多跳问题上的训练 rollout——模型沿着推理链逐步识别金标准实体并构建论证。

附录里更有意思的是 AA-LCR 上的真实失败/成功对照:

  • 没有 rubric reward 的版本(LongTraceRL-GRPO)面对一个有冲突信息的问题时,直接走捷径——没识别出冲突,用了一个错误的费率(来自一份和问题主体不符的 press release)。
  • 加了 rubric reward 的版本先检查每个候选文档,识别出问题中两个看似相关但实际指向不同实体的子句,最终用正确的 37.6% 费率回答。

这个案例说明的不是"rubric reward 让模型更聪明",而是 rubric reward 让模型不敢偷懒。每跳都要落到具体实体上,跳过会被罚。


我的判断

读完这篇论文,我有几个比较明确的看法。

值得做的工程动作

如果你正在搭长上下文 RL 训练 pipeline,traj-tiered 这一套 distractor 构造方法几乎可以直接复用。它需要的额外基础设施只有:一个能跑搜索的 Agent + 完整的轨迹日志。比起搞一个 PRM 或者 critic 模型,成本低得多。

rubric reward 的实现也很简单——核心就两件事:数据生成时记录推理链上的实体集合 \(\mathcal{E}\)、训练时用字符串匹配(或简单 NER)算召回率。一周内可以接进任何 GRPO/PPO pipeline。

这套方法的边界在哪里

整个故事建立在"问题是合成的、推理链已知"这个前提上。如果你的训练问题来自真实人类标注(比如人写的多跳 QA),rubric 实体的构造会困难得多——你得回过头去标注沿推理链的实体集合。这个标注成本不容忽视。

另外,rubric reward 本质是实体召回率。它对实体型问题(who/what/which)友好,对推理型问题(how/why)的监督粒度可能不够。论文也没提这块的局限。

我比较 skeptical 的点

DeepSeek-R1-8B 上只涨 1.1 个点这件事,论文一笔带过。但 R1 是 reasoning model 的典型代表,如果 rubric reward 在 reasoning model 上的效果远不如在 base model 上,那这套方法的真实适用范围可能比表面看起来窄。这个点值得跟进者去验证。

还有一点:traj-tiered 的第 1 层干扰本质上是"曾经被一个合理的 Agent 考虑过又拒绝的文档"。这套数据的难度上限取决于跑轨迹的那个 Agent 有多强。如果用的是和被训练模型同级别的 Agent,干扰难度会被卡在那个水平上。论文用的是 GPT-5.2 跑轨迹,这本身就是一种隐性的"distillation"——拿强 Agent 的判断给弱 Agent 当训练信号。这不是 bug 但值得意识到。


一段话总结

LongTraceRL 解决的不是一个新问题,而是把长上下文 RL 这套老问题里最被低估的环节——干扰项构造和过程监督——重新做了一遍。它没有引入新模型、没有新算法(GRPO 都是现成的),但通过两个朴素但精确的设计(traj-tiered 干扰positive-only rubric reward),把 Qwen3-4B 的长上下文推理平均分推上了 59.0。在最难的 AA-LCR 上拿到 8.6 个点的涨幅。

如果你做长上下文 RL 训练,arXiv: 2605.31584 这篇值得花一个下午读完,再花一周改进你自己的数据 pipeline。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我