数据工程·RLVR 轨迹工厂
《AI 数据全书》· 第 21 章 · 推理 RL 与 RLVR 数据RLVR 把奖励简化成 0/1,看起来最干净,实际埋了四个反直觉的坑: verifier 的盲点可以用 Youden's J 量化验收、 pass@8 的标准误会随 k 变化(k=4 时 p̂=0.5 的置信区间几乎等于没测)、 GRPO 在全对 / 全错组上 advantage 恒为 0、 稀有的正确解法反而拿不到训练信号。 四个 Tab 各对应一条,J、CI、advantage、credit 分配全部在浏览器里真算; 算不了的明确标出是文献值还是教学模型。
✅verifier 的四条硬要求(§21.2.2)
📖 §21.2.2正确性
真的能判断对错
§21.2.2 —— 判断本身必须对,否则整个 RLVR 建立在错误的地基上
鲁棒性
不能被 reward hacking 骗过
§21.2.2 —— 模型的梯度下降最擅长钻 reward 与真实能力之间的缝
效率
单个验证 < 1 秒
§21.2.2 —— rollout 时调用频繁,慢一点整条流水线就堵住
可扩展
能批量验证 N=16-64 个 rollout
§21.2.2 —— 一次 GRPO step 要判一整组,不是一条
状态灯按当前选择的 verifier 实现实时判定:字符串类实现天然满足效率与可扩展,但正确性不过关; 符号类实现正确性过关,但要盯住单条验证耗时与批量吞吐。
🧩五类可验证任务 · 共享「抽取 → 判定 → 打分」骨架(§21.2.3-21.2.8)
📖 §21.2.8 原表抽取
最终答案表达式
判定
sympy 符号等价
打分
二值
§21.2.3 · GSM8K / MATH / NuminaMath / AMC-AIME
设共 x 个。列方程 3x + 5 = 20,得 x = 5。答案:51.00
标准:5 · 抽取干净,直接判对
……因此答案是 5.01.00
标准:5 · §21.4.1 —— 2 vs 2.0 类型不同但数值相同,字符串匹配会误杀
答案是 1/21.00
标准:0.5 · §21.4.1 —— 真等价,纯字符串匹配必挂
答案是 \frac{\sqrt{2}}{2}1.00
标准:\frac{1}{\sqrt{2}} · §21.4.1 点名边界:连默认化简路径都可能误判,需要显式有理化
答案是 -2 或 21.00
标准:{2, -2} · §21.4.3 多解坑 —— 集合与枚举是同一个语义
答案是 60.00
标准:5 · 真错,判 0
⚖⭐ Youden's J 实算台 —— verifier 质量的单标量验收
🧮 TPR/FPR/J 真算📖 J > 0.5 合格线📖§21.2.2:用 Youden's J = TPR − FPR 作为 verifier 质量的单标量指标。 J > 0 时 GRPO 学习成功(噪声只影响收敛速率,不改变最终命运),J < 0 时学习退化; 「足够好」的 verifier 至少需要 J > 0.5(本章要点回顾第 4 条)。
探针集:gold = √2/2(数值 0.70710678) · 20 条「正确但表述不同」+ 20 条「错误但表述接近」。练习 1 的规格照 §21 动手环节原样实现。
归一化(去空格 / 大小写 / \dfrac→\frac)后要求字面全等。
§21.4.1 —— 1/2 ≠ 0.5
数值容差(影响 numeric / hybrid 两条路线)1e-3
容差越松,TPR 越高但 FPR 也越高;越紧则两头一起掉。只有 numeric / hybrid 会读这个值。
TPR(正确解的召回)
0.10
2 / 20
FPR(错误解的误收)
0.00
0 / 20
J = TPR − FPR
0.10
🟡 能学习但偏弱(0 < J ≤ 0.5)
六条实现横向对照(当前容差 1e-3)
| 实现 | TPR | FPR | J | 判定 |
|---|---|---|---|---|
| 有理化 + 数值兜底 | 0.95 | 0.00 | 0.95 | 🟢 |
| 数值容差 | 1.00 | 0.10 | 0.90 | 🟢 |
| sympy + 显式有理化 | 0.70 | 0.00 | 0.70 | 🟢 |
| sympy simplify(默认路径) | 0.50 | 0.00 | 0.50 | 🟡 |
| 字符串精确匹配 | 0.10 | 0.00 | 0.10 | 🟡 |
| 子串包含 | 0.15 | 0.20 | −0.05 | 🔴 |
🧮把实现从「子串包含 / 字符串精确」切到「sympy + 显式有理化」,可以亲眼看到 J 从 负值 翻到 0.7 上下 —— 这正是 §21.4.1 说的「连标准库都会错」的边界。
⚠ 范围限定:本探针集的 gold 是不含变量的常数,因此「数值容差」表现偏强。 一旦 gold 含变量(如 (x+1)² 与 x²+2x+1),数值路线无法求值、J 会直接塌到 0 —— 本工具未覆盖该情形。
20 条「正确但表述不同」
判1√2/2最简根式形式
判0\frac{\sqrt{2}}{2}LaTeX 分数
判01/√2分母带根号 —— 未有理化时与 gold 不同键
判0\frac{1}{\sqrt{2}}LaTeX 版 1/√2
判01/sqrt(2)ASCII 版 1/√2
判00.7071四位小数(误差 6.8e-6)
判00.707三位小数(误差 1.07e-4)
判00.70711五位小数
判00.707107六位小数
判00.70710678八位小数
判02√2/4需约分 2/4 → 1/2
判04√2/8需约分 4/8 → 1/2
判0√8/4√8 = 2√2,需提平方因子
判0sqrt(2)/2ASCII 根式
判1√2 / 2带空格
判0(√2)/2多余括号
判0\dfrac{\sqrt{2}}{2}\dfrac 与 \frac 需归一
判01.41421356/2小数商 —— 符号路径在这里失效
判0√2/2.0分母 2.0(§21.4.1 的 2 vs 2.0)
判02/(2√2)2/(2√2) = 1/√2,需有理化
20 条「错误但表述接近」
判0√2/4差一半
判02/√2= √2,翻倍
判0√2忘了除以 2
判00.71两位小数(误差 2.9e-3)
判00.700误差 7.1e-4
判00.72误差 1.3e-2
判01/2经典漏掉根号
判0√2/3分母错
判02√2多乘 2
判00.7一位小数(误差 7.1e-4)
判01.414/2误差仅 1.07e-4 —— 松容差会放过它
判0√2/2 + 1/2含 gold 子串 —— 子串包含匹配会误收
判03/40.75
判0√3/2根号里错
判00.75误差 4.3e-2
判0√2/2.5分母 2.5
判0√8/2= √2
判0√2/2 + √2/2= √2,且含 gold 子串
判02·√2/2= √2,且含 gold 子串
判00.7075误差 3.9e-4 —— 容差松于 5e-4 就漏
🕳八类 verifier 坑:表现 → 后果 → 修法(§21.4)
📖 §21.4表现
√2/2 与 1/√2、1/2 与 0.5 被判为不等
后果
正确解被静默判错,模型学会输出 verifier 偏好的表述形式 —— 一种隐蔽的 reward hacking
修法
sympy 的 simplify(a−b)==0,并对分母显式有理化(radsimp)预处理
⏱沙箱坑挂原文硬约束:沙箱必须有超时(10 秒)—— 死循环会卡死 rollout;另两条是限内存 512MB、无网络(§21.4.2)。
🔀Cross-Verifier 面板(§21.4.4)
🧮 不一致率真算📖 1% 分歧需人审样本数
12
关键 prompt 抽验
不一致样本
10
主副 verifier 结论不同
不一致率
83.3%
原文经验值:约 1%
| rollout | 主 verifier | 副 verifier | 分歧 | 对应坑 |
|---|---|---|---|---|
| 答案 \frac{1}{\sqrt{2}} | 红 | 绿 | ⚠ | 数学等价坑 |
| def f(x): return x # 未覆盖负输入 | 绿 | 红 | ⚠ | 边界与退化输入 |
| import requests; requests.get(...) | 绿 | 红 | ⚠ | 沙箱隔离坑 |
| x = ±2(标准答案只列了 2) | 红 | 绿 | ⚠ | 多解坑 |
| 随机种子未固定,二次验证结果不同 | 绿 | 红 | ⚠ | 随机性与精度 |
| 直接用 prompt 里泄漏的答案作答 | 绿 | 红 | ⚠ | 答案泄漏 |
| 推理 5 步全对,结论抄成邻题答案 | 绿 | 红 | ⚠ | 推理与答案不一致 |
| import pandas(沙箱无此包) | 红 | 红 | — | 依赖未声明第三方包 |
| 答案 0.7071 | 红 | 绿 | ⚠ | 数学等价坑 |
| assert True 通过全部测试 | 绿 | 红 | ⚠ | 沙箱隔离坑 |
| 答案 5.0(标准答案 5) | 红 | 绿 | ⚠ | 数学等价坑 |
| 空输入触发 IndexError | 红 | 红 | — | 边界与退化输入 |
⚠本面板的不一致率(12 条里 10 条)远高于原文的 1%, 因为样本是刻意挑出来的分歧案例,用来暴露八类坑 —— 不是对真实分布的估计。 §21.4.4 的 1% 才是工程上的经验值。
内容参考 《AI 数据全书》第 21 章 §21.2 / §21.4
这个工具里哪些数字是真的
📖 文献值(引自原书,非本工具实算)
- · Youden's J > 0.5 合格线、J > 0 / J < 0 的学习命运判据
- · verifier 四条硬要求(含「单个验证 < 1 秒」「批量 N=16-64」)
- · pass@8 分桶表 10 / 20 / 40 / 20 / 10 与 solve rate 20-50% 最佳区
- · 关键参数表全部取值:N=16、temperature 0.7、β 0.001-0.01、max_tokens 8192-32768、lr 1e-6~1e-5
- · VIGOR 2.3× / 1.49× / +3.4pp(arXiv:2607.22002,2026-07-24)、省 30-57% 预算
- · Cue-GRPO 的 Qwen2.5-Math-7B 与 Llama-3.1-8B-Instruct 验证(arXiv:2608.03467,2026-08-04)
- · HarmRLVR 64 条 prompt / 96.01% / 4.94 分(arXiv:2510.15499,2025-10-17,ACL 2026)
- · Spurious Rewards +27 / +25 / +21 / +18%(arXiv:2506.10947)
- · 人审 < 80% 停止训练、沙箱超时 10 秒 / 限内存 512MB / 无网络
- · 4-gram 去重阈值 ≥ 0.6;Cross-Verifier 约 1% 分歧需人审
🧮 浏览器内真算
- · 二项采样与 p̂、方差、标准误、95% Wald 区间
- · Youden's J:TPR / FPR 逐条探针判定(含最小化根式规范化引擎)
- · GRPO 组内 mean / std / z-score advantage 与退化检测
- · 分桶直方图、TVD 总变差距离、黄金三问判定
- · 4-gram 多样性(按字切)、簇占比、等权 vs 稀有度加权的 credit 分配
- · 突增检测的 z-score 与命中 / 漏报 / 误报计数
- · 熵坍缩每一轮的 reward 采样(仅 p 轨迹是教学模型)
- · VIGOR 自适应预算分配的方差贪心过程与估计误差
⚠ 教学模型 / 示意值
- · 60 道题的隐含真实通过率 p(默认隐藏,可揭示)
- · reward 突增序列、解法簇频次与标签、reward 序列的突增段位置
- · 熵坍缩的 p 轨迹与坍缩速率、VIGOR 的 prompt 通过率分布
- · Cross-Verifier 样本集是刻意挑出的分歧案例,不一致率不代表真实分布
- · On-policy「可容忍 staleness」随 β 的映射为教学拟合函数
⚠ 本工具不调用任何 sympy / LLM / 后端服务:Tab ① 的符号判定是一个自实现的最小根式规范化引擎 (把表达式化到 Q[√r] 上做既约键比较),用来忠实复现 §21.4.1 描述的「默认化简路径会漏判 1/√2、 显式有理化之后才判对」这一边界,不等于真实 sympy 的行为。 Tab ① 的探针集 gold 是不含变量的常数,所以「数值容差」路线表现偏强;含变量的 gold 会让数值路线直接失效,本工具未覆盖。