你让模型查一篇具体论文、一个函数签名、或者上季度的营收数字,它自信地给了你答案,结果是错的:引用打不开、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 hooks 或 give 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.
然后实际跑一遍。报 AttributeError 或 ImportError 说明模型编了方法名。钉死版本(比如 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 标签。
- 跑代码不报
AttributeError、ImportError、或 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 hallucinations 与 Gemini API — Grounding with Google Search。
标签: #排查 #Prompt #Prompt 质量 #幻觉