跳到主要内容
返回时间线
arXiv来源发表:

单元测试奖励教模型多改代码:PreciseCoder把平均改动从7–15行压到3行,通过率不降

核心概要

只用单元测试做强化学习,模型通过率上去了,却学会多改代码、甚至在本来正确的程序里编造缺陷。PreciseCoder在单元测试奖励之外加入一项按参考修复逐处核验的编辑精确率与召回率信号,在4B、9B、27B模型上把平均改动行数从7–15行降到3行,通过率与只用单元测试训练持平,并让正确代码上的不改动率升到47–52%。

AI-generated editorial illustration: PreciseCoder: Faithful and Generalizable Debugging Beyond Unit-Test Rewards

深度剖析

代码模型调试后的补丁可以更小:在4B、9B、27B三个规模上,训练后的模型平均只改约3行,而此前同类训练要改7–15行。 只用单元测试的强化学习会随训练推高通过率,同时让改动行数从3.94行涨到8.28行,并在正确程序上把不改动率从30.8%压到末三次评估平均20.5%。 在PDB测试集上,Qwen3.5-4B的改动行数从只用单元测试GRPO的13.8行降到3.0行,通过率55.3%对55.1%;9B为3.0行对11.9行,通过率62.5%对63.9%。

奖励不再只看程序是否通过测试,而是逐处核对每段改动是否真的修掉了某个缺陷、以及改动的行里有多少是必要的。 此前的做法是惩罚改动行数或模仿最小补丁,但改动大小与能否通过测试相关性很弱,直接优化它会拿通过率换小改动。 在Qwen3.5-4B上,只奖励精确率可把精确率提到69.0–70.1%、改动降到2.5–2.6行,但通过率比组合奖励低3–5个百分点;只奖励召回率则通过率最高57.2%、精确率最低52.2%。

只在单行缺陷上训练出的精确性,能带到多行缺陷、仓库级修复和智能体式多轮编辑中。 训练数据全部是单文件单行缺陷、一次成稿的修复,从未出现多行或仓库级任务。 在PDB-Wild的484个多行与仓库级任务上,4B、9B、27B的编辑精确率分别比基座模型高20.3、16.7、20.2个百分点,平均改动从37.8行降到10.8行、33.9行降到12.0行、18.4行降到6.8行;在SWE-Bench Verified上,9B模型解决32.7%的问题,基座为25.9%。

启示与展望

全部训练与评测都在Python上进行,训练任务来自BigCodeBench与LiveCodeBench派生的PDB单行缺陷,评测覆盖PDB测试集、PDB-Wild、SWE-Bench Verified、HumanEval+、CruxEval与DebugBench的Python子集;奖励需要每个训练任务都有一份参考修复,可来自基准、人工补丁或通过测试的模型生成修复。

精确率与召回率以参考修复为基准计算,因此每个训练任务都需要一份参考修复;计算这两项并做语义核验会让训练墙钟时间比只用单元测试增加约5–7%。作者指出方法本身不限于Python,但尚未在其他语言上运行实验。