跳转至

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% 的训练子集。

关键设计

  1. 反向互信息 RMI:

    • 功能:衡量答案对问题的解释力,而不是问题对答案生成的帮助程度。
    • 核心思路:定义 \(RMI(Q,A)=log PPL(Q)-log PPL(Q|A)\)。如果看到答案后 query 变得更容易预测,说明答案与问题语义一致;如果变化很小,则可能是错配或无关样本。
    • 设计动机:代码答案通常包含函数名、输入输出、算法结构和边界条件,这些信息应当反映问题规格。反向建模能直接检查“代码是否真的对应这个题”。
  2. 按问题复杂度分层的 RMI rank:

    • 功能:避免简单问题因为天然低 \(PPL(Q)\) 而被全局 RMI 排名误伤。
    • 核心思路:先按 \(PPL(Q)\) 分成 \(K=10\) 个 decile,每个 bin 内独立计算 RMI rank 并归一化到 \([0,1]\)。这样简单题只和简单题比较,复杂题只和复杂题比较。
    • 设计动机:论文发现 RMI 与 \(log PPL(Q)\) 呈异方差关系,低复杂度问题的 RMI 天花板较低;如果全局排序,会把简单但有效的样本过滤掉。
  3. 强弱模型分歧 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 敏感性都覆盖到了。
  • 写作质量: ⭐⭐⭐⭐ 动机清楚,失败模式示例直观,表格信息量高。
  • 价值: ⭐⭐⭐⭐ 对代码指令数据清洗、合成数据去噪和低成本微调都有实用意义。