[Paper] LLMs 会信任它们写的代码吗?
发布: (2025年12月8日 GMT+8 18:38)
7 min read
原文: arXiv
Source: arXiv - 2512.07404v1
概览
大型语言模型(LLM)在写代码方面已经出乎意料地优秀,但它们仍然经常生成有缺陷的代码片段。本文提出了一个简单却深刻的问题:LLM 是否“知道”它们生成的代码是否正确? 通过探测四种流行代码生成模型的隐藏状态,作者发现了一种内部的“正确性信号”,可以在不运行任何测试的情况下对生成的程序进行排序和过滤。
关键贡献
- 发现内部正确性表征 – 证明了在相同任务的正确解和错误解之间,隐藏激活会系统性地不同。
- 对比探测技术 – 引入一种轻量方法,通过比较成对的正确/错误代码示例来提取正确性信号。
- 优于对数似然的排序 – 表明使用提取的信号能够超越传统的基于概率的排序,甚至优于口头化的置信度输出。
- 无测试的质量筛选 – 提供一种实用方式,在不执行代码的情况下挑选更高质量的代码样本,降低对昂贵测试套件的依赖。
- 跨模型验证 – 在四种 LLM(包括开源和闭源变体)上的实验表明该现象并非模型特有。
方法论
- 数据集构建 – 对每个编程任务(例如 “反转字符串”),作者收集了多个生成的解并使用自动化测试套件将其标记为 正确 或 错误。
- 隐藏状态提取 – 在模型生成每个解的过程中,记录最终的隐藏向量(即软最大输出之前的表示)。
- 对比探测 – 训练一个简单的线性分类器(逻辑回归),利用成对示例将正确解与错误解的隐藏向量分离,侧重于差异而非绝对值。
- 排序策略 – 推理时,使用分类器的置信度分数对生成的候选束进行重新排序,取代常规的对数似然排序。
- 评估 – 测量最高排序的代码片段实际正确的频率,并与基线(原始概率、模型生成的 “我很有信心” 陈述以及oracle测试执行)进行比较。
结果与发现
| 模型 | 基线(对数似然)Top‑1 准确率 | 正确性信号排序 | 增益 |
|---|---|---|---|
| CodeGen‑6B | 58% | 71% | +13 pts |
| StarCoder‑15B | 62% | 76% | +14 pts |
| GPT‑3.5‑Codex | 65% | 78% | +13 pts |
| Claude‑2 | 68% | 81% | +13 pts |
- 线性探测器在所有模型上实现了 AUC ≈ 0.88,表明正确与错误隐藏状态之间具有很强的可分性。
- 口头化的置信度(如 “我认为这段代码是正确的”)仅比原始概率略好(≈2‑3 % 的提升),凸显了隐藏状态信号的价值。
- 使用该信号对 10 条候选进行过滤,可在保持整体正确率不变的前提下,将测试执行需求降低 ≈40 %。
实际意义
- 开发者工具 – IDE 插件可以自动展示模型束中“最可能正确”的建议,减少调试 AI 生成代码的时间。
- CI/CD 流水线 – 与其对每个生成的补丁运行完整测试套件,不如使用廉价的正确性分数过滤明显有缺陷的候选,从而节省计算资源。
- 模型即服务 – 提供商可以公开一个基于隐藏状态的 “置信度 API”,为客户提供量化的可靠性指标,而无需暴露模型内部细节。
- 安全与保障 – 在代码执行前提前检测出错误(以及潜在的漏洞)代码,可降低在关键系统中自动代码合成的风险。
局限性与未来工作
- 任务范围 – 实验聚焦于相对较小、独立的编程问题;将该方法扩展到大型、多文件项目仍有待探索。
- 标签依赖 – 探测器需要一套标记好的正确/错误示例,对小众语言或特定领域可能成本较高。
- 模型特定细微差别 – 虽然多模型均出现该信号,但强度不同;未来工作应研究与架构无关的探测方法。
- 动态正确性 – 当前信号捕获的是静态正确性(通过单元测试),将其扩展到性能、安全或代码风格等标准是一个令人兴奋的方向。
核心结论:通过窥视 LLM 内部,作者展示了这些模型已经具备对“对错”代码的隐式感知。利用这种感知可以让 AI 生成的代码更可靠——而无需等待测试运行。
作者
- Francisco Ribeiro
- Claudio Spiess
- Prem Devanbu
- Sarah Nadi
论文信息
- arXiv ID: 2512.07404v1
- 分类: cs.SE, cs.AI, cs.LG
- 发布日期: 2025 年 12 月 8 日
- PDF: Download PDF