AI 编出不存在的事实:识别并制止自信的错误答案

模型自信地编出引用、不存在的 API 方法、差一个数量级的数字。本文教你怎么识别,并逼它一次给出有据可查的答案。

你让模型查一篇具体论文、一个函数签名、或者上季度的营收数字,它自信地给了你答案,结果是错的:引用打不开、SDK 里没这个函数、数字差了一个数量级。你一追问,它又编出一条更精致的假引用。幻觉不是随机噪声,它集中在”需要事实”和”没有源头”之间的缺口处。

最快的修法: 把源材料直接粘进 prompt,并加一条规则 If the answer is not in the text above, write "NOT IN SOURCE"(上文里没有就写 NOT IN SOURCE)。这样模型就没有可编造的空间了。如果实在没法粘源,就开启 web 搜索(ChatGPT、Claude、Gemini 都能把答案锚定在实时结果上,幻觉大约能降 40%-85%,但不会归零),然后每个具名实体你都亲自核对一遍。

你属于哪一类?

症状大概率原因跳到
冷门/具体的事实,没开工具也没粘源从训练记忆里猜Step 1、Step 2
可疑地凑整的”完整”列表(正好 10 条、正好 7 条)补全凑数原因 2、Step 5
版本/价格/模型名已经过时训练 cutoff 落后于近期变化Step 2、原因 3
答案从不承认不确定没给”可以说不知道”的许可Step 3
粘了源,答案却与源矛盾长上下文稀释Step 1、原因 5
你说”确定吗”,假引用反而变本加厉追问触发编造Step 6

常见原因

按命中率排序。

1. 要事实,却没喂源也没开检索

如果你问 What is the time complexity of Postgres GIN index lookups? 而模型没有 web 工具、没有粘贴文档、也没有 grounding,它唯一的选择就是从训练记忆里猜。猜出来常常接近但不完全对,而它不会主动说”我没文档”,只会给一个听起来合理的数字。

如何判断: 你的 prompt 提到了具体实体(论文、函数、数字、日期),却没给模型任何查验途径。

2. 要”完整""全面”的列表

list all the React hooksgive me every Cloudflare Workers binding type 这类 prompt 会触发”补全”行为。模型写 10 个真的、再编 2 个假的,让列表看起来完备。训练集里真实清单很少正好是 N 项,所以它会凑。

如何判断: 输出条数可疑地凑整(正好 10 条、正好 7 条),或者末尾几项看起来空泛。

3. 训练 cutoff 落后于近期变化

你问的是某个库版本、API 变更、或定价层,而它发布在模型 cutoff 之后。模型会用 cutoff 之前的状态回答,还当成现状呈现。截至 2026 年 6 月,这一点在快速变化的事实上尤其明显:OpenAI 的 Python 库已经到 openai 2.43.0(2026 年 6 月 17 日发布)并改用 Responses API,但很多模型还在吐老的 openai==1.x chat-completions 写法。

如何判断: 话题在过去 6-12 个月里有变化(版本、价格、模型名、deprecation)。

4. 没让模型标注不确定

chat 模型默认就是产出流畅答案,而不是承认无知。没有像 If you are not sure, say "I don't have enough information"(不确定就说”信息不足”)这样的明确许可,模型会用听起来合理的字符串填空。Anthropic 把”允许 Claude 说我不知道”列为其防幻觉的第一条建议。

如何判断: 回答里从不出现”我不确定""我无法验证""基于可能过时的训练数据”之类的字眼。

5. 长上下文稀释 grounding

即使你粘了源,如果 prompt 很长而源材料在靠前位置,模型生成到后面段落时可能输出与源相矛盾的内容。长上下文里 attention 并不是均匀分布的。

如何判断: 源材料在 prompt 里,回答里却出现源中没有的论断。

6. 追问反而触发编造

当你说 are you sure?(确定吗),模型常会编一条听起来更确凿的引用,而不是退一步。后训练奖励的是”答得自信”。

如何判断: 第二轮的引用比第一轮更具体(也更假)。

动手前先确认

  • 确认幻觉是稳定复现还是偶发;同一 prompt 跑两次(Anthropic 称之为 best-of-N 验证)。
  • 记录完整 prompt、模型、以及 system prompt 或源材料。
  • 把错误输出原样保存,方便和修正后版本对比。
  • 记下当时是否开了工具(web 搜索、代码执行、文件检索)。
  • 判断话题是否对时间敏感(版本、定价、新闻)。

最短修复路径

按收益排序。

Step 1:粘贴源材料,并把模型锁死在源上

What does the Stripe API return on a failed charge? 换成”先粘文档、再加约束”:

Source (Stripe docs, copied below):
<paste relevant section>

Question: What does Stripe return on a failed charge?
Rules:
- Use ONLY the text above. Do not use general knowledge.
- If the answer is not in the text, write "NOT IN SOURCE".
- Quote the exact line you used.

“只用上文”这条就是 Anthropic 的 external knowledge restriction(外部知识限制)技巧,引用原话这条则是它的 verify with citations(用引用验证)技巧。对长文档(约 2 万 tokens 以上),先让模型逐字提取相关引文,再只基于这些引文作答。这个两步结构能把答案钉在源上,正好修掉原因 5。

Step 2:粘不了源时,开启检索/工具调用

  • ChatGPT: 如果找不到 Search 工具,进 Settings > Personalization > Advanced,把 Web search 开关打开。对话里点工具菜单(+ / “View all tools”)选 Search,或者输入 / 再选 Search。ChatGPT 在问题看起来时效性强时也会自动搜索。
  • Claude: 开启 web 搜索(它在推理循环内运行,返回内联引用),或者上传文件 / 挂 connector,让答案锚定在你的文档上。
  • Gemini / API: 用 Grounding with Google Search;响应里带 groundingMetadata,含搜索词、网页结果和引用。
  • API(OpenAI): 在 Responses API 里启用搜索/web 工具;如果纯靠无工具的事实回忆,就当它是在猜。

grounding 帮助很大,但不是解药。厂商和 benchmark 的数据显示,相比纯静态推理,降幅大约从 40%(Gemini grounding)到 73%-86%(web 搜索),所以综合后的论断你仍要核对。

Step 3:加显式不确定标签

事实密集的 prompt 都加上:

For each non-trivial claim, append a confidence tag:
- [VERIFIED] if you can quote a source in this conversation.
- [LIKELY] if it matches your training but you cannot cite.
- [UNCERTAIN] if you are guessing.
Refuse to produce [VERIFIED] without a quoted source.

把”无声幻觉”变成”看得见的不确定”。

Step 4:代码题,要可运行工件,并钉死版本

how do I use the OpenAI Python SDK to stream a response 换成:

Write a runnable Python script using the current OpenAI SDK (openai 2.x, Responses API).
Use client.responses.create(..., stream=True) and iterate the streamed events.
Include the exact import line.
At the end, list every method, class, and parameter you used, and mark each as
VERIFIED-FROM-DOCS or UNCERTAIN.

然后实际跑一遍。报 AttributeErrorImportError 说明模型编了方法名。钉死版本(比如 openai 2.43.0)能阻止它重新生成已废弃的 1.x 写法。

Step 5:每个具名实体都对照一手源

输出里每个论文标题、函数名、URL、数字,都要回到一手源核对:官方文档、论文页、GitHub repo、公司 changelog。把模型的自信度当成零信号。对”完整列表”型答案(原因 2),按真实源核对条数,别信凑整的数字。

Step 6:别去”争”,重置后加 grounding

模型给了假引用,你说 are you sure?,大概率拿到一个更精致的假引用。改成新开一轮:

I cannot find X. Paste the exact URL or section number where you read this.
If you cannot, mark it UNCERTAIN and stop.

怎么确认已经修好

  • 输出里每条非琐碎论点都有可引用源或 UNCERTAIN 标签。
  • 跑代码不报 AttributeErrorImportError、或 404。
  • 第二个模型或搜索引擎能交叉验证。
  • 同一 prompt 重跑两次,事实论断稳定一致(best-of-N 一致)。

如果还是没修好

  • 换有检索/grounding 的模型:开了 web 搜索的 ChatGPT、开 web 搜索的 Claude、开 Grounding 的 Gemini,或 Perplexity。
  • 缩小范围:把”告诉我关于 X 的一切”拆成 5 个小事实题,每个都能独立验证。
  • 法律 / 医疗 / 财务等领域,别用通用 chat 模型,用能引用一手源的领域工具。
  • 话题晚于 cutoff,就接受”未验证答案都是猜”,必须外部查证。

常见问题

为什么我一问”确定吗”,AI 反而编出更糟的引用? 追问被它理解成”要一个更自信的答案”,而不是”重新核对”,于是它给出一条更具体(仍然是假)的引用。别去争,新开一轮,直接要确切的 URL 或章节号(Step 6)。

开了 web 搜索就能彻底消除幻觉吗? 不能。grounding 能大幅降低(按 2026 年 benchmark,Gemini grounding 约 40%,web 搜索可达 73%-86%),但模型仍要跨源综合,可能误读或过度推断。高风险事实务必点开引用链接。

为什么模型给我的旧库代码跑不起来? 训练 cutoff(原因 3)。比如它会吐已废弃的 openai==1.x chat-completions 写法,而当前库已是 openai 2.43.0 的 Responses API。在 prompt 里钉死确切版本,并实际跑一遍代码(Step 4)。

模型粘了我的文档,答案里却还是编了一条事实,为什么? 长上下文稀释(原因 5)。文档超过约 2 万 tokens 时,先让它逐字提取引文,再只基于这些引文作答,配合 Use ONLY the text above(Step 1)。

2026 年哪些模型幻觉最少? 2026 年的事实准确性 benchmark 把 Claude 系列放在幻觉率较低的一端,但在冷门或 cutoff 之后的事实上,任何模型不接检索都不可靠。比起选模型,grounding 和验证更关键。

怎么让答案对团队可审计? 要求每条论点配一条引用,再来一遍自检:让模型为每条论点找到支撑引文,找不到的就撤回该条(Anthropic 的 verify with citations 模式)。同时保留 Step 3 的置信标签。

预防建议

  • 默认尾缀:Tag each non-trivial claim [VERIFIED] / [LIKELY] / [UNCERTAIN].
  • 写代码的 prompt,一定钉死库 + 版本。
  • 事实密集任务用 grounded 模型;推理和写作用 chat 模型。
  • 不要无条件接受模型在追问后给的”新引用”,必须独立验证。
  • 养成”跑代码、点 URL、翻到引用页”再相信任何输出的习惯。

相关阅读

外部参考:Anthropic — Reduce hallucinationsGemini API — Grounding with Google Search

标签: #排查 #Prompt #Prompt 质量 #幻觉