不要再卷神经验证器了:用维基百科"共现次数"当奖励,事实问答RL训练快 8 倍
核心摘要
事实问答的 RL 训练有个让人头疼的两难:用回答整体的对错当奖励信号太粗,一个推理链里一句对一句错,模型学不到细颗粒度的差异;想做句子级奖励就得堆神经验证器(NLI、LLM judge、知识库验证 pipeline),训练成本爆炸——一个 prompt 拉 16 条 rollout,每条又有好几句话,每句话都要请一次外部验证器,单卡训一次几十小时。
这篇 CorVer(Corpus Verify)的思路特别朴素:句子里的事实正不正确,跟主语-宾语在维基百科里"挨着出现"的频次有直接关系。所以不再训神经判官,把每句话拆出(subject, object)对,去维基百科 Infini-gram 索引上查一次共现次数,按分桶映射成 [-0.3, +0.1] 的小奖励,再通过 token-to-sentence 对齐把句子奖励铺到 token 级 advantage。整套方案每句话只要 0.5B 模型一次前向 + 一次索引查表,毫秒级。
效果是真的能打:6 个基座模型(3B 到 14B)× 5 个事实问答 benchmark 共 30 个 cell,对 Raw 全部正向;和 FoRAG / RLFH / FSPO / KnowRL 四个神经验证器 baseline 比,20 个 cell 里赢 18 个;训练时间快 4.8× 到 8.4×。Llama-3.1-8B 在五个 benchmark 上平均涨 4.06 个点。
我的判断:这不是一篇追求方法新颖度的论文,它的价值在于工程上重新审视了"句子级监督要靠谁来打分"这个假设。神经验证器和策略模型共享参数知识,越是稀有实体越靠不住——你最需要奖励信号的地方它最不准。CorVer 用语料库统计绕开了这个循环依赖,方向对、信号干净、跑得起来。值得做事实问答 RL 的同学认真看看。
论文信息
- 标题:Verifiable Rewards Beyond Math and Code: Lightweight Corpus-Grounded Process Supervision for Factual Question Answering
- arXiv ID:2605.29648
- 链接:https://arxiv.org/abs/2605.29648
- 作者:Shicheng Fan, Haochang Hao, Dehai Min, Weihao Liu, Philip S. Yu, Lu Cheng
- 机构:University of Illinois Chicago
- 发表日期:2026 年 5 月 28 日
一、问题动机:可验证奖励为什么"出了数学和代码就难"
数学和代码的 RL 训练为什么这两年这么火?因为它们有一个其他任务羡慕嫉妒恨的属性——奖励是程序化的。算错就是算错,跑不起来就是跑不起来,calculator 和 compiler 直接给一个确定信号。GRPO 那一套之所以 work,离不开这种"廉价、确定、可大规模"的 verifier。
事实问答没这个福利。

图1:可验证奖励超越数学和代码——CorVer 把"神经验证器"换成"语料库共现索引查表",跳出了句子级奖励必须依赖神经模型的思维定式
那现有方案是怎么处理的?大致两条路:
第一条路:响应级(response-level)奖励。 整段回答对不对给一个分。简单粗暴,缺点也显然——一段推理 trace 里第一句话是正确的事实,第二句话顺手编了个不存在的发布日期,第三句话又把答案给对了。最终 string-match 评成 GOOD,所有 token 拿到一样的正奖励,模型完全学不到"第二句话是错的"。
第二条路:句子级奖励。FoRAG 用 retrieval-augmented 子声明验证,RLFH 让 LLM judge 打分,FSPO 用 NLI entailment,KnowRL 把每个原子事实拿去知识库验。这条路理论上 work,但有两个绕不开的问题:
- 成本爆炸。100 步训练 × 24 个 prompt × 16 条 rollout × 平均 3 句话 ≈ 每次训练 12 万次句子级 verifier 调用。每次调用都要喂给一个 NLI 模型或者 LLM 判官,你算算这个 GPU 账单。
- 循环依赖。这一点其实更致命——神经验证器自己也是 LLM,跟你的策略模型共用一套参数化知识。Kang & Choi (2023) 早就指出过:模型的事实召回能力跟主宾共现频次强相关,稀有实体上验证器自己就不可靠。换句话说,你的策略模型最需要奖励信号去纠偏的地方(rare entity),恰好是你的验证器最盲的地方。
说实话第二点是我看完导言后愣了一下的地方。我之前在做事实校验那条线的时候没特别想过这个问题:默认认为更大的 verifier 一定比 policy 更准。但作者这个论证挺扎实的——既然知识本身就 follow 共现规律,那共享参数化知识的 verifier 必然继承同样的盲区。
CorVer 的解题思路就藏在这个观察里:既然问题根源是"共现频次决定模型记不记得这个事实",那把共现频次本身拿出来当奖励信号,不是更直接吗?
二、方法:把"维基查表"做成训练时的过程奖励
2.1 一句话讲清整体 pipeline

