AI 幻觉是指听起来很确定、内容却是错误的回答:编造的事实、引用一篇不存在的论文、某个库从来没有过的函数。所有聊天模型都会这样,包括 ChatGPT、Claude 和 Gemini。这不是一个打个补丁就能修好的 bug,而是由语言模型生成文本的方式决定的。提示词可以让幻觉变少,剩下的只能靠核实来发现。
语言模型为什么会产生幻觉
语言模型每次写出一个 token,每个 token 都是因为它最有可能接在已有文本后面才被选中的。这里的“可能”,是相对于模型在训练中见过的所有内容而言。整个过程里没有任何一步是在查找事实。当答案在训练数据中很常见时,最可能的续写通常就是真实的答案。当答案很少见、很新,或者根本不在训练数据里时,模型仍然会生成最合理的续写,而关于一个它并不掌握的事实所写出的合理文本,就是幻觉。
有些类型的问题更容易出现幻觉:
- 具体细节: 精确的数字、日期、人名、版本号、页码。答案的形式很好预测,细节却不好预测。
- 引用和链接。 参考文献的格式是可预测的(作者、年份、标题、期刊),所以模型可以为一篇从来没写过的论文生成一条格式完美的引用。
- 冷门或最新的话题: 小众的库、地方性法规,以及模型训练数据截止之后发生的任何事。
- 带有错误前提的问题。 问某个函数是做什么的,模型往往会把这个函数当作确实存在来回答。
流畅不代表准确。幻觉回答和正确回答有着同样笃定的语气、同样的格式和同样详细的程度,所以它很容易被忽略。
错误前提的陷阱
下面的标签页询问的是 pandas 中的 DataFrame.smart_merge()。这个方法并不存在。第一个问题预设它存在;第二个问题允许模型直说。
DataFrame.smart_merge() 用来合并两个 DataFrame,它会比较列名和数据类型,自动帮你识别连接键。当两个 DataFrame 有共同的键列、但列名略有不同时就可以用它,比如 user_id 和 userId,它能自动把它们对应起来。
如果想完全掌控连接键和连接方式,merge() 仍然是更好的选择。
第一个回答是一个由真实零件拼出来的幻觉:pandas 确实能合并 DataFrame,自动匹配键也是很合理的需求。问题提供了前提,模型就配上了一个看似合理的函数。现在的模型比以前更常识破错误前提,但以预设形式提出的问题,依然会把回答推向附和。
第二个提示词做了两件事。它先问这个方法是否存在,再问它是做什么的,并且明确允许模型表示不确定。回答还给出了验证的方法,这正是值得保持的习惯:hasattr 只用一行就能检查真实的库。
根据原文回答,并附上引用
减少幻觉最有效的方法,是把事实放进提示词里。当答案就在模型能看到的文本中时,它不需要凭记忆回答,你也可以对照这段文本核实每一条说法。要求它为每条说法给出支持的原文,能让核实变得很快;告诉模型文档没有提到时该怎么说,能让它不那么容易用猜测来填补空白。
生产环境的备份保留多久: 30 天。文档中备份的通用保留期是 30 天,7 天只针对预发布环境。 “备份每晚在 UTC 时间 02:00 运行,保留 30 天。”
我能自己恢复吗: 文档中没有提到。文档只说明了如何申请恢复:“恢复请求在 #ops 频道中提交,通常在四小时内完成。”这暗示恢复由另一个团队执行,但文档并没有说明是否支持自助恢复。
注意回答是怎么处理第二个问题的。一个凭常识作答的模型,可能会描述一条恢复命令。受限于文档时,它把文本明确说的和只是暗示的区分开来了。关掉“限制”部分再问一次,看看回答是否还能把两者分开。
<document> 标签把原始材料和你的指令分隔开;分隔符和 XML 标签解释了这为什么重要,上下文工程则介绍了如何大规模地为模型提供合适的文档。带网页搜索或文件上传功能的聊天应用也是同样的原理:回答的可靠程度取决于对话中的来源,所以要去读被引用的原文,而不只是读它的摘要。
其他有用的提示词习惯
- 先问,不要预设。 先问“有没有办法做 X?”,再问“怎么做 X?”。错误前提是最容易引发幻觉的。
- 让它标出不确定之处。“把你没有把握的说法都标出来”能给你一份优先核实的清单。这些标记不是经过校准的概率,但往往能指出薄弱的地方。
- 要求提供你能打开的来源。 然后真的去打开。没打开过的引用就等于没核实过,而且链接可能确实存在,内容却和它所支持的说法不一样。
- 对话太长时重新开始。 随着对话变长,前面提到的细节可能会被混淆或丢掉。对于重要的事实,开一个新对话并把相关材料粘贴进去;token 和上下文窗口解释了其中的原因。
- 在新对话里再问一次。 如果同一个事实问题的两个独立回答不一致,至少有一个是错的。两者一致则是较弱的证据,因为模型可能重复同一个错误。
核实重要的内容
没有哪个提示词能消除幻觉,所以要根据出错的代价来决定哪些内容需要核实。头脑风暴或初稿可以容忍一些错误。报告里的数字、法律或医疗方面的说法、某个人说过的话,或者你作品中的引用,都需要原始来源。
代码是最容易核实的输出,因为运行它就是在测试它。编造的方法一旦被调用的那一行运行,就会抛出 AttributeError 或类似的错误,所以要确保你的测试能运行到那一行。真正危险的是编造的包名。如果模型让你安装一个你从没听说过的包,安装之前先确认它确实存在、确实是你以为的那个项目,并且被广泛使用。安全研究人员已经发现,模型经常反复编造同样的假包名,攻击者只要用其中一个名字发布一个包,所有照着建议安装的人都会装上他的代码。AI 编写代码时的检查方法,见用于写代码的提示词。
常见问题
AI 幻觉是什么?
AI 幻觉是指语言模型给出的回答听起来流畅又笃定,内容却是错误的或没有依据的:编造的事实、引用一篇根本不存在的论文、某个库从来没有过的函数。模型并不是故意撒谎。它只是生成了看起来最可能的文本,而“最可能”并不等于“真实”。
ChatGPT 为什么会编造内容?
聊天模型生成文本的方式是根据训练中学到的规律,一个接一个地预测下一个 token。除非对话里有网页搜索或文档这类工具,否则没有任何环节会去查找答案。当正确答案在训练数据中很少见,甚至根本不存在时,模型依然会生成最合理的续写,而一个看似合理的错误答案,读起来和正确答案一模一样。
能完全阻止 AI 产生幻觉吗?
不能。现在的模型比早期的模型幻觉少,让它根据你提供的文档或搜索结果来回答还能进一步减少幻觉,但没有哪个提示词能彻底消除它。凡是重要的事实、数字、引语、引用或 API,都应该当作需要对照原始来源核实的说法。
哪些提示词能减少 AI 幻觉?
最有用的有三种。明确允许它说“我不知道”。提供原始材料,并要求模型只根据材料回答。要求它为每条说法给出原文引用,这样你就能对照原文核实。避免用预设某件事为真的方式提问,因为模型往往会顺着这个预设往下说。
编程中的 AI 幻觉有哪些例子?
调用某个库没有的方法,传入不存在的选项,导入没人发布过的包,把旧版本库的行为当成现在的行为来描述。代码让其中很多问题很容易被发现,因为编造的方法一旦被调用的那一行运行就会报错。编造的包名才是危险的情况:安装之前,先确认这个包确实存在,而且广为人知。