防范代码幻觉的5种方法(其中只有3种真正有效)
上周我分享了AI如何编造了一个完整的JSON结构,并用DTO、固件和测试对其进行包装。90个测试全部通过。全是假的。 那篇文章是诊断。这篇是治疗。 发现这个灾难后,我做了任何自尊心受挫的工程师都会做的事:连续数天疯狂研究,确保不再发生。我阅读论文、试用工具、分析应用API的真实数据,并为我的应用构建了一套防御系统。 我的发现令人惊讶。在我识别的5种应对措施中,只有3种真正有效。其他两种充其量是善意的表演。 思维模型:你与AI的对抗(字面意思) 在深入这些措施之前,你需要理解框架。我找到的最佳类比来自深度学习。 在GAN(生成对抗网络)中,有两个神经网络在竞争: 生成器产生内容(图像、文本等) 判别器试图检测内容是真实的还是虚假的 系统之所以改进,是因为两者相互推动。生成器学会更好地欺骗。判别器学会更好地检测。 当你与大语言模型编程时,你就处在一个无意的GAN中: **大语言模型是生成器。**它产生代码、DTO、测试、固件。 **你是判别器。**你必须检测什么是真实的,什么是编造的。 但存在一个残酷的不对称:生成器不知疲倦,而你会疲劳。大语言模型可以不费力地生成50个文件。你检查10个就累了,第11个文件就不看了。 这就像我在1Password一天要求Touch ID 47次中提到的授权疲劳。依赖人类永远保持警觉的安全就是纸板安全。 判别器应该监控什么 你不能(也不应该)检查每一行。你需要监控的是边界——你的代码接触外部世界的地方: 边界 关键问题 外部API DTO中的字段在真实API中存在吗? 包 依赖项存在并且名称正确吗? 数据库模式 表真的有这些列吗? URL/端点 端点存在并返回我们期望的内容吗? **原则:大语言模型对外部世界的所有声明在验证前都是可疑的。**它说得很自信并不是证据。Anthropic在自己的文档中承认了这一点: “Claude有时会生成包含虚假信息的响应…以自信、权威的方式呈现。” 一个说"我确定"的大语言模型和一个说"我认为"的大语言模型犯错的概率完全相同。 自动化判别器 最终目标是不再依赖你的纪律性,而是自动化验证: 之前: LLM生成 → 你审查(有时) → 合并 之后: LLM生成 → CI对真实数据验证 → 你审查差异 → 合并 接下来的5种措施是自动化判别器角色的方法。有些有效。有些不太行。 硬数据(给怀疑者) 在你认为"我不会遇到这种情况"之前,这里是真实研究的数字: **21.7%**的开源大语言模型推荐的包是编造的。在商业模型中下降到5.2%,仍然是每20个包中有一个。 GPT-4o对不常见API只能达到**38.58%**的有效调用率。不到40%。还不如抛硬币。 目前定位代码幻觉的最佳方法只能达到22-33%的精度。换句话说:我们能检测出四分之一。 一位研究人员上传了一个空包,包名是大语言模型经常幻觉的。3个月内3万次下载。他们称之为slopsquatting。 而且有正式的分类法。CodeHalu论文(AAAI 2025)定义了4类代码幻觉: 类别 定义 真实例子 映射 字段映射错误 混淆user_id和account_id 命名 编造的名称 response.quota.percentage实际是response.utilization 资源 不存在的资源 API中没有的active_flags字段 逻辑 看似合理但错误的逻辑 isPaid = !activeFlags.isEmpty但字段总是空的 我的案例是资源类型转化为逻辑类型。字段不存在,但依赖它的逻辑看起来完美。连贯的虚构小说。 ...