Are LLMs Reliable Code Reviewers? Systematic Overcorrection in Requirement Conformance Judgement
该论文揭示了大型语言模型在代码审查中存在系统性“过度纠正”缺陷,即频繁将符合需求的正确代码误判为不合规,并提出了利用模型生成的修复方案作为反事实证据的验证过滤器以解决这一问题。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
这篇论文就像是在给现在的"AI 代码审查员”做了一次全面的体检,结果发现了一个让人意想不到的“职业病”:它们太挑剔了,甚至到了“吹毛求疵”的地步。
为了让你更容易理解,我们可以把这篇论文的研究过程想象成一场**“招聘面试”**。
1. 背景:我们请了 AI 来当面试官
在软件开发中,写代码的人(程序员)写完代码后,需要有人检查代码是否符合要求(比如“这个按钮点击后应该弹出窗口”)。以前这靠人工,现在大家想用大语言模型(LLM,比如 GPT-4、Claude 等)来当这个**“虚拟面试官”**。
大家原本以为:只要给 AI 更详细的指令,让它“先解释原因,再提出修改建议”,它就能变得更聪明、更靠谱。
2. 核心发现:AI 面试官的“过度矫正”症
论文作者做了个实验,给 AI 看完全正确的代码和有 bug 的代码,然后问 AI:“这段代码符合要求吗?”
结果发现了一个奇怪的现象:
- AI 经常把“好学生”(正确代码)当成“差生”(有缺陷代码)给拒掉了。
- 这就好比一个面试官,明明候选人回答得完美无缺,面试官却皱着眉头说:“虽然你答对了,但我感觉你语气不够自信,或者你用的词太普通了,不符合我‘内心’对完美的定义,所以我不录用你。”
这种现象在论文里叫**“过度矫正”(Over-correction)**。AI 太想表现得“严谨”和“负责”了,结果反而误杀了很多正确的代码。
3. 越“详细”的指令,错得越离谱?
这是论文最反直觉的发现。通常我们认为,给 AI 更多指令(比如:“请一步步分析,指出哪里不对,并给出修改方案”)会让它更准确。
但实验结果像是一个**“回旋镖”**:
- 简单指令(只问“对还是错”):AI 还会偶尔犯错,但不会太离谱。
- 复杂指令(要求解释 + 修改):AI 的误杀率(把对的判成错的)飙升!
比喻:
想象你在考驾照。
- 简单模式:考官只问“你会开车吗?”AI 可能会说“会”。
- 复杂模式:考官说“请详细解释你如何起步、换挡,并指出如果旁边有只猫突然冲出来你该怎么办,最后还要演示一下怎么修车。”
- 结果:AI 为了展示自己“懂行”,开始过度发挥。它可能会说:“虽然你车开得挺好,但你的起步姿势不够优雅,而且如果猫是黑色的,你的反应可能慢了 0.1 秒,所以不合格!”
论文发现,指令越复杂,AI 越容易“脑补”出一些题目里根本没要求的苛刻条件,然后以此为由拒绝正确的代码。
4. AI 的“胡言乱语”与“自相矛盾”
论文还检查了 AI 给出的解释理由,发现两个大问题:
自相矛盾(Self-Contradiction):
- 有些 AI 嘴上说“通过(YES)”,但解释里却列了一堆“这里不行、那里有隐患”;
- 有些 AI 嘴上说“不通过(NO)”,解释里却夸代码写得好,只是语气稍微重了点。
- 比喻:就像面试官一边给你发 Offer,一边在信里写“你其实有很多缺点,但我还是勉强录用你”,让你看得一头雾水。
抓小放大(Symptom vs. Cause):
- 当代码真的错了,AI 能看出“结果不对”(比如算错了数),但它经常搞错原因。
- 比喻:病人发烧了(症状),AI 说是因为“昨晚没盖被子”(瞎猜的原因),其实病人是因为感冒病毒(真正的 bug)。虽然它指出了发烧,但开错了药,反而误导了程序员去修根本不存在的“被子问题”。
5. 解决方案:用“实战演练”来打假
既然 AI 光靠“嘴说”(写解释)不靠谱,那怎么让它老实点?作者提出了一个**“修正过滤器”(Fix-guided Verification Filter)**。
核心逻辑是:别听它瞎编,让它“动手”试试。
- 步骤:
- 如果 AI 说代码有错,并给出了一个“修改版代码”。
- 我们不要听它的解释,而是把**“原版代码”和“修改版代码”**都拿去跑测试题(就像让两个候选人现场做题)。
- 判断:
- 如果原版代码本来就能跑通所有测试,而 AI 非要改,结果修改版反而跑不通了(或者没区别)。
- 结论:AI 是在**“没事找事”!直接推翻它的判决,判定原版代码通过**。
比喻:
这就好比面试官说“你的方案不行,我改了一个版本”。
老板(过滤器)说:“别光动嘴,把你改的和原来的都拿去实际跑一下业务数据。”
结果发现:原来的方案跑得飞起,改完的方案反而卡住了。
老板直接拍板:“原方案通过,你(AI)刚才是在瞎指挥。”
6. 总结与启示
这篇论文告诉我们:
- AI 不是完美的法官:现在的 AI 在审查代码时,太容易“误杀”好代码了,而且指令越复杂,它越容易“想太多”。
- 解释不等于真理:AI 写出的长篇大论的解释,经常是自相矛盾或者抓错重点的,不能盲目相信。
- 用“事实”说话:要解决 AI 的瞎指挥,不能靠给它更多指令,而是要让它把修改方案拿去实际运行测试。用“能不能跑通”这个硬指标,来过滤掉 AI 的过度敏感。
一句话总结:
现在的 AI 代码审查员像个**“过度焦虑的考官”,总觉得自己发现了别人没发现的问题。我们要做的,不是给它更多规则让它更焦虑,而是给它一套“实考题库”**,让它知道:只要代码能跑通,就是好代码,别瞎改!
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。