QAQ: Bidirectional Semantic Coherence for Selecting High-Quality Synthetic Code Instructions¶
会议: ACL2026
arXiv: 2603.12165
代码: 未开源
领域: 代码智能 / 合成数据筛选
关键词: 合成代码指令, 数据选择, 反向互信息, 困难样本, 模型分歧
一句话总结¶
QAQ 从“答案能否反推出问题”的反向语义一致性出发,用分层 RMI 与强弱模型分歧筛选合成代码指令,只用 25% WarriorCoder 数据就接近全量训练,并显著优于 IFD 等传统数据选择指标。
研究背景与动机¶
领域现状:代码生成模型越来越依赖大规模合成 instruction-response 数据。Magpie、WarriorCoder 等 seedless 合成管线可以直接从对齐模型交互中生成大量代码任务,但也会带来幻觉术语、无意义查询、问答错配和答案模板化等噪声。
现有痛点:很多数据选择方法只看 answer 方向,例如 IFD 衡量给定 query 后生成 answer 的难度,即 \(A|Q\) 方向。这个角度在干净数据上能找到“模型还没掌握”的样本,但在噪声合成代码数据上会混淆两种情况:任务本身难,或者 query/answer 本来就不匹配。
核心矛盾:合成代码数据的质量问题常常隐藏在 query 侧。一个答案可能是语法正确的代码,但 query 是伪造术语或非代码请求;如果只评价答案质量,就会把这类样本误认为高质量。
本文目标:设计一个可规模化的数据筛选方法,既能过滤语义错配和表面重复,也能保留对代码模型真正有训练价值的难样本,从而降低微调成本。
切入角度:作者把方向反过来,问“看到答案后,模型能不能更好地预测原问题”。一个真正贴合问题的代码答案应该含有足够信息,让模型推断它解决的是哪类任务;反之,错配答案对问题几乎没有解释力。
核心 idea:用 Reverse Mutual Information 评估 answer 对 query 的解释力,并通过强弱模型的分歧保留“强模型看出其有效、弱模型仍觉得困难”的样本。
方法详解¶
QAQ 的关键不是简单取 RMI 最大的样本。作者先定义反向互信息,再发现 RMI 的两个极端都可能有问题:过低常表示 query-answer 错配,过高可能是答案直接复述 query 或包含容易被模型识别的缺陷模式。因此 QAQ 还加入 question complexity 分层和强弱模型 disagreement,让筛选逻辑从“高分优先”变成“同复杂度内的适中质量 + 有认知差距”。
整体框架¶
输入是大规模合成代码 instruction-tuning 数据集 \(D={(Q_i,A_i)}\)。QAQ 先用语言模型分别计算 query 的困惑度 \(PPL(Q)\) 与给定 answer 后 query 的困惑度 \(PPL(Q|A)\),得到 RMI;再按 \(PPL(Q)\) 把样本分成 10 个复杂度 bin,在每个 bin 内做 RMI 排名;最后用强模型和弱模型分别计算分层 RMI rank,保留强模型 rank 高、弱模型 rank 低的 Diff-High 样本,形成约 25% 的训练子集。
关键设计¶
-
反向互信息 RMI:
- 功能:衡量答案对问题的解释力,而不是问题对答案生成的帮助程度。
- 核心思路:定义 \(RMI(Q,A)=log PPL(Q)-log PPL(Q|A)\)。如果看到答案后 query 变得更容易预测,说明答案与问题语义一致;如果变化很小,则可能是错配或无关样本。
- 设计动机:代码答案通常包含函数名、输入输出、算法结构和边界条件,这些信息应当反映问题规格。反向建模能直接检查“代码是否真的对应这个题”。
-
按问题复杂度分层的 RMI rank:
- 功能:避免简单问题因为天然低 \(PPL(Q)\) 而被全局 RMI 排名误伤。
- 核心思路:先按 \(PPL(Q)\) 分成 \(K=10\) 个 decile,每个 bin 内独立计算 RMI rank 并归一化到 \([0,1]\)。这样简单题只和简单题比较,复杂题只和复杂题比较。
- 设计动机:论文发现 RMI 与 \(log PPL(Q)\) 呈异方差关系,低复杂度问题的 RMI 天花板较低;如果全局排序,会把简单但有效的样本过滤掉。
-
强弱模型分歧 Diff:
- 功能:从 RMI 信号中拆出“有效但有学习价值”的样本。
- 核心思路:用 DeepSeek-Coder-6.7B-Base 作为强模型、Qwen3-0.6B 作为弱模型,分别得到分层 RMI rank \(r_s\) 与 \(r_w\),定义 \(Diff=r_s-r_w\)。Diff 高表示强模型能识别 query-answer 关系,而弱模型还不能,最终用 \(Diff>0.1\) 保留约 25% 样本。
- 设计动机:强弱都高的样本可能是重复或答案复述问题,强弱都低的样本可能是坏数据或过难样本;强高弱低才更像“有效且可学”的训练信号。
损失函数 / 训练策略¶
QAQ 本身是数据选择策略,不改变下游代码模型的损失函数。实验中作者用 LlamaFactory 对 DeepSeek-Coder-6.7B-Base 微调 3 个 epoch,按数据规模调整 batch size 与学习率:全量数据 batch size 512、学习率 1.2e-4;50% 数据 batch size 256、学习率 0.8e-4;25% 数据 batch size 256、学习率 0.4e-4,warmup ratio 为 0.2,cosine decay。评估采用 greedy decoding,在 HumanEval、HumanEval+、MBPP、MBPP+ 上看 pass@1。
实验关键数据¶
主实验¶
| 方法 | 数据比例 | HumanEval | HumanEval+ | MBPP | MBPP+ |
|---|---|---|---|---|---|
| Full Data | 100% | 78.05 | 72.56 | 71.69 | 59.52 |
| RMI Top 50% | 50% | 78.05 | 73.17 | 72.22 | 58.20 |
| RMI 50-75% | 25% | 77.44 | 72.56 | 71.43 | 58.47 |
| Random | 25% | 73.78 | 69.51 | 68.52 | 57.67 |
| IFD | 25% | 71.95 | 66.46 | 64.81 | 54.76 |
| RDS+ | 25% | 76.83 | 71.34 | 71.69 | 58.99 |
| SCAR | 25% | 75.00 | 70.73 | 70.63 | 57.67 |
消融实验¶
| 选择策略 | HumanEval | HumanEval+ | MBPP | MBPP+ | 说明 |
|---|---|---|---|---|---|
| Diff-High | 77.44 | 71.95 | 71.43 | 58.73 | 强高弱低,本文核心策略 |
| Sum-High | 74.39 | 68.90 | 71.16 | 59.52 | 强弱共识高,可能混入复述模式 |
| Sum-Low | 71.34 | 65.85 | 66.14 | 55.56 | 强弱共识低,质量最差 |
| Diff-Low | 71.34 | 67.07 | 74.87 | 62.43 | 更偏简单模式,对 MBPP 有利 |
关键发现¶
- RMI 与 IFD 相关性很低,Spearman 仅 0.252,说明 \(Q|A\) 与 \(A|Q\) 捕捉的是不同质量维度。
- 25% 的 RMI 50-75% 样本几乎达到全量训练效果,HumanEval+ 与 Full Data 同为 72.56。
- Diff-High 与 Sum-High 选择集合重叠只有 13.85%,表明模型分歧挑出来的是很不一样的一批样本。
- 同一模型微调前后 RMI 排名相关性为 0.9539,说明 RMI 有较强稳定性,适合一次性静态筛选。
- 在 Magpie-Qwen2.5-Coder-Pro-300K 上,QAQ 25% 数据也取得较均衡结果:HumanEval 71.95、HumanEval+ 65.24、MBPP 68.25、MBPP+ 56.35。
亮点与洞察¶
- 最巧妙的点是把“代码能否解释题目”作为质量信号。代码生成任务天然具有 answer 结构化、query 规格化的特点,反向预测比一般文本任务更有语义解释力。
- RMI 两端都可能坏这一观察很重要。低 RMI 是错配,高 RMI 也可能是关键词 echo 或 paraphrase 捷径,所以简单 top-k 不够,必须结合分层和分歧。
- 强弱模型分歧把数据选择从“找最容易识别的高质量样本”改成“找强模型能看懂、弱模型还需要学的样本”,这和 curriculum / zone of proximal development 有相似直觉。
- 该方法对训练成本很友好:RMI 计算可以离线做,筛完后只用 25% 数据微调即可接近全量性能。
局限与展望¶
- 主要实验集中在 WarriorCoder,补充验证也只是另一个 seedless 合成代码数据集;对 seed-based 数据、通用指令数据和领域代码数据的泛化还需要更多证据。
- RMI 计算需要对大规模数据跑 teacher-forcing perplexity,虽然比全量微调便宜,但仍依赖多 GPU 离线评分。
- 强弱模型的选择会影响 Diff 信号。论文显示不同 pair 都有效,但还没有给出自动选择 model pair 的原则。
- 对非常短的问题或非常长的答案,RMI 可能仍受长度、模板、语言风格影响,需要进一步校准。
- 论文未开源实现,复现实验中的 chat template、per-token normalization 和筛选阈值细节需要格外小心。
相关工作与启发¶
- vs IFD: IFD 看 \(A|Q\) 方向,关注 instruction-following difficulty;QAQ 看 \(Q|A\) 方向,关注答案对问题的解释力,对 query 质量更敏感。
- vs Superfiltering: Superfiltering 用弱模型近似强模型评分以节省成本;QAQ 反而利用强弱不一致,把分歧本身当作信号。
- vs SCAR: SCAR 关注 instruction-response 风格一致性,QAQ 更直接建模语义一致性,因此在跨 benchmark 上更均衡。
- vs RDS+ / coreset: RDS+ 需要目标任务 seed,而 QAQ 不依赖下游测试集种子,更适合通用合成数据清洗。
评分¶
- 新颖性: ⭐⭐⭐⭐ 反向互信息加模型分歧的组合很有辨识度。
- 实验充分度: ⭐⭐⭐⭐ 主结果、分歧消融、跨数据集和 model pair 敏感性都覆盖到了。
- 写作质量: ⭐⭐⭐⭐ 动机清楚,失败模式示例直观,表格信息量高。
- 价值: ⭐⭐⭐⭐ 对代码指令数据清洗、合成数据去噪和低成本微调都有实用意义。