我从尝试使用 LLM 编写代码的开发人员那里看到的一个令人惊讶的常见抱怨是,他们遇到了幻觉——通常是 LLM 发明了一种不存在的方法,甚至是一个完整的软件库——这让他们对 LLM 作为编写代码的工具的信心崩溃了。如果人们发明了不存在的方法,如何能够有效地使用这些东西呢?
代码中的幻觉是您在模型中遇到的危害最小的幻觉。
当您运行该代码时,任何幻觉方法都会立即显而易见:您将收到错误。您可以自己修复该问题,也可以将错误反馈给 LLM 并观察其自行纠正。
与普通散文中的幻觉相比,你需要批判性的眼光、强烈的直觉和良好的事实核查技能,以避免分享不正确且直接损害你声誉的信息。
通过代码,您可以免费获得强大的事实检查形式。运行代码,看看是否有效。
在某些设置中——ChatGPT Code Interpreter 、 Claude Code 、任何越来越多的在循环中编写然后执行代码的“代理”代码系统——LLM 系统本身会发现错误并自动纠正。
如果你使用法学硕士来编写代码,甚至自己都不运行它,你在做什么?
幻觉方法是一个很小的障碍,当人们抱怨它们时,我认为他们花了很少的时间学习如何有效地使用这些系统 – 他们在第一个障碍时就放弃了它们。
我愤世嫉俗的一面怀疑他们可能一直在寻找拒绝这项技术的理由,并在他们发现的第一个理由上欣然接受。
我不那么愤世嫉俗的一面认为,没有人警告过他们,你必须投入大量的工作来学习如何从这些系统中获得良好的结果。我已经探索他们的代码编写应用程序两年多了,而且我几乎每天仍在学习新技巧(以及新的优点和缺点)。
使用法学硕士编写代码的真正风险是,他们会犯一些语言编译器或解释器无法立即捕获的错误。而且这些事情一直在发生!
仅仅因为代码看起来不错并且运行没有错误并不意味着它实际上在做正确的事情。再多细致的代码审查——甚至是全面的自动化测试——都无法证明代码确实做了正确的事情。你必须自己运行!
向自己证明代码有效是您的工作。这是我认为法学硕士不会让软件专业人员失业的众多原因之一。
LLM 代码通常看起来很棒:良好的变量名称、令人信服的注释、清晰的类型注释和逻辑结构。这可能会让您产生一种错误的安全感,就像 ChatGPT 的语法正确且自信的答案可能会诱使您跳过事实检查或采取怀疑的眼光一样。
避免这些问题的方法与避免您正在审查的其他人的代码或您自己编写的代码中的问题的方法相同:您需要积极地执行该代码。您需要具备出色的手动质量检查技能。
编程的一般规则是,在您亲眼看到它工作之前,您永远不应该相信任何代码片段 – 或者更好的是,看到它失败然后修复它。
在我的整个职业生涯中,几乎每次我都假设某些代码可以在没有主动执行的情况下工作——一些很少被命中的分支条件,或者我不希望发生的错误消息——后来我对这个假设感到后悔。
如果您确实在法学硕士为您生成的代码中看到大量幻觉细节,那么您可以采取很多措施来解决它。
- 尝试不同的模型。另一个模型可能为您选择的平台提供更好的训练数据。作为一名 Python 和 JavaScript 程序员,我现在最喜欢的模型是带有思维功能的 Claude 3.7 Sonnet、OpenAI 的 o3-mini-high 和带有代码解释器(针对 Python)的 GPT-4o。
- 了解如何使用上下文。如果法学硕士不知道某个特定的库,您通常可以通过转储几十行示例代码来解决这个问题。法学硕士非常擅长模仿事物,并且能够从非常有限的例子中快速找出模式。现代模型的上下文窗口越来越大 – 我最近开始使用 Claude 的新GitHub 集成将整个存储库转储到上下文中,它对我来说非常有效。
- 选择了镗削技术。我确实发现自己选择已经存在了一段时间的库,部分原因是这样法学硕士更有可能使用它们。
我将用一个相关的观察来结束这篇咆哮:我不断看到人们说“如果我必须审查法学硕士编写的每一行代码,那么我自己编写会更快!”
这些人大声宣称他们在阅读、理解和审查其他人编写的代码的关键技能上投入不足。我建议多做一些练习。查看法学硕士为您编写的代码是一个很好的方法。
标签:人工智能、 openai 、生成人工智能、 LLMS 、人工智能辅助编程、人类、克劳德、代码解释器、人工智能代理
原文: https://simonwillison.net/2025/Mar/2/hallucinations-in-code/#atom-everything