图2:CorVer 整体 pipeline——核心是一条"抽三元组 → 查共现 → 分桶映射 → 对齐到 token"的轻量级链路,全程不调用任何神经验证器
整个流程拆成四步:
- 抽三元组:每句话用一个微调过的 0.5B 模型(QuCo-extractor,基于 Qwen2.5-0.5B-Instruct)抽出 (head, relation, tail),只保留第一个有效三元组(head 和 tail 都不为空、不是代词)。
- 共现查询:把 head 和 tail 都拆成 content words \(w_1, ..., w_k\),丢到 Infini-gram 引擎上做一次 CNF 形式的 AND 查询(在 1000-token 窗口内统计 token 位置级共现)。
- 分桶映射成奖励:把整数计数 \(c_i\) 映射成一个有界的小奖励:
论文里取 \((\alpha_0, \alpha_1, \alpha_2, \alpha_3) = (-0.3, -0.1, 0.0, +0.1)\),\((\tau_1, \tau_2) = (5, 20)\)。这两个阈值不是拍脑袋——后面 §6.1 会讲这是从 700 条人工标注的"共现次数 vs. 正确率"曲线上挑出最大的两个跳变点。
- Token-to-sentence 对齐:用 \(\sigma: \{1,...,T\} \to \{0,1,...,m\}\) 把每个 token 映射回它所在的句子。响应级返回是
每个 token 的 raw return 是
注意这一步:标签和句间空白上的 token 只拿响应级奖励,句子内的 token 在响应级奖励之上叠加该句的局部 shaping。同一条 rollout 里不同句子可以拿到完全相反的局部 advantage——这就是过程监督的精髓,整段 GOOD 的回答里那一句"编了个错日期"的局部梯度可以是负的。
2.2 这个 pipeline 为什么 cheap
每条句子的奖励成本 = 一次 0.5B 模型 forward + 一次 Infini-gram 查表。Infini-gram 是个 disk-based suffix array 索引,单次 CNF 查询毫秒级。整个 pipeline 没有任何 GPU 上跑的神经验证器,也没有外部 API 调用。
我自己复现过类似 retrieval-augmented 的 reward 路径,那种每条 rollout 都要走一遍 dense retrieval + cross-encoder 的方案,单次训练光 reward 计算就能跑掉一晚上。CorVer 这个量级是真的打开了 full-scale rollout 的门——后面我们会看到,跟 FSPO 比快 8.4×。
2.3 一个细节我比较欣赏:奖励量级控制
判官奖励是 \(r_{good} - r_{bad} = +2.0 - (-1.0) = 3.0\),而每条 rollout 平均 3 句话 × \(\alpha_3 = 0.1\),所以共现奖励的最大贡献只有 0.3——比判官奖励小一个数量级。这意味着 CorVer 是 shaping 而不是 override:共现奖励调整 token 级信用分配,但不会把一个明显答错的回答因为"每句话共现都很高"就给翻成正奖励。这个量级关系是显式设计的,不是侥幸。
三、实验:30 个格子全部正向,神经验证器输给查表
3.1 主实验:4 个基座 × 5 个 benchmark
训练只用 NQ-Open 训练集 + WebQuestions,剩下 4 个 benchmark 都是严格的 OOD。
| Model | Method | TriviaQA | NQ-Open | PopQA | SimpleQA | TruthfulQA | Avg. |
|---|---|---|---|---|---|---|---|
| Llama-3.2-3B | Raw | 55.39 | 34.13 | 15.92 | 1.55 | 5.63 | 22.52 |
| FoRAG | 60.66 | 37.15 | 22.53 | 2.22 | 5.20 | 25.55 | |
| FSPO | 22.28 | 10.61 | 4.44 | 0.37 | 3.92 | 8.32 | |
| KnowRL | 49.60 | 30.53 | 15.28 | 1.32 | 5.63 | 20.47 | |
| CorVer | 62.24 | 43.41 | 23.75 | 2.57 | 7.47 | 27.89 | |
| Llama-3.1-8B | Raw | 71.86 | 40.66 | 28.85 | 5.20 | 6.61 | 30.64 |
| FoRAG | 69.40 | 42.71 | 32.17 | 5.32 | 6.31 | 31.18 | |
| FSPO | 63.43 | 39.25 | 23.54 | 5.12 | 8.63 | 27.99 | |
| KnowRL | 68.41 | 38.53 | 25.45 | 2.33 | 6.00 | 28.14 | |
| CorVer | 76.52 | 48.34 | 35.30 | 5.92 | 10.28 | 35.27 | |
| Qwen3-4B | Raw | 51.14 | 24.65 | 17.51 | 2.52 | 8.45 | 20.85 |
| CorVer | 53.77 | 26.59 | 19.33 | 3.12 | 10.65 | 22.69 | |
| Qwen3-8B | Raw | 62.84 | 29.61 | 20.34 | 2.57 | 6.49 | 24.37 |
| CorVer | 63.99 | 32.80 | 21.83 | 2.73 | 9.18 | 26.11 |
Table 1 节选,加粗为该模型块内最好。CorVer 在 20 个 cell 里赢了 18 个,仅在 Qwen3-8B 的 PopQA(落后 0.26 pp)和 SimpleQA(落后 0.58 pp)上输给基线,且都在噪声范围内。
我看 Table 1 的时候有几个判断:
第一,KnowRL 在大模型上反而比 Raw 还差——Llama-3.1-8B 上 KnowRL 平均是 28.14,Raw 是 30.64。这正好印证了导言里的"循环依赖"论点:KnowRL 用知识库验证原子事实,但当策略本身已经 8B 量级、对常见实体已经有靠谱的参数化知识时,验证器的 noise 反而把训练带歪了。
第二,FSPO 在 Llama-3.2-3B 上崩掉了(22.28 对比 Raw 的 55.39,腰斩)。NLI entailment 在 reduced 配置下信号噪声太大,小模型扛不住。这种"baseline 在某些 cell 上灾难性失败"的情况,恰恰说明这些方法的鲁棒性问题。
第三,FoRAG 和 RLFH 在 8B 模型的 TriviaQA 上居然拉跨(FoRAG 69.40,Raw 71.86)。这种"在容易的 benchmark 上反而被 RL 训残"的现象,作者没多说,但其实暴露了基于 retrieval 或 LLM judge 的 reward 在已经掌握得很好的子集上会引入虚假梯度的问题。
3.2 跨模型 scaling:30 个 cell 全部正向

