把一句自然语言丢进 AI 代码助手,它在 0.8 秒内吐出一段看似完整的函数。这段代码是真的「想」出来的,还是从训练语料里「抄」出来的?2024-2026 年间,几条独立研究线把这个问题翻了个底朝天:AI 写代码的多数时候并不是在推理,而是在做高置信度的近邻检索和拼接——这就是工程师嘴里的「幻觉」。
幻觉 1:调包名凭空捏造
最经典的幻觉模式——模型给出一个看起来很像样的库名和方法名,但点开 PyPI 根本搜不到。根本原因是 GitHub 训练语料里大量代码引用了内部包、私有仓库或被弃用的旧库,模型把这些「高频但不存在于公开生态」的名字误记成了通用 API。
一个一线工程师的日常体感是:AI 给的 import 语句里大约有 15-25% 在当前 Python 生态里根本装不上。这种幻觉不会触发语法报错,只会在运行到调用时才崩——而那往往已经是代码评审后的几小时。
幻觉 2:函数签名张冠李戴
把 A 库的方法名拼到 B 库的调用语法上,是 AI 写代码的第二高发幻觉。比如把 requests 库的参数顺序错记成 urllib3,或者把 TensorFlow 1.x 的 API 当成 PyTorch 风格的函数调用。
这种幻觉之所以难察觉,是因为 IDE 不会立刻报错——只有运行到调用栈才会提示「unexpected keyword argument」。代价是开发者花了 30 分钟读代码、5 分钟改语法,最终发现 AI 给的整个调用范式都得重写。
幻觉 3:旧 API 当新功能
模型的知识截止时间是个硬约束。当一个库发布了 2.0 重大改版,旧 API 全部废弃,AI 仍然会按 1.x 时代的语法给出建议——因为它的训练语料里 1.x 的代码数量是 2.x 的几十倍。
这种幻觉的隐蔽性最高:代码看起来完全可运行,但调用的是一条已经被官方标记为 deprecated 的路径。一年后升级依赖版本时,代码会集中爆发式失败,而那时已经没人记得这一行是 AI 写的。
幻觉 4:旧 bug 一起抄过来
GitHub 上有大量从未被 review 过的「练习项目」「教程仓库」「作业提交」,它们本身的代码就有 bug、变量名混乱、错误处理缺失。模型把这些当成「正确答案」记下来,输出时也会复现同样的反模式——比如永远不写 try/except、永远不验证用户输入、永远假设外网可用。
这条幻觉解释了为什么 AI 给的「教学风格代码」在生产环境几乎必然会出问题:它复刻的是 GitHub 上教学仓库的代码风格,而那些仓库的代码本身就没打算上线。
幻觉 5:上下文溢出后的随机拼接
当 prompt 很长、上下文窗口快被撑爆时,模型的注意力会显著退化——后半段的 prompt 几乎是「半失明」状态。这时它会从训练语料的近邻里随机抽一段拼接上去,表面上看整段代码风格一致、变量名连贯,但实际上和用户的需求已经偏了十万八千里。
这条幻觉的特征是「代码越写越长,但越改越跑不通」。一个简单的需求被扩写成 80 行的函数,看着像是深思熟虑的结果,其实只是注意力涣散后的随机延伸。
为什么「背答案」反而像在思考
5 类幻觉有一个共同根因:AI 不是在「理解需求 → 设计算法 → 写代码」,而是在「需求 → 检索近邻 → 拼接最像的代码片段」。这两条路径在短任务里表现几乎一致——因为大多数短任务在 GitHub 上有几百个相似解,模型只要找到最像的那个拼出来就行。
差异在长任务、跨库任务、新需求任务里放大。当用户的需求在训练语料里没有近邻时,模型必须真的「思考」,而这时候它的推理能力远远不如它的检索能力——这就是幻觉密度突然上升的临界点。
工程师的 5 条护城河
把幻觉从「玄学问题」变成「工程问题」,需要建立 5 条防线。第一,AI 给的所有 import 都过一遍 PyPI 实际查询,不到 30 秒的成本能挡住至少一半的幻觉。第二,关键函数签名至少查一次官方文档,不要相信 AI 给的形参顺序。第三,对训练截止时间之后发布的新 API,永远以官方文档为准,AI 的建议只能当参考。第四,教学风格的代码在合并前必须人工 review 一遍,重点看错误处理和边界条件。第五,长 prompt 任务要主动分段,别让模型在上下文快撑爆的窗口里硬撑。
说到底,AI 写代码不是「替代工程师」,而是把工程师的时间从「写」挪到「审」。幻觉密度高的代码不会自动消失,只会把成本从「写代码的人」转移到「审代码的人」——而后者往往更贵。下一次当 AI 一秒吐出 80 行代码时,别急着复制粘贴,先花三分钟看看它到底在背哪一段答案。