When Models Edit Too Much: On the Fidelity of Minimal Code Edits
Tongyao Zhu, Wei Hern Lim, Min-Yen Kan
EMNLP 2026 (Main)
cs.SE, cs.AI, cs.CL
2026-09-04
NUS 在 400 道 BigCodeBench 题上注入已知最小补丁,发现高 Pass@1 可以和大幅改写共存。一句保留原代码的指令把多余编辑距离从 0.195 降到 0.131,Pass@1 还升 2.3 分。
写代码的模型现在主要比 Pass@1。仓库级基准也还是看测试过不过。维护场景里,补丁还得能审:改得少、别把旁边没坏的设计顺手重写一遍。一个 off-by-one 只需要改一行,GPT-5.4 却删 5 行再塞 60 行校验、类型强迫和重采样,五个测试全过,规格根本没要这些。
作者把这种「修对了但改多了」叫做 over-editing,并做成可测的轴:相对于已知最小补丁,模型还多动了多少。
从 BigCodeBench 抽 400 题,在参考实现上注入一到两处 AST 级损坏,只留会让原测试失败的样本。金补丁就是把注入改回去。函数平均 10.4 行可执行代码,91.8% 的金补丁不超过两个 token,没有题动到两行以上。
指标三条:Pass@1;相对金补丁的多余 token 级 Levenshtein 距离 ELev;相对金补丁增加的认知复杂度。编辑指标只在通过测试的补丁上算。三名五年到十年经验的开发者在 100 对盲测补丁上,ELev 与「更好审」的多数票一致率 94.8%,与「更忠实」一致率 96.9%。
对比两种提示:只说「修好函数」,以及补一句「尽量保留原代码」。后半段用 Qwen3-4B 在 DeepCoder 损坏代码上做 SFT、拒绝采样 SFT、DPO 和带执行加最小编辑奖励的 GRPO 式 RL,并用另一组 20 种损坏测域外。
通用提示下,正确率和保真度是分开的。GPT-5.5 High 的 Pass@1 是 0.823,多余编辑距离超过 Claude Opus 4.7 四倍以上;它自己从 0.299 降到带保真指令的 0.159。50 个前沿设置全部往更小编辑移动,40 个 Pass@1 上升。平均 ELev 从 0.195 降到 0.131,额外认知复杂度降 26.6%,Pass@1 升 2.3 分。
推理模式和更大尺寸都不是单调节。Qwen2.5-Coder 从 14B 到 32B,通用提示下成功补丁的多余距离从 0.108 升到 0.127。切片边界这类损坏 Pass@1 高达 0.874,ELev 也最高,到 0.353:看起来像缺前置条件,模型就会重写数据流。高多余且通过的 530 个补丁里,防御性泛化占 64.2%,数据流重写占 63.2%。
训练侧,SFT 域内 Pass@1 0.932,域外掉到 0.458,LiveCodeBench v6 从 32.6% 掉到 17.7%。RL 域外 Pass@1 0.782,ELev 0.050,LiveCodeBench 33.2%,是唯一不伤通用编码的算法。LoRA rank 64 已经接近全参 RL。单方法 Defects4J 上通过率几乎不动,4B 的 token 编辑从 51.9 降到 35.3,绝对通过率仍只有约 7%。
这是给代码修复补的第二根尺子。只看测试,模型会交一份「更健壮」的重写,审的人还得把无关 diff 剥掉。产品上最便宜的一步是提示里写明保留原文;要写进模型,RL 比 SFT 更能泛化,还不把通用编码能力训没。
范围是局部函数修复。开放式重构本来就该大改,这篇不覆盖。
损坏是人工、函数级、以 Python 为主,比真实多文件缺陷干净得多。训练几乎都在 Qwen 上。人工研究偏小:三个人看 100 对补丁,高多余审计只有一名标注者。Defects4J 只说明编辑偏好能迁到 Java,这些尺寸的绝对修复率仍然低。金补丁按「把注入改回去」定义,82.3% 的高多余通过补丁被判成真多余,其余是另一种合法修法,ELev 会把这些合法替换也算超编。