聊幻觉这个话题前先说个真事。朋友公司上线了一个"AI合同审查",甲方拿来一份完全没见过的模板让模型审,模型看完一本正经地指出"第七条有违约金风险"——结果那份文件根本没有第七条。这不是段子,是我在做LLM落地咨询时听到的真实案例,也是我打算写这篇的原因:幻觉不是"模型不够聪明",是结构性问题,必须靠工程手段系统化地兜底。
一、先把幻觉分类搞清楚
很多人把"幻觉"当成一个东西,其实它至少分两层:
- 内在幻觉(Intrinsic):模型输出与输入上下文矛盾。比如你给了一段文档让它总结,它总结里写了文档里没说的内容。
- 外在幻觉(Extrinsic):模型输出与事实世界矛盾。输入没有提供的信息,模型自己"补"了一个错的。
再按性质切一刀:
- 事实性幻觉(Factuality):编造人物、编造论文、编造API签名。
- 忠实性幻觉(Faithfulness):指令遵循失败、推理过程与结论对不上、摘要与原文不一致。
我自己做评测时一般这么归类,原因很简单:忠实性幻觉靠prompt和SFT能压住一截,事实性幻觉基本只能靠检索增强或者后处理校验。治理手段完全不一样。
二、为什么LLM必然会产生幻觉
把幻觉当bug去修之前,得先承认它是架构的必然结果。三个原因,缺一不可:
1. 训练目标的本质是"下一个token的极大似然"
交叉熵损失只关心token级概率分布的拟合度,不关心"这句话整体是否真实"。模型学到的是"哪些token共现概率高",而不是"哪些事实成立"。预训练语料里本身就有大量错误、过期、互相矛盾的内容,模型把这些噪声都一起吞了下去。
2. 知识在参数里是"软存储",没有"是否知道"的开关
人类记忆调不出来时会知道自己不知道,LLM没有这种元认知。它的"自信度"和"真实度"是两件事。置信度高的输出未必是对的,置信度低的输出也未必是错的——这跟人类专家的"我知道我说什么"完全不一样。
3. 解码阶段的随机性
采样(top-p、temperature)是为了让生成有多样性,但多样性天然和"忠于事实"是张力关系。temperature越高,创造性越强,幻觉率也越高。
理解这三点很重要:没有单一技术能消灭幻觉,只能在每一层都做约束。后面所有的方法,本质上都是在这三个根因上下刀。
三、评测:怎么知道你的幻觉降了
工程上最常被问的问题就是"这个版本幻觉率多少"。我一般分两个维度来回答。
3.1 公开基准
| 基准 | 规模 | 关注点 | 备注 |
| TruthfulQA | 817 题 / 38 类 | 模型的"诚实性",专门设计来诱发常见错误观念 | Lin et al., 2021 |
| HaluEval | 35k 样本 | 综合幻觉评测,含 QA、对话、摘要三类 | Li et al., 2023 |
| FActScore | 长文本原子事实分解 | 把回答拆成原子事实后逐条核对 | Min et al., 2023 |
| FreshQA | 持续更新 | 测"新鲜事"幻觉,专门打知识截止之后的内容 | Vu et al., 2023 |
| SimpleQA | 短答事实题 | OpenAI 2024 年发布,难到主流模型都不到 50% | OpenAI, 2024 |
经验谈一句:TruthfulQA 已经成了"刷分过拟合"的重灾区,榜单前列的模型在该基准上 90%+ 拿了,离开基准到真实业务里照旧胡说八道。所以只跑榜单没用,得有自建评测集。
3.2 工业评测的几个常用做法
LLM-as-a-Judge:用一个强模型当裁判,评估目标模型的输出。MT-Bench(Zheng et al., 2023)把这条路走通了。优点是便宜、快、规模化容易;缺点是有"位置偏差""自我偏好"(模型倾向给同源模型高分)。我的做法是和人类标注混合校验,至少抽 5% 用人复核。
Self-Consistency:让模型对同一问题采样 N 次,看答案的一致性。高度一致说明是"高自信回答",不一致就标红送人工。这个思路简单但非常有效,2022 年 Wang et al. 的论文里做了完整论证。
不确定性估计:看输出 token 的 logprob 分布。低置信度 + 关键事实类问题 = 触发兜底。我自己写过一个简单的:
import math
def calibrated_score(logprobs: list[float]) -> float:
"""基于 logprob 的简单置信度估计,返回 0~1"""
if not logprobs:
return 0.0
avg = sum(logprobs) / len(logprobs)
# 指数化到 [0,1],并用 1-exp(-H) 做置信度归一
return min(1.0, math.exp(avg))
这个值低于 0.3 时,强制走"检索 + 拒答"分支。够糙,但有效。
四、Prompt 层:让模型"知道它不知道"
把这一层放在最前面,因为成本最低、效果最直接。
显式不确定性提示。一句"如果不确定,请回答'我不知道'"能显著降低幻觉率。我和同行交流过,普遍反映这种 prompt 在事实类问题上的提升是 10-20 个百分点。
引用先行(Cite-then-answer)。我自己的工程模板:
请按以下流程回答:
1. 先列出回答中涉及的每条事实及其来源段落编号
2. 如果源文档没有相关依据,明确写"无依据"
3. 基于以上步骤给出最终回答,不要添加步骤 1 中没有的细节
这套"先分解后回答"的模式,本质上是把模型从"直接生成"切换到"基于显式证据生成"。在 RAG 场景里效果最好,模型会把"无依据"作为一个合法动作。
CoT + 验证。让模型先想再答、再让模型"挑自己回答的毛病"。Self-Verification 这条路 Anthropic 和 DeepMind 都做过工程化实现,副作用是延迟翻倍。
反例驱动。在 system prompt 里塞几个典型的"幻觉反例 + 正确处理方式",few-shot 的效果比单写规则好得多。我一般放 3-5 条,覆盖最容易出错的几种。
五、解码层:让模型"少冒险"
5.1 温度与采样
事实类、检索类任务:temperature 设 0,或极低(0.0-0.2)。原因很简单,采样越确定,编造越少。 创意类、对话类:可以适当放开(0.7-0.9),但要意识到幻觉会同步上升。
top-p 的常见误区:很多人把 top-p 设到 0.95 甚至 0.99 觉得"多样性更好"。对事实任务这是反的,p 越大尾部概率越分散,越容易采到边缘 token。事实类任务建议 0.8-0.9。
5.2 受限解码(Constrained Decoding)
这是 2024-2025 年真正改变游戏规则的技术。原理很简单:解码时不只考虑模型概率,还强制输出必须符合某个语法(JSON Schema、Regex、CFG)。工具链:
- Outlines:基于 logit 偏置,兼容主流推理框架
- Guidance:微软出品,模板 + 约束一体
- Jsonformer / Instructor:专注结构化输出
我自己在生产里用 Instructor 比较多,几行代码就能把输出锁成 Pydantic 模型:
from pydantic import BaseModel
from instructor import from_openai
class ReviewResult(BaseModel):
score: int
risks: list[str]
evidence_quote: str
client = from_openai(openai_client)
result = client.chat.completions.create(
model="gpt-4o",
response_model=ReviewResult,
messages=[{"role": "user", "content": prompt}],
)
受限解码不会让模型"更懂事实",但它保证输出格式 100% 可解析,下游可以稳定地接校验、接数据库。这条对减少"格式幻觉"(输出格式乱导致下游崩溃)几乎是 100% 有效。
六、RAG:幻觉的"地基工程"
RAG 不是万能解,但确实是 2026 年生产环境最有效的幻觉治理手段,没有之一。注意一个反直觉:RAG 的幻觉来源不是"模型不行",是"检索 + 压缩 + 生成"三段都在产生错误。
6.1 检索层的坑
Embedding 不是越新越好。bge-large、bce、E5、gte、Qwen3-Embedding 这些在中文 RAG 场景里差异没有宣传的那么大。真正决定效果的是 chunk 策略:粒度、是否带标题、是否带元信息。我自己测下来,文档带 H1/H2 标题 + 段落级切分比任何 embedding 升级都管用。
混合检索基本是必选。向量检索 + BM25 关键词检索 + 重排序(bge-reranker、cohere-rerank),三件套几乎成了工业标准。纯向量检索在专有名词、代码片段、型号代号上很容易失灵。
6.2 压缩与重排
检索召回 20-50 条塞进 prompt 是反模式,会显著增加幻觉。原因:长上下文中模型对中段信息关注度急剧下降(Lost-in-the-Middle 现象,Liu et al., 2023 给出过完整实验)。
我的做法是召回 50-100 条 → 重排序取 Top-K(K=5-10)→ 进 prompt。LLMLingua、LongLLMLingua 这类上下文压缩工具可以用,但不要压到关键信息丢失,压完要再过一遍质检。
6.3 生成层的硬约束
prompt 模板我用了两年没怎么变:
你是一个严格基于给定文档回答问题的助手。
规则:
1. 只能使用 <context></context> 标签内的信息回答。
2. 如果问题在文档中没有答案,回答"根据已知信息无法回答",不要编造。
3. 引用具体信息时,标注其来源段落编号,例如 [段落3]。
4. 不要使用文档外的常识"补全"。
<context>
{retrieved_chunks}
</context>
问题:{question}
注意第 4 条,这是压幻觉的精髓:禁止模型"贴常识" 。模型特别喜欢在没找到答案时调用自己的先验知识去补,对法律、医疗、金融场景这是大忌。
6.4 Self-RAG / Corrective RAG
2024 年开始流行的进阶版。Self-RAG(Asai et al., 2023)让模型在生成时主动"插旗"——哪些事实有依据、哪些没依据、需不需要重新检索。Corrective RAG(Yan et al., 2024)则把"检索-评估-重检索-回答"做成显式回路。生产里用得不多(延迟大),但对高准确度场景(医疗、法律)值得引入。
七、Guardrail:最后一道防线
无论前面做得多好,总有漏网之鱼。Guardrail 的角色就是"兜底"。
Llama Guard:Meta 2024 年开源的安全分类器,可识别有害内容、隐私泄露、危险指令。LLM 输出过一遍 Llama Guard 是行业基本动作。Meta 后续还发了 Llama Guard 3 和 Prompt Guard(专门识别 prompt 注入)。
NeMo Guardrails(NVIDIA):基于 Colang 的可编程护栏系统。可以定义对话流的安全边界、主题边界。优点是可控,缺点是 Colang 学习成本不低。
Guardrails AI:Pydantic-like 的声明式校验,结构化输出 + 验证器组合,社区验证器生态丰富。
我的经验是多 Guardrail 串联:
每一层职责单一、失败可降级。Llama Guard 拦安全,结构校验拦格式,事实校验拦幻觉,敏感词拦合规。
八、训练侧:能做的事和不能做的事
聊训练层幻觉治理前先把丑话说了:绝大多数中小团队没有训练侧的幻觉治理能力,也没有必要。
能做、值得做的:
- 领域 SFT:在你们自己的高质量领域数据上做监督微调,能显著降低"胡说八道"概率。数据量一般 1k-10k 条就够。
- DPO / KTO:偏好的方法,DPO(Rafailov et al., 2023)让模型直接学"什么是好回答、什么是差回答",对事实性提升有据可查。
- RLHF / RLAIF:用人类反馈或 AI 反馈做强化学习。Anthropic 的 Constitutional AI、RLAIF 这条路就是这类。
不要做的:
- 别去训一个"通用去幻觉模型"。通用方法都被卷烂了,模型厂商做得比你好十倍。
- 别在几百万条网络上爬的脏数据上做 SFT,会反向加重幻觉。
九、2026 年的工程现实
聊完上面六层,最后说几个我自己的判断,不一定对:
没有银弹。所有宣称"消灭幻觉"的产品都在营销。任何单一手段(prompt、解码、RAG、Guardrail)单独使用都只能解决一部分问题,必须多层防御。
幻觉不可能归零。我的目标从来不是"零幻觉",而是"幻觉可识别、可追溯、可降级"。识别靠 LLM-as-a-Judge 和不确定性估计,追溯靠引用链路,降级靠拒答或人工接管。
专用小模型比通用大模型更适合做事实类任务。我自己用 Qwen2.5-7B-Instruct + 严格 RAG 在垂直领域干掉了 90% 的幻觉问题,成本只有 GPT-4o 的 1/50。不要迷信最强大模型,要找"够用且便宜"的。
人机协同是终局。2026 年的 LLM 落地,AI 不再是"自动回答机",而是"AI 初稿 + 人工审核"。在医疗、法律、金融、工程领域,纯 LLM 端到端不可信。承认这一点反而能做出更好的产品。
长上下文不等于解决幻觉。很多人说"现在都 1M token 上下文了,把所有文档塞进去就行"。错。Lost-in-the-Middle 问题随着上下文变长会更严重,RAG 不会被长上下文取代,只是会更向"长文档 + 检索 + 重排"演进。
最后一句话:做 LLM 应用,本质是在做"幻觉管理",而不是"幻觉消除" 。把这句话刻在产品墙上,比任何 benchmark 都管用。
附录:可落地的一份"幻觉治理 Checklist"
按实施顺序列:
- 任务分级:哪些场景可以容忍幻觉、哪些必须零容忍
- 数据建设:构造 200-500 条业务相关的事实型评测集
- 基线评估:在新数据集上跑一次基线,定量化幻觉率
- Prompt 加固:加入"不知道就拒答"、引用标注等规则
- 受限解码:所有结构化输出走 JSON Schema / Pydantic
- 检索增强:搭建向量 + 关键词 + 重排的混合检索
- Guardrail 串联:安全 + 格式 + 事实 + 敏感词四层
- 灰度上线:先 1% 流量跑,看幻觉监控指标
- 持续监控:线上抽样 1% 走 LLM-as-a-Judge + 人工复核
- 定期回灌:把线上幻觉 case 写回评测集,迭代优化
按这张表做完,幻觉率从 20%+ 压到 5% 以下是可达的。我手上的项目实测过,供参考。