图3:CorVer 在 6 个模型 × 5 个 benchmark 上的提升热力图——所有 30 个 cell 都是正向。最大涨幅集中在 TriviaQA、NQ-Open、PopQA;SimpleQA 和 TruthfulQA 提升较小但都为正(这两个 benchmark 在 3B-14B 范围内 Raw 准确率本就不到 10%,天花板很低)
更值得说的是 NA-rate(refusal)的两种模式:
- Qwen3 家族:refusal 率显著下降,意味着提升来自"把以前拒答的题答对了",而不是无脑乱猜
- Llama 家族:refusal 率反而小幅上升,意味着提升来自"该答的答对了 + 不会的更倾向于拒答"
两种模式都健康,但路径不一样。这个观察对工程落地有价值——不同基座模型 RL 训完后的"性格"本来就不一样,不能用单一 NA-rate 指标评估改进效果。
3.3 训练时间:快 4.8× 到 8.4×

图4:CorVer 训练平均 3.2 小时,FSPO 平均 8.4× 慢,KnowRL 7.8× 慢,RLFH 是最快的 baseline 也慢 4.8×。在 Qwen3-8B 上 FSPO 直接干到 65.8 小时——基本上就是不可行的
这张图我建议想做事实问答 RL 的同学盯着多看几秒。不是说 CorVer 快得多么炫技,而是说 baseline 那一栏的数字直接劝退了所谓的"full configuration"——你不可能用一个标准 LoRA + G=16 的配置去跑 65.8 小时换一个比 Raw 还差的结果。Table 1 里 baseline 都是 reduced configuration(更小的 LoRA rank 和 G)跑出来的,作者也大方承认了这点。换句话说:对比的真正含义并不是同等算力下哪种 reward 信号更好,而是哪种 reward 设计能支撑可部署的训练配置——后者其实是工业落地更关心的问题。
四、关键分析:共现到底为什么 work
4.1 共现次数和事实正确率的真实关系

图5:句子事实正确率随共现次数 c 单调递增——c=0 时只有 23%,c≥20 时达到 81%。这就是把共现当 reward 的实证依据
这张图非常关键。它告诉你:
- c=0(在维基里完全查不到这个主宾对):只有 23% 的句子是正确的——所以 \(\alpha_0 = -0.3\) 给惩罚是合理的
- c≥20:81% 的句子正确——给 \(\alpha_3 = +0.1\) 的奖励
- 阈值选 5 和 20 不是拍脑袋——是 5(+17 个点跳变)和 20(+8 个点跳变)这两个最大的精度断点。中间还有个 c=10 的候选只跳了 +3 个点,被作者明确放弃了
我的第一反应是:这种"先做人工校准再设阈值"的做法,比起直接用某个软函数(sigmoid 之类)映射,可解释性强很多,而且对工程落地友好——线上 debug 时你能直接看每条样本的 c 值落在哪个桶,对应什么奖励。
4.2 消融:per-token 对齐才是灵魂
| 变体 | TriviaQA | NQ-Open | PopQA | SimpleQA | TruthfulQA |
|---|---|---|---|---|---|
| Raw | 71.86 | 40.66 | 28.85 | 5.20 | 6.61 |
| CorVer 完整版 | 76.52 | 48.34 | 35.30 | 5.92 | 10.28 |
| A1: 去掉 QuCo(vanilla GRPO) | 71.3 | 45.9 | 34.6 | 5.4 | 6.8 |
| A2: 去掉 Judge | 76.1 | 42.6 | 31.7 | 4.8 | 7.1 |
| A3: 去掉 per-token 对齐 | 72.9 | 46.3 | 34.9 | 5.8 | 6.6 |
| A4: 去掉 self-filter | 75.0 | 46.0 | 33.5 | 5.1 | 8.0 |
A1 vs A3 的对比是最有意思的——A3 保留了完整的 QuCo 信号总量,但把它退化成响应级标量(即每条 rollout 算出 QuCo 平均后给整段一样的奖励)。结果 TriviaQA 从 76.52 掉到 72.9,跟没有 QuCo 的 A1 (71.3) 差不多。
这就是关键。
共现奖励的价值,主要不来自总分多少,而来自它在 token 层面的差异化分配。一段回答里第一句和第三句受到不同的局部梯度,这个 dense supervision 才是过程监督的本意。把它平均掉就退化成了一个噪声更大的响应级 baseline。
A2(去掉 Judge)在 TriviaQA 上几乎打平 full(76.1 vs 76.52),但在 NQ-Open 上掉了 5.7 个点——TriviaQA 是个相对简单的 benchmark,QuCo 信号自带足够的"答对了大概率共现高"的相关性,但出了 TriviaQA 这种舒适区,judge 还是必要的。
4.3 Gain 归因:是给稀有实体续命还是给热门实体加 buff
这一节我觉得是全文最有判断力的部分。作者抛出两个相反假设:
- Rescue 假说:CorVer 提升最大应该出现在"稀有实体"上——因为模型本来就不会,正好用共现信号纠偏
- Signal-density 假说:CorVer 提升最大应该出现在"热门实体"上——因为热门实体的共现统计才足够稠密,能区分对错
PopQA 提供了维基月浏览量字段,按浏览量四分位切了 Q1(最稀有)到 Q4(最热门)。
| Quartile | Pageviews | Llama-3.1-8B Δ | OLMo-2-13B Δ |
|---|---|---|---|
| Q1(稀有) | 2–224 | +5.47 | +3.68 |
| Q2 | 224–914 | +5.13 | +4.33 |
| Q3 | 914–5,293 | +8.39 | +5.51 |
| Q4(热门) | 5,293–15.1M | +7.50 | +9.03 |
OLMo 是完全单调递增的:越热门,提升越大。Llama 在 Q3 到 Q4 有个小回落(57.06 → 64.55),作者认为这是 ceiling effect(Llama 的 Q4 Raw 已经 57%,OLMo 的 Q4 Raw 才 50%,提升空间不一样大)。
总体上 Signal-density 假说赢了。
这个发现挺反直觉的——按理说 RL 训练应该把模型不会的东西教会,但 CorVer 实际上是在"模型本来就半懂不懂的中等热度实体"上发挥最大作用。这也直接推出了 CorVer 的局限性:在稀有实体上反而是该方法最弱的地方,因为共现统计本身在那里就稀疏。作者大方承认了这一点,比那些藏着掖着的论文舒服多了。
4.4 三元组聚合规则的对比
| 变体 | Cor.(%) | NA(%) | Mean len | Time |
|---|---|---|---|---|
| First(论文采用) | 62.24 | 5.04 | 150 | 1.0× |
| Min(取所有三元组共现的最小值) | 57.27 | 0.33 | 40 | 1.2× |
| RelCheck(再加上关系 token 一起查) | 61.37 | 6.58 | 150 | 1.7× |
这表也很有意思:
- Min 把回答压扁了——平均长度从 150 直接缩到 40。模型学到的不是"产出更多正确事实",而是"产出尽量少的句子来规避被取最小"。这种 reward hacking 的形式特别巧妙,体现了过程监督设计里"任何聚合方式都会被策略 reverse-engineer"的本质矛盾
- RelCheck 太脆:维基百科里的关系 token 有几十种表达("directed" vs "was the director of"),加上去查共现经常返回 0,把正确句子也错杀了
最简单的"取第一个三元组"反而又快又准。作者这个 ablation 让我想起 Sutton 的 bitter lesson——加越多归纳偏置,越容易在某个边缘 case 翻车。
4.5 工程经验
作者还分享了两条"算不上严格结论但 production-relevant"的经验:
1. SFT cold-start 反而伤害事实召回。 用 397B 的 Qwen3 MoE teacher 蒸 CoT trace 给目标模型做 SFT 再 GRPO,比直接对 raw 模型做 GRPO 还差。作者的解释是 capacity mismatch:学生被迫模仿它执行不了的推理链,本来能答对的题反而被"被迫但错误的 deliberation"带歪。这个观察其实跟最近几篇关于"小模型蒸大模型 reasoning 反而退化"的工作一致。
2. 小模型(3B/4B)需要 anchor question 才能稳定训练。 只用 learning-zone(部分对部分错)的样本训 3B/4B 会发散,把"全对"的 anchor 题加回来才稳。8B 以上不需要。这个经验我自己在做小模型 RL 的时候也踩过类似坑——小模型的 reward variance 容易把策略推到一个 "everything looks bad" 的局部最优,需要正样本锚定。
五、我的判断:什么场景该抄这套,什么场景不该
值得直接借鉴的点:
- 核心洞察:奖励信号的可扩展性瓶颈不在"模型够不够强",而在"信号源是不是和策略解耦"。语料库统计是和策略完全解耦的,所以不存在循环依赖。这个思路其实可以泛化到其他任务——比如代码事实校验可以用 code corpus 里的 API 共现频次,medical QA 可以用医学文献共现,说到底都是"用结构化外部信号绕开 verifier 训练成本"。
- Token-to-sentence 对齐的工程意义:Ablation 里 A1 vs A3 的对比直接说明,dense token-level supervision 不是奢侈品,是基础设施。你给整段一样的奖励,跟没给没区别。
- 奖励量级显式设计:让 shaping signal 比主信号小一个数量级,这种 hyperparameter discipline 比所谓的"自动 reward weighting"实用得多。
这套方案的局限性也得说清楚:
- 稀有实体上 CorVer 最弱——这恰恰是事实问答里最让人头疼的子集。论文 §6.3 的 quartile 分析坦承了这一点。如果你的业务场景以长尾实体为主(比如垂直领域的专业 QA),CorVer 的边际贡献会显著缩水。
- 依赖一个 high-quality 的 corpus index。维基够通用,但放到中文场景或者特定行业,你需要自己 build Infini-gram 索引——这部分成本论文里没算进对比。
- Triplet extractor 是 0.5B 微调过的 QuCo。如果你的句子结构跟英文 Wikipedia 训练集差异大(比如多 entity 嵌套、长句、口语),抽出第一个有效三元组的策略可能错过关键事实。
最大的开放问题:CorVer 只在 GRPO 上验证了。论文 §6.6 留了个 future work 说"应该可以泛化到 PPO/REINFORCE/DPO",但实际跑起来什么样没人知道。我个人比较好奇这个 reward 在 DPO 的 preference pair 构造上能不能用——理论上可以,但 preference 学习对 reward 量级和噪声的敏感度跟 policy gradient 不一样。
六、一些工程落地的建议
如果你正在做事实问答方向的 RL 训练,这篇论文里我会重点抄的几个点:
- 先别急着上神经验证器。用语料库共现做一个 baseline,看看能拿到多少。CorVer 的实现复杂度其实极低——一个 0.5B 三元组抽取模型 + Infini-gram 索引就够。
- 永远做 reward 信号的 calibration。论文 §6.1 那个 700 条人工标注的"共现 vs 正确率"曲线,是 CorVer 阈值能选好的根本原因。不要拍脑袋选阈值,做几百条人工标注就能省掉后面的反复调参。
- Token-level alignment 不是优化项是必选项。把任何 sentence-level 信号铺到 token 级 advantage,是这套方案 work 的关键。如果你只是把信号做成 response-level 平均,相当于白搭。
- 先用 Raw + GRPO 跑一遍。论文 SFT cold-start 反而退化的发现挺重要——别默认 SFT warmup 一定有用。
最后,再次想强调一下我对这篇论文的整体定位:它不是方法论上的颠覆,但是工程哲学上的清晰。在 RL 训练越来越卷"用大模型当 verifier 给小模型评分"的当下,能跳出来说"也许我们一开始就不该用神经验证器",这本身就值得点赞。
参考链接
- 论文:https://arxiv.org/abs/2605.29648
- 代码(announced):https://github.com/shichengf/CorVer
- 相关:QuCo (Min et al., 2025) - 推断时共现验证的前置工作
- 相关:Infini-gram (Liu et al., 2024) - 底层语料库索引引擎
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我