AI 编程模型又暴露出一个比“会不会写”更贴近工程现场的问题:它们常常会修好 bug,但不肯只修 bug。针对 400 个程序化造错代码样本的评测显示,主流模型普遍会多改一截代码,像是在修补丁,也像在顺手接管函数。
这对高频使用 Cursor、Copilot、Claude Code 的团队很现实。棕地开发里,最稀缺的不是生成能力,而是边界感。你让它当编辑,它却很容易演成重构者。
这项评测测的不是会不会修,而是会不会只改该改的地方
研究者从 BigCodeBench 里取了 400 个样本,再程序化注入单点错误。比如把 < 改成 <=,把 + 改成 -,把 True 改成 False。因为错误是人工构造且只有一处,最小修复路径也就不是拍脑袋定义的。
这很关键。它让“最小改动”从主观审美,变成了可验证目标。对于衡量修 bug 场景,这比泛泛讨论“代码写得优不优雅”更有用。
评测看了三类东西:
- 能不能修对.Pass@1
- 修对之外多改了多少.token-level Levenshtein distance
- 多出来的理解负担有多大.Added Cognitive Complexity
光看 Pass@1,其实不够。测试通过,只能说明结果没错;它不能告诉你 reviewer 还要不要重新读半个函数。后两项指标,盯的就是这笔隐藏成本。
| 模型 | 正确率表现 | 改动幅度 | 结论 |
|---|---|---|---|
| Claude Opus 4.6 | 最高,Pass@1 达 0.912/0.900 | Levenshtein 0.06/0.08,最接近最小修复 | 修得对,也收得住 |
| GPT-5.4 | 0.723/0.770,不突出 | 0.395/0.327,过度编辑最明显 | 改得多,收益却不高 |
| Gemini 3.1 Pro、GLM 5、Qwen 3.6 Plus | 整体中上 | 改动明显小于 GPT-5.4 | 可用,但风格差异很大 |
这里最值得看的一点,不是谁“能写代码”,而是谁尊重补丁边界。Claude Opus 4.6 在正确率和最小改动上都占优。GPT-5.4 则相反:改动幅度最大,正确率也没有拉开差距。
研究里的一个典型例子是 off-by-one 错误,本来只要把 range(len(x) - 1) 改回 range(len(x))。但有的模型会连输入校验、数组处理、绘图逻辑一起改。测试可能照样过,工程上却未必算合格。
受影响最直接的,是棕地开发团队和做 code review 的人。单点 bug 本来只该审局部逻辑;一旦 AI 把半个函数都翻一遍,评审就从“验补丁”变成“验新代码”。工时会上去,信任会下来。
一句提示词就能压住,说明默认风格有问题,不是能力做不到
这项评测还做了一个很实用的对照:在提示词里明确要求“尽量保留原代码和原有逻辑”。结果很直接,几乎所有模型都更收敛了。
Levenshtein 距离普遍下降。多数模型的 Pass@1 还一起变好。推理模型的改善更明显。
这至少说明一件事:过度编辑不是纯粹能力缺陷,更像默认风格。模型不是不会少改,而是默认更愿意多写、多补、多换实现。
我不太买账的一种说法是,把这种行为包装成“更智能”。在真实仓库里,很多“看起来更聪明”的改写,最后只是把审查成本、回滚风险和维护债务转嫁给团队。所谓“天下熙熙,皆为利来”,放到模型产品上,利未必是钱,也可能是训练目标和产品激励:更完整的回答、更强的存在感、更像一个会主动发挥的资深工程师。
问题在于,修 bug 不是写样板房。棕地开发讲的是可审、可控、可回滚。多写出来的每一行,理论上都要重新承担一次责任。
这里也要把边界说清。不能把这个结果直接写成“推理模型更差”。更准确的表述是:它们默认更爱扩写,但在明确约束后也更能收住。这个差别不小。前者是在下结论,后者是在谈可控性。
对一线团队来说,马上能做的动作其实很具体:
| 角色/场景 | 更现实的做法 | 原因 |
|---|---|---|
| 高频用 AI 修 bug 的开发者 | 把“尽量保留原逻辑、最小改动、不要重构无关代码”写进默认提示词或规则文件 | 成本最低,收益最直接 |
| 技术负责人/评审者 | 评估工具时把 diff 大小、复杂度变化纳入检查,不只看通过率 | 测试过了,不等于 review 成本可接受 |
| 正在采购或续用编码助手的团队 | 暂时别只按 benchmark 排名拍板,先用自家仓库的修 bug 任务做对比 | 这类场景最能暴露“改得太多”的真实代价 |
如果你的团队主要让 AI 写新模块,这项评测的杀伤力没那么大。可如果你们拿它处理老代码、线上补丁、遗留系统,那这件事就很要命。场景不同,结论也该有分寸。
真正要观察的,不是哪家模型更会写,而是哪家愿意把“克制”做成默认值
这项研究当然有边界。它用的是程序化单点 corruption,更适合衡量最小修复能力,不等于覆盖复杂需求变更、多文件联动、架构调整这些真实任务。所以,不能把它泛化成“AI 编程整体不行”。
但它确实把一个长期被 benchmark 稀释的问题拎了出来:测试通过,不等于工程上合格。软件工程里,很多成本都不在生成那一刻,而在后面的 review、回归、回滚、交接。模型把代码改得越多,这些成本就越容易被偷偷放大。
这不是什么新戏码。早年的自动格式化、自动重构工具也碰过同一个坑:自动化最麻烦的地方,往往不是做错,而是越权。AI 只是把“越权编辑”放大了,因为它写得更快,也更像有道理。韩非子讲“治大国若烹小鲜”未必适合所有场景,但拿来形容修补老代码倒很贴切:火候太猛,锅先糊。
接下来最该观察三件事:
- 模型厂商会不会把“最小改动”做成默认策略,而不是藏在提示词里
- 工具链会不会把 diff 大小、复杂度增量做成显式评估项
- 更多评测会不会把单点修复之外的真实仓库任务也纳入,看看结论能扩展到哪一步
如果这三件事都没有发生,那所谓 AI 编程进步,很可能只是把“会写更多”继续误当成“更适合工程”。代码生成会越来越便宜,审查注意力不会。真正稀缺的,还是后者。
