前面十节讲的都是"怎么把系统做得更强"。这一章反过来讲一件更基础的事:怎么把系统做得不会致命地错。企业级 RAG 的死法里,"效果不够惊艳"很少见,"出了一次幻觉事故被下线"才是常态。一个可靠的 RAG 系统不是"永远不说错"——它做不到;它是"每一次说错都能被尽早发现、定位、纠正、追责"。
这一章把幻觉拆开、给出四道结构性闸门、把 faithfulness 变成能算的指标、并教你怎么让"不知道"成为一种可以交付的答案。读完你会明白:压幻觉不是靠更好的模型、是靠更好的架构。
学界有几套分类。这里用一份对工程师最有用的:事实幻觉 / 忠实幻觉 / 推理幻觉。
类型一:事实幻觉(Factuality Hallucination)。模型说的东西在世界上就是错的——不管你的证据怎么给。举例:模型自信地说 "Python 是 1995 年由 Guido van Rossum 在 Google 发明的"——事实上他当时在 CWI(荷兰)。这类幻觉与 RAG 无关,是模型内部知识的错误。RAG 的价值恰恰是用外部证据覆盖它。
类型二:忠实幻觉(Faithfulness Hallucination)。模型说的东西在给定的证据里其实没写——但它言之凿凿、看起来有依据。举例:证据里写"该接口 QPS 上限 500",模型答"该接口 QPS 上限 500,超出会返回 429"——"返回 429"这一半是它自己加的。这是 RAG 系统里最典型、最危险的幻觉——因为看起来"有引用、有依据",用户不容易识别。
类型三:推理幻觉(Reasoning Hallucination)。每一步都对,但结论错——推理链条中间有逻辑跳跃。举例:"支付服务 QPS 上限 500""大促峰值约 3000 QPS""所以我们需要横向扩容"——逻辑上"3000 > 500 所以要扩容"看起来对,但可能忽略了"网关做了 5:1 合并""异步削峰"这些上下文。这类幻觉最难防——因为它需要的是"知道何时不能这么推"。
llmwiki 里最重要的敌人是类型二(忠实幻觉)。类型一靠外部知识覆盖,类型三靠人审兜底,类型二靠架构:约束 + 引用 + grounding check。
大模型在做的事,本质是 P(xt+1 | x1, …, xt)——给前缀预测下一个 token。它没有"这句话是不是真的"这个目标;它的目标是"这句话是不是最可能"。语言上最可能 ≠ 事实上真。这个 gap 是训练目标决定的,不是数据不够、不是模型不够大、也不是对齐没做好——是数学上的固有属性。
推论一:把模型换得更大、把 temperature 调得更低、在 prompt 里加"你要说真话"——都不能消灭幻觉,只能减少频率。 推论二:任何"能消灭幻觉"的营销话术都要打问号。可靠系统靠的是架构 + 流程,不是模型本身。 推论三:幻觉是可以度量的,一旦可度量就可以管理。下一节我们给指标。
llmwiki 的架构里,四道闸门从第 05 章到第 09 章一路合拢:
闸门一:约束作答(Constrained Generation) — 第 23 章 Prompt 里明确"只依据证据、没有就说不知道"。这不是"祈祷模型听话",是收窄自由发挥空间。经验值:这一条能把忠实幻觉率从 30%+ 压到 10% 以下(视模型)。
闸门二:证据质量(Retrieval Quality) — 第 19/22 章 这一条最容易被忽略、但最致命。检索错了证据、或者根本没召回到对证据,再严格的 prompt 也只是把"错误"讲得通顺。llmwiki 里"混合检索 + rerank"的所有工程都在服务这一条。Recall@8 < 0.7 时,忠实幻觉率几乎不可能压到 5% 以下——因为对证据本身就没进上下文。
闸门三:强制引用 + Grounding Check — 第 23 章 每条答案句要能倒查到具体证据段落。llmwiki 更进一步:答案生成完不直接返回,先做一次"引用 grounding"——检查答案里出现的关键实体、数字、专有名词是否真的在被引用的证据里出现。不通过的句子标"未证实"或直接触发拒答。这道闸门把"看起来有依据但其实不是"这种最阴险的幻觉抓住了。
闸门四:人审 + 版本 — 第 25 章 机器产出的东西默认进 needs_review,人确认才 published;每次修改留快照、可回滚。这道闸门不是"提高 AI 质量"——是给错误留一个可纠正、可追责的口子。前 3 道闸门管"进",这道管"退"。
这四道不是并列的——第一到第三是生成侧防线、第四是流程侧防线。少了前三道系统不可用;少了第四道系统不可审计、不可长期运行。
04 Faithfulness:把幻觉变成可算的指标
Faithfulness(忠实度) = 答案中所有原子声明(claims)能被证据支持的比例。业界主流做法(RAGAS、TruLens)是:
1.拆声明:把答案拆成若干个原子陈述。比如"支付接口 QPS 500,超出返回 429"拆成 (a) QPS 上限 500,(b) 超出返回 429。
2.逐条验证:对每条声明,让一个评估模型判断"证据里是否包含此声明",输出 0/1。
3.算比例:faithfulness = supported claimstotal claims。
优点:可度量、可回归。你的每一次改 prompt、换模型、换 embedding 都能算这个数。这才是幻觉管理的第一步——不能算的就没有管理。
缺点:
· 拆声明本身依赖一个 LLM,拆得对不对也要评估(meta-evaluation)。
· 二值判断会漏"部分支持"(比如答案说"5000 QPS"、证据说"约 5000 QPS")。
· 语言粒度敏感:中文的原子声明比英文更难拆。
llmwiki 第 26 章的评测框架会把 faithfulness 作为核心指标之一,同时给一个"关键 grounding check"(数字/实体是否出现在证据里)作为交叉验证。
评估生成质量最方便的做法是"让另一个 LLM 当评委"——LLM-as-judge。这个范式在 MT-Bench、AlpacaEval、Arena 里被广泛使用,也确实好用;但它有四条明确的可靠性边界,工程师要心里有数:
边界一:位置偏差(Position Bias)。给两个答案 A/B 让模型选更好,很多模型有稳定的"选第一个"或"选第二个"偏好。必须双向评一次、结果一致才算数。
边界二:长度偏差(Verbosity Bias)。评委倾向选更长的答案——即使长的是啰嗦。控制变量:把"是否超过 300 字"作为对照组。
边界三:自恋偏差(Self-Enhancement Bias)。让 GPT 评 GPT 生成的答案,GPT 系统性给自家模型打高分。缓解:用不同家族的模型交叉评。
边界四:格式敏感。评委对 Markdown、代码块、加粗会过度奖励——因为它训练里 "结构化 = 好"。评估前把格式去掉、只留内容。
LLM-as-judge 的正确用法:当粗筛器,不当终审官。用它把 200 题里 30 题最可疑的挑出来给人精评,比"全交给 LLM 判、把它的输出当准数"要靠谱得多。llmwiki 的评测框架里,LLM 判 + 30% 人抽是标配。
拒答是幻觉管理的最后一道防线。llmwiki 里的"证据不足触发拒答"有四种策略,各自有适用场景:
·策略 A:无检索结果拒答(最简单)。检索召回为空 → 直接拒答。优点:不会错。缺点:太保守,用户体感差。
·策略 B:相关度阈值。top-1 相似度 < 阈值 → 拒。优点:可调。缺点:阈值要跑评测集选;换 embedding 就得重选。
·策略 C:证据覆盖度。答案拆声明后,supported / total < 60% → 拒。优点:直接对齐"忠实性"。缺点:拆声明依赖 LLM,成本上升。
·策略 D:模型自评(self-consistency / self-critique)。让模型判一次"我这个回答是不是完全在证据范围内"。优点:简单。缺点:模型自评偏差大,通常高估自己。
llmwiki 的推荐:A + B + C 组合。A 兜底、B 控召回、C 保忠实。第 23 章会给一份"四种策略 vs 五种阈值"的拒答准确率-幻觉率-有用率三角曲线,让你在自己的场景上挑一个平衡点。
最重要的一条产品判断:拒答率不是越低越好。拒答率太低(比如 < 5%)通常意味着"AI 太自信"——不是它变准了,是它没在拒。健康的知识库系统拒答率应该在 10–40% 之间,依场景而定(律所/医疗可能到 60%)。这个直觉很多团队没有,KPI 定成"AI 覆盖率 90%"就是自找麻烦。
学术界有几份常用幻觉评测集,做基线对比时用得上:
·TruthfulQA(2021):817 题,测模型是否会被常见误解骗。适合测"事实幻觉"。
·HaluEval(2023):30k+ 样本,专门评"忠实幻觉",含 4 类任务(QA、摘要、对话、多轮)。
·FActScore(2023):细粒度原子声明核对,常用于传记生成。
·RAGTruth(2024):面向 RAG 场景的大规模幻觉标注集。
·FreshQA(2024):滚动更新的时效性问答,能测知识陈旧。
它们的共同局限:英文为主、通用场景为主。你的企业场景里"PAY-5023 是什么意思"这种问题它不覆盖。所以第 12 章我们会专门讲怎么造自己的 200 题评测集——外部集当基线、内部集当主战。
背景:某企业内部 IT 助手上线三个月后,员工 A 问:"我们 VPN 客户端密码忘记后怎么重置?" 知识库里其实有一篇《VPN 密码重置流程》,正文里写的是"通过 HR 系统 SSO 重置"。模型回答:
"您可以在 VPN 客户端登录页点击'忘记密码',然后按邮件指引重置即可,全程无需人工介入。"
这段回答在文档里根本没有——是模型根据"通用 VPN 客户端通常这样做"的先验知识写的。员工 A 照做,点了'忘记密码'、等了三小时没邮件,投诉到 IT。IT 一看傻眼:他们的 VPN 是内部改造版,重置流程真的必须通过 SSO。
事故分析:
· 检索层:证据召回到了(《VPN 密码重置流程》在 top-3),但排序不够靠前。
· Prompt 层:有"只依据证据"的指令,但模型对"通用做法 vs 内部规范"的分辨力弱。
· 引用层:答案里根本没标引用——因为员工没追问、也没点开引用。这是设计缺陷——系统应该默认强制每句答案带引用编号。
· Grounding 层:没有做"关键短语是否出现在证据里"的核对,"点击'忘记密码'"这种动作短语本应触发拦截。
修复:三条:
1.强制引用(每句都必须挂 [n],不挂就拒答)。
2.加 grounding check——答案里的所有动词短语 + 系统名 + 路径必须在证据里出现。
3.提高检索排序权重:把"内部规范"类文档的字段加权,让它在同类问题上排 top-1。
这次事故的教训值得贴在墙上:每一次幻觉都不是"模型不听话",而是"架构给模型留了不听话的空间"。四道闸门里只要有一道在,这次事故就出不了。
·幻觉分三类:事实、忠实、推理。RAG 系统里最危险的是忠实幻觉——看起来有依据但其实不是。
·幻觉是概率模型天性,不是 bug,不能靠"更大、更低温、更严格 prompt"消灭。
·四道结构性闸门:约束作答、证据质量、强制引用 + grounding、人审版本。少了前三道系统不可用、少了第四道系统不可长期运行。
·Faithfulness 是可算的指标——不能算就不能管理。
·LLM-as-judge 有位置/长度/自恋/格式四重偏差,只当粗筛器不当终审。
·拒答是产品能力,不是缺陷——合理拒答率区间 10-40%(依场景而定),追求"零拒答"是自找麻烦。
·公开评测集是基线不是主战——你的领域要自己的评测集(下一章)。
下一章我们把上面所有"可算的指标"落到"具体怎么算、怎么建评测集、怎么让它成为回归测试的地基"。这一章是评测框架——从 Recall/MRR/nDCG 的手算开始,到 200 题评测集的构造流程、到 CI 化、到常见坑。第 26 章会给出完整代码实现;这一章先建立工程直觉。