Tournament_GRPO:让8 份报告打一场淘汰赛
本文最后更新于:2026年11月2日 晚上
Tournament_GRPO:让8 份报告打一场淘汰赛

最近一个月基本都在看 Rubric-Based RL,论文读了不少,但一直没有亲手训过一个模型。
复现 Agentic RL 很吃显卡,rollout、工具调用和训练都需要算力。手里资源有限,很多想法只能停在读论文、写笔记这一步。
这次第一次参与 Agentic-RL Lab 开源项目,在 PyTRIO 的支持下,复现了最近很感兴趣的一篇工作:Tournament-GRPO(EMNLP’26)。终于自己跑完了一次完整训练,还挺开心的哈哈哈。
为什么让报告打一场淘汰赛
这篇工作要解决的问题很具体。
Deep research 这类长报告任务没有标准答案,通常会让 Judge 按 rubric 给每份报告单独打分。可是同一道题采样出来的 8 份报告,在很多检查项上结果都一样。简单的项大家都满足,难的项大家都没做到,最后分数挤在一起,GRPO 能拿到的信号就很弱。
Tournament-GRPO 的想法很朴素:GRPO 只关心同一组里谁更好,那就不要问 Judge「这份报告值几分」,直接问它「这两份哪份更好」。
于是 8 份报告两两比赛,胜者晋级,整场重复 4 次,再按累计胜场计算 reward。
20 steps,花了 92.04 元
我用 Qwen3.5-4B LoRA 跑了 20 steps:
- 1,280 条轨迹,4,480 场裁判比较
- Deep Research Bench 100 题,答案完成率 60% → 98%
- RACE Overall 20.65 → 34.70
- 训练加评测一共 92.04 元
不过分数上涨主要来自模型学会了按时交卷。只看两边都写出报告的 59 题,Overall 是 34.49 → 35.25。 这个结果没有那么好看,但我觉得应该如实写出来。
真正花时间的地方反而是环境
- 工具预算砍短后,模型不知道该收尾。 8 条轨迹都没写答案,这一步就没有梯度。
- Judge 接口失败时,原实现会随机选胜者。 有一步 224 场比较里有 150 场是随机结果,相当于用随机 reward 更新模型。
- 搜索接口对 query 长度有限制。 query 太长会直接报错。
跑完之后,还想弄清楚的两个问题
- 两两比赛重复 4 次,Judge 调用和全部两两比较一样多,能不能少比几次?
- 早期 reward 涨得很快,但大部分来自格式奖励。淘汰赛奖励什么时候才开始起作用?
对 junior 来说,读论文和亲手跑一次训练的感受很不一样。很多细节只有真正跑起来才会发现。谢谢 Agentic-RL Lab 和 PyTRIO 给了这次机会~
完整代码和复现记录在 GitHub:datawhalechina/agentic-rl-lab,Tournament-GRPO 章节。