WSAI-Math-Distill:一个每条答案都严格验证过的数学蒸馏数据集

开源社区里的数学推理蒸馏数据集不少,规模动辄几万到几十万条。但我在调研时发现两个反复出现的问题:

  1. 答案没有逐条严格验证。部分数据集采用宽松的规范化匹配,格式不同、实质错误的回答也会被判为正确;
  2. 评测集污染。训练题与 AIME 等评测题同源重叠,训练后在榜单上的分数虚高,无法反映真实推理能力。

这两个问题直接影响蒸馏出来的模型质量评估。于是我按「验证和去污染优先于规模」的思路,构建了 WSAI-Math-Distill——一个严格验证的数学长思维链蒸馏数据集。

数据集概况

Split 条数 说明
train 3,867 教师答案经严格判分确认正确,思维链完整非空
rejected 2,582 判分不通过(真实错误或格式不匹配),保留全部字段与 reject_reason

构建参数:

  • 教师模型:DeepSeek deepseek-v4-flash,thinking 模式,输出 reasoning_content + content 双通道;
  • 题源:OpenR1-Math-220k(Apache-2.0)中的竞赛来源题面,去污染后 6,245 题,构成:amc_aime 2,845 / olympiads 2,600 / aops_forum 800;
  • 教师通过率:61%(3,867 / 6,449 次独立求解)。

构建流水线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
OpenR1-Math-220k (93,733 题)
│ ① 题面清洗: 去空/去重(md5)/长度过滤(≤2,500字符) + 来源筛选

候选题池
│ ② 去污染: 8-gram 指纹重叠检测, 剔除 3,444 题

干净题库 (6,245 题, 均带 gold 标准答案)
│ ③ 教师蒸馏: v4-flash 逐题求解 (max_tokens=16384)

6,449 条教师记录
│ ④ 严格判分
│ ⑤ 质量过滤: 思维链非空且 ≥300 字符

train (3,867) + rejected (2,582)

下面展开讲两个关键环节:判分协议和去污染。这两部分是本数据集区别于同类数据集的核心。

判分协议:最严格原始口径

对每条教师回答,执行以下流程:

  1. 只提取正式解答(content)中最后一个 \boxed{...} 的内容作为预测;
  2. 预测与 gold 标准答案按三种方式判等,全部通过才记为正确:
    • 去首尾空白后的精确字符串相等;
    • math_verify 严格语义验证(无任何预处理);
    • 纯数字情形下的浮点精确相等(误差 < 1e-9);
  3. 不做任何规范化:不补 LaTeX 花括号、不去 \text{} 包裹、不剥离选项字母、不提取子串数字、不做模糊匹配。

格式不同即判错。例如模型输出 \boxed{\text{(C) }50} 而 gold 是 50,这条样本进入 rejected,不进入训练集。多答案、选择题字母等无法在原始口径下对齐的样本,一律拒收。

这样做的代价是显性的:61% 的通过率是下界口径,rejected 里包含一部分实质正确但书写形式与 gold 不一致的样本。收益也是显性的:train 里没有任何一条判分注水的样本。对于蒸馏数据来说,我认为这个取舍是值得的——错误答案配上完整的思维链,是最难靠事后抽查发现的污染。

去污染:8-gram 指纹检测

指纹构建过程:

  • 评测集题目文本规范化(小写、剥 LaTeX 命令、仅保留字母数字)后切 8-gram(词级),共计 264,265 个指纹;
  • 覆盖评测集:AIME 2024(30 题)+ AIME 2025(30 题)+ Humanity’s Last Exam 文本子集(2,158 题,仅用于指纹,从不入库);
  • 判定规则:训练题的任一 8-gram 命中指纹,整题剔除。题库阶段剔除 3,444 题;已入库记录经二次回滤,额外剔 27 条后归零。

已知局限:8-gram 重叠可以拦截原题与近原题,无法拦截彻底改写的同构题。这一点在 README 里也如实写明了。

数据统计

p10 p50 p90 max
reasoning(字符) 630 2,721 17,472 58,614
problem(字符) 135 281 505 1,992
content(字符) 113 527 1,035 2,677

几个事实:

  • 思维链语言为英文(3,866/3,867);
  • content 全部以 \boxed{} 收尾,无空链、无短于 300 字符的思维链;
  • 教师(v4-flash)的思维链是简练跳跃风格,短句、草稿式,中位数约 2.7k 字符。

使用方法

加载:

1
2
from datasets import load_dataset
ds = load_dataset("wangshenai/WSAI-Math-Distill")

Qwen3 / Qwen3.5 系列可以直接映射 chat 模板字段:

1
2
3
4
5
6
7
messages = [
{"role": "user", "content": rec["problem"]},
{"role": "assistant",
"reasoning_content": rec["reasoning"],
"content": rec["content"]},
]
text = tokenizer.apply_chat_template(messages, tokenize=False)

通用格式:

1
2
3
4
5
6
7
8
<|user|>
{problem}
<|assistant|>
<think>
{reasoning}
</think>

{content}

与相关数据集对比

数据集 规模 教师答案验证 判分口径 去污染
WSAI-Math-Distill 3,867 + 2,582 逐条 vs gold 最严格(无规范化) AIME24/25 + HLE 8-gram
OpenR1-Math-220k 93.7k 逐条(多口径) 含宽松口径 发布方声明,未附方法细节
OpenMathReasoning 525k 大规模验证 常规 发布方声明

规模上本数据集不占优势。它的定位是:每条可溯源、判分零水分,适合作为小模型数学推理冷启动的高置信种子集,或作为更大混合训练配方中的纯度参照——如果混合数据训练效果异常,可以用它做对照排查。

局限

如实列出:

  1. 规模有限(3,867 条);
  2. rejected 未区分「真实错误」与「格式不匹配」两类;
  3. 题源为英语言竞赛数学(AMC/AIME 难度带为主),未覆盖中文题、多学科与 HLE 式跨域推理;
  4. 教师思维链为简练风格,长链难题(需 >16k token 推理)覆盖不足;
  5. 8-gram 去污染存在固有盲区。

致谢与许可

  • 题目来自 open-r1/OpenR1-Math-220k(Apache-2.0),派生自 NuminaMath;
  • 教师思维链由 DeepSeek deepseek-v4-flash 生成。

数据集采用 Apache-2.0 许可。