想象一家米其林后厨。你点了一道“松鼠桂鱼”,采购员(检索模块)从食材库(知识库)里买回一条鲜鱼和糖醋汁,厨师长(大模型)照着菜谱做菜。正常情况下,这道菜色香味俱全,端上桌时还附带食材小票(引用来源),宾客可以查证。但这家厨房有个头疼的问题:厨师长偶尔会“发挥过度”——明明只买了鲤鱼,他硬说用的是东星斑;菜谱上只说“少许糖”,他凭空加了三勺盐;更糟的是食材不够时,他干脆不写了,直接编一道“水晶肘子”端上来。这就是大模型在 RAG 场景下的“幻觉”:编造检索结果中不存在的事实、断章取义、过度推理。 RAG 系统的“事实校验”质检体系,就是在这家后厨里设立的一整套防线:出锅前自我尝菜(自我校验)、派两个采购员分头买料对照(多路检索交叉验证)、每道菜强制挂采购小票(引用溯源)、规定“没有食材必须写明沽清”(防幻觉提示词),再由质检员按打分表抽查(检测评估指标)。这篇要讲的,就是这套质检体系每个环节如何工作、如何落地。
对 AI 从业者:幻觉是 RAG 落地高敏行业时的头号风险。掌握分型、校验与溯源这套组合拳,是从“跑通 Demo”进阶到“敢上生产环境”的分水岭。
可视化演示
展示RAG幻觉三大类型、多路检索交叉验证与引用溯源对齐流程,切换模式观察如何科学检测和缓解大模型幻觉问题。
本节配有交互动效(进入视口后自动加载,约 3KB)。
RAG幻觉三大类型 断章取义:截取检索片段脱离上下文,导致语义扭曲 过度推理:超出检索内容做无依据的推断和延伸 Type: {Truncation, OverInfer, Fabrication} 分类幻觉类型是设计针对性检测策略的基础
幻觉成因分类
后厨里最怕的不是菜难做,而是厨师长“自由发挥”。菜谱明明写着“少许糖”,他心情一好倒进半罐;锅里的鱼只够清蒸,他偏要加剁椒;最麻烦的是菜谱缺了一页,他怕客人等,干脆按印象编了一道“家传秘方”。客人吃到的,就成了没有依据的“幻觉菜”。
在 RAG 系统里,菜谱就是检索模块从知识库捞回来的文档片段,厨师长就是大模型。系统把片段拼进提示词,让模型“基于材料回答”。可材料只是被“看见”,不代表被“服从”——模型可能只揪住一句话不放,可能从材料里推出材料没有的结论,甚至直接无中生有。要治理幻觉,第一步是给幻觉“分型”,就像厨师先分清是刀工、火候还是原料的问题。
业界把 RAG 幻觉归纳为四类。断章取义:模型抽取文档中孤立片段,脱离上下文导致原意被歪曲,典型是只引用“低盐饮食有益”却忽略“需遵医嘱”;过度推理:从材料中的相关性推出因果性、从样本推出全称结论;编造事实:输出中出现的实体、数字、条文明明在检索结果里不存在,也叫外来幻觉;上下文丢失:检索召回不足或切片过碎,模型在证据缺失的情况下硬着头皮作答。
所以质检体系的第一道工序不是“抓”,而是“分诊”。看到客人投诉菜不对,先问是哪一类:是火候过度(过度推理)、理解偏差(断章取义)、凭空捏造(编造),还是压根没进到货(上下文丢失)。分型不同,后面的校验手段完全不同。
自我校验机制
分完型,厨师长开始学着“出锅前自己尝一口”。他给自己立规矩:每道菜装盘前,对照菜谱逐一核对步骤——这一步有依据吗?那一味料是菜谱上写的吗?没有依据的,立刻挑出来。
这对应 RAG 里的自我校验(self-verification)。流程是:让模型把生成答案拆解成若干个原子主张(claim,即不可再分的事实陈述),再逐条回到检索上下文里找证据。每条主张要么找到支撑,要么被标记为“高风险主张”。这一步的关键是“拆”——把一段话拆成最小可验证单元,才能精确知道哪句站得住、哪句在裸奔。
实现上有两种主流做法:一是 LLM-as-judge,用独立的裁判提示词扮演事实警察,逐句判断主张是否被材料蕴含;二是用自然语言推理(NLI)模型打分。以 NLI 为例,模型同时编码主张与证据,输出蕴含、矛盾、中立三个类别的概率,用支持概率衡量一句主张的可靠程度:
自我校验相当于第一道自检线:成本低、速度快,但和厨师长自己尝菜一样,只能拦住“明显翻车”。尝不出来时,还得靠后面的双人采购(多路检索验证)和质检员(评估指标)来把关。
- 主张向量把待验证的原子主张 c 输入文本嵌入模型,得到稠密向量,语义相近的句子在向量空间里距离更近。
- 证据向量把检索到的候选证据片段 d 同样编码成向量。
- 语义点积两个向量做内积,值越大说明主张与证据的语义重合度越高。
- 概率映射用 sigmoid 函数把点积结果压到 0 到 1 之间,作为“该主张被证据支持”的概率。
多路检索验证
为了不让厨师长一个人说了算,后厨引入“双采购制”:两位采购员各自按清单去不同的市场进货,回来当面对账。同一样食材两边都买到了,才敢写进菜单;只有一家买到,就要标注“来源待确认”。
对应到 RAG,就是多路检索交叉验证。系统用多个异构检索通道同时召回——稀疏的 BM25 关键词检索、稠密的向量语义检索、再叠加查询改写或多种召回策略——形成一个“证据矩阵”。对答案中的每个主张,统计它在几路证据里出现:多路共同命中,说明证据扎实;只有一路命中,可能是偶然噪声,需要降权或剔除。
交叉验证的数学表达很直观:假设有 K 路检索通道,每条通道对主张 c 给出一个支持分 s_k(c),当分数超过阈值 τ 时记该路命中,把所有通道的平均命中率作为证据一致性分数:
双采购制不能保证每次都对——两家市场可能同时缺货或同时被误导——但它能极大过滤“单点噪声”。多路证据互相印证后,模型才敢把结论写进答案,这也是对付“巧言令色”的最朴素武器:让几张嘴说同一件事。
- 通道枚举K 代表 K 路独立检索通道,比如一路 BM25、一路向量检索、一路查询改写后的检索。
- 单路判定第 k 路给主张 c 打出的支持分 s_k(c),超过阈值 τ 时记 1,否则记 0。
- 平均投票把 K 路的 0/1 结果求平均,得到证据一致性分数,越接近 1 说明越多通道证实该主张。
引用溯源对齐
这家餐厅还有一条规矩:每道菜上桌,必须挂食材小票编号。宾客按编号能查到采购记录:这条鱼是哪天进的、哪个供应商送的。如果小票编号编得对不上任何进货单,或者小票写着“白菜”盘子里却是“萝卜”,这道菜立刻退货。
这就是引用溯源(attribution)。RAG 系统要求模型生成答案时,为每条关键陈述显式标注来源编号,编号对应检索返回的某个片段。但这只是“形式合规”——模型完全可能编一个不存在的编号,或者把 A 片段的内容安到 B 片段头上。所以必须再做一步对齐校验:把编号对应的原文片段拉出来,与这句主张做语义比对,确认“票货一致”。
对齐校验的质量用两个指标量化:引用精确率,衡量模型标出的引用里有多少真正支撑了对应陈述;引用召回率,衡量所有需要证据支撑的陈述里,有多少被模型正确标出了引用:
小票制度的威力在于“可回溯”:一旦宾客(或质检员)对某句话存疑,顺着编号就能翻到原始材料。对不上的引用在端上前就被拦截,幻觉也就无处遁形——这是让模型承担“举证责任”的设计。
- 需要证据的陈述N_need 统计答案中所有“必须有依据才可靠的陈述”数量,比如涉及具体数字、日期、法条的主张。
- 实际引用的陈述N_cite 统计模型生成时真正给出引用编号的陈述数量。
- 票货一致的陈述N_supp 统计那些“标注了引用、且引用片段经对齐校验真实支持该陈述”的数量。
- 两个比率精确率看“引用的东西靠不靠谱”,召回率看“该引的东西漏没漏”,两者结合才是完整的溯源画像。
防幻觉提示策略
后厨墙上挂着一块白板,写着三条铁律:缺货就写明“沽清”,不许拿相似食材顶替;菜谱没写的步骤不许自行发挥;每道菜必须写清楚用了哪几号食材。
对应到 RAG,这就是防幻觉提示策略——把纪律写进指令,在生成前就约束行为。常用的提示有三条:一,只依据给定材料回答,不得使用内部知识补充;二,每条关键陈述必须附引用编号;三,材料中没有依据时,直接回答“资料不足,无法确认”。第三条最重要,它给了模型“认怂权”,从源头掐断编造冲动。
除了提示词,还要配检索兜底(fallback):首轮检索的相关度低于阈值时,不急着让模型硬答,而是触发二次检索——改写查询、扩大召回范围、换个检索器再试。仍找不到足够证据,就输出拒答。用门控逻辑表示就是:
提示词不是魔法咒语,它的本质是把“不许犯错”变成“宁可少答”。就像白板铁律一样,厨师有权利说“这道菜今天做不了”,但不能骗客人说“我们就是这么做地道的”——模型的“沽清”,是用户最需要的诚实。
- 相关度计算Rel(q, d) 表示问题 q 与检索片段 d 的相关度,通常由 embedding 相似度或重排序模型给出。
- 取最高分max 表示在所有检索片段中挑相关度最高的那个,作为“材料是否够用”的判断依据。
- 门控分支最高分仍低于阈值 τ 时输出拒答 Refuse(q);否则交给生成器 Generate(q, D) 结合材料作答。
检测评估指标
光靠口头规矩不够,后厨引入了质检打分表。质检员每周随机抽一百道菜盲测,按固定量表记录:这道菜严格按食材小票做了吗?摆了盘却找不到依据的工序有几处?打分表把“感觉”变成数字,月度趋势一目了然。
对应到 RAG,指标中最核心的是忠实度(faithfulness),它回答的问题是:答案里有多少内容是检索上下文真正撑起来的?计算时先把答案拆成原子主张,逐一判断是否被上下文支持,然后统计占比:
忠实度之外,还有一组配套指标:答案相关性衡量回答是否切题,上下文相关性衡量检索回来的材料是否跟问题有关,引用准确率衡量溯源可靠性,幻觉拦截率衡量校验器的生产力。评测时要建一个覆盖典型问题与边界问题的黄金集(golden set),定期跑批量,观察均值与 P95,知识库一更新就回归一遍。
打分表不是为了扣厨师奖金,而是让后厨知道哪类菜最容易翻车:如果本周“断章取义”类投诉上升,就该检查食材切片是不是太碎了(检索切片过大/过小);如果“编造”类上升,就该想想是不是该重新培训厨师(调 prompt)。指标是预警灯,不是绩优表。
- 原子主张集合答案先被拆成 n 条互不重叠的原子陈述,作为忠实度计数的分母来源。
- 支持计数用 NLI 模型或裁判 prompt 逐条判断,统计被检索上下文支持的陈述数。
- 求比例支持数除以总陈述数,得到的 0~1 分值就是忠实度,1 表示句句有据。
工程落地实践
把整套质检体系装进真实运营,后厨做的第一件事不是开会喊口号,而是先把“质检”变成流程的一部分:晨会看投诉报表、采购对账、出菜抽查,一环扣一环。
RAG 工程落地同样讲究体系化。上线前,先建 200~500 条的评测集,覆盖真实问题分布、含 5% 以上的边界情形(材料缺失、问题模糊、多义术语),跑通基线。上线后,对每条回答实时计算忠实度与引用精确率,记录幻觉率走势;超过阈值的回答降级处理——标黄提示、附上“仅供参考”或直接转人工。
更关键的是反馈闭环:线上发现的高风险 bad case 回流到评测集,定期复盘是哪类幻觉——检索没召回?提示词约束不够?还是知识库本身过时?然后对应修正:更新知识库、调检索参数、改写 prompt,再跑回归评测,通过后才允许上线。高敏场景(医疗、法律、金融)还要加上人工抽检复核(human-in-the-loop),把阈值调得更严。
后厨最难的不是做出一道好菜,而是天天稳定地做出好菜。RAG 同理——幻觉检测与事实校验不是上线前的“一次性补丁”,而是持续运转的质量体系:分型、自检、交叉、溯源、提示、评估、复盘,七道工序缺一不可,最终形成闭环。
AI 应用场景
医疗病历问答校验
阶段:生成后校验
解决的问题:病历问答中,模型编造药物禁忌会直接危害患者。传统人工逐条核对病历耗时巨大;AI 在生成后自动把结论拆成主张,与检索到的病历、药典逐条比对,无依据的结论直接标红并转人工复核。
具体案例:医生问“患者目前用药是否与华法林冲突?”,系统检索患者既往用药记录与药品说明书,校验器发现答案中“可同时服用”一句在检索材料中无出处,立即改答“材料不足,建议咨询临床药师”。
金融研报引用溯源
阶段:引用对齐
解决的问题:投研助手引用财务报表数据时,张冠李戴或伪造编号会带来合规风险。传统做法靠分析师翻原文核对;AI 强制答案每条数据带来源编号,再用引用精确率自动对齐原文,对不上的引用直接标错。
具体案例:助手回答“公司 Q3 营收同比增长 23%”,溯源校验发现该数字出自 Q2 财报,判定为错误引用并拦截,避免错误数据进入研报。
法律条文多路交叉验证
阶段:检索后验证
解决的问题:法律问答中不同法条相互交叉引用,单路检索容易遗漏条款上下文。传统只凭记忆答复风险高;AI 用多路检索交叉验证,只有多路证据一致的条文才允许被引用。
具体案例:用户问“合同无效的法定情形”,系统分别用关键词检索和语义检索召回《民法典》相关条文,交叉验证后只输出两路共同命中的第 144、146、153 条,避免模型把相邻条文混在一起。
Python 演示
# -*- coding: utf-8 -*-"""RAG 幻觉检测与事实校验演示: 拆解主张 -> 证据比对 -> 忠实度打分"""import re def extract_claims(answer): """把回答拆成句子级原子主张""" return [s.strip() for s in re.split(r"[。!?!?]", answer) if len(s.strip()) > 2] def tokenize(text): """用二元词组近似切分中文""" return {text[i:i + 2] for i in range(len(text) - 1)} def is_supported(claim, contexts, threshold=0.2): """判断单个主张是否被任一检索片段支持""" claim_set = tokenize(claim) if not claim_set: return False for ctx in contexts: ctx_set = tokenize(ctx) union = claim_set | ctx_set jaccard = len(claim_set & ctx_set) / max(len(union), 1) if jaccard >= threshold: return True return False def verify_answer(answer, contexts): """事实校验主流程: 拆主张 -> 逐条核对 -> 计算忠实度""" claims = extract_claims(answer) details = [(c, is_supported(c, contexts)) for c in claims] supported = sum(1 for _, ok in details if ok) faithfulness = supported / len(details) if details else 0.0 return faithfulness, details def demo(): contexts = [ "RAG先从知识库检索与问题相关的文档片段," "再把片段拼进提示词,让大模型基于材料生成回答。" "研究显示,即便使用RAG,大模型仍可能出现与材料不符的幻觉。" ] ok_answer = "RAG会先从知识库检索文档,再让模型基于材料生成回答。" bad_answer = "RAG系统完全不会产生幻觉,模型从不编造任何内容。" for answer in (ok_answer, bad_answer): score, details = verify_answer(answer, contexts) print("回答:", answer) print("忠实度: %.2f" % score) for claim, ok in details: print(" - %s -> [%s]" % (claim, "有依据" if ok else "无依据")) if __name__ == "__main__": demo()
claims = [s.strip() for s in re.split(r"[。!?!?]", answer) if len(s.strip()) > 2]把整段回答切成一句句“原子主张”,这是校验的最小单位claim_set & ctx_set求主张与证据片段的重叠二元词,近似衡量“这句话在材料里有没有着落”jaccard = len(claim_set & ctx_set) / max(len(union), 1)Jaccard 相似度,重叠越多说明越有依据faithfulness = supported / len(details) if details else 0.0忠实度等于有依据主张数除以总主张数,对应正文的评估指标公式if __name__ == "__main__":保证脚本可直接运行,也方便被其他模块引用
常见误区
误区我一直以为只要把知识库接进大模型,模型就会老老实实照着材料回答,RAG 之后幻觉就彻底消失了。
正解RAG 只是把材料塞进提示词,并不能保证模型句句服从。材料不完整、检索召回偏、模型“自由发挥”时,幻觉仍会出现。就像把菜谱放在厨师面前,他照样可能手一抖多加三勺盐。因此需要校验层兜底,而不是默认 RAG 安全。
为何常见:RAG 的输出看起来有出处、有引用,给人一种“已经查过资料”的错觉,容易忽略生成环节本身的不确定性。
误区我经常在 prompt 末尾加一句“请确认你的回答是否准确”,以为模型自我检查就能筛掉幻觉。
正解模型自己确认时往往会把原本的错误说得更自信,这叫自我强化。可靠的自我校验必须“让证据说话”:把答案拆成主张,逐条回到检索上下文中找依据,由独立的 NLI 模型或裁判 prompt 判定,而不是让同一个模型凭感觉复读。
为何常见:大模型对话能力太像人类“想了一下再改口”,让人误以为它真的在反思,其实它只是在流畅地续写。
误区只要模型的答案每句话后面都跟着【1】【2】这样的引用编号,我就觉得可以放心上线。
正解编号可能是模型编出来的幻觉引用——编号指向的片段根本不存在,或者张冠李戴。必须做引用溯源对齐:把编号对应的原文片段拉出来,和该句主张做一致性比对,统计引用精确率和召回率,才能判断引用是否真实可信。
为何常见:人类看到数字和编号天然觉得“有据可查”,而模型恰好擅长生成看起来规范的编号格式。
误区我做多路检索就是多接几个搜索引擎,把返回的结果全塞进 prompt,文档越多答案越可靠。
正解多路检索的价值在于“交叉验证”:多个异构通道(稀疏+稠密+查询改写)独立召回,只有多方共同命中的证据才可信。文档堆得越多反而稀释注意力,还可能引入互相矛盾的噪声,需要一致性投票和置信度加权处理冲突。
为何常见:“多就是好”的直觉,让人忽略了检索后验证环节才是多路召回真正发挥价值的地方。
误区我看评测面板上忠实度 0.95,就觉得系统回答非常安全,可以直接上线。
正解忠实度只衡量“答案是否基于检索材料”,不衡量材料本身是否正确、是否切题。如果知识库里本身就是过期或错误的信息,忠实度再高也是在传播错误。还需要结合答案相关性、上下文相关性、引用准确率等指标一起看。
为何常见:单一数字指标容易带来确定感,而真实世界的质检需要多维度交叉,避免“一道菜按坏菜谱做得很认真”。
面试题
Q1. RAG 流程中“检索”环节的主要作用是什么?
- A.让大模型生成更长的输出文本
- B.从知识库中召回相关文档片段← 正确答案
- C.对模型的生成结果做重新排序
- D.直接压缩模型的参数量大小
答案:B。RAG 的检索环节负责从知识库召回与问题相关的文档片段,相当于后厨的采购员去买菜。A 是生成环节的职责,C 是重排序模块,D 与检索无关。选 B——没有采购员,厨师再厉害也没米下锅。
Q2. 按幻觉成因分类,“断章取义”型幻觉通常指什么?
- A.模型完全遗忘了检索文档标题
- B.截取孤立片段并歪曲文档原意← 正确答案
- C.把检索到的英文文档做了翻译
- D.检索模块返回了空文档结果
答案:B。断章取义指模型只截取检索片段中的孤立语句、脱离上下文作答,导致原意被歪曲。好比只看到菜谱上写着“加少许盐”就把半罐盐倒进锅里。A 属于细节遗漏,C 是翻译行为,D 是召回失败,均不符合定义,因此选 B。
Q3. 自我校验中把答案拆成“主张”(claim)的目的是什么?
- A.让答案在结构上显得更加有条理
- B.逐条审核陈述是否具备检索依据← 正确答案
- C.通过压缩文本减少生成字数
- D.优化检索模块的响应速度
答案:B。把答案拆成原子主张,是为了让证据比对有最小审查单元,逐句定位哪句没有依据。A 是附带效果而非目的,C 与校验无关,D 是检索侧优化。就像质检员一粒一粒挑米,而不是整锅看完说“还行”,所以选 B。
Q4. 多路检索交叉验证的核心思想是什么?
- A.多路独立证据互相印证降低误判← 正确答案
- B.换用参数规模更大的底座模型
- C.把知识库冗余备份成多份保存
- D.要求用户反复输入同一种问题
答案:A。交叉验证的核心是用多个独立检索通道的证据互相印证,降低单路噪声带来的误判。B 换大模型不能保证更忠实,C 备份知识库不改变内容质量,D 让用户重复提问既不友好也不可靠。好比两位采购员分头去两家市场对账,选 A。
Q5. 引用溯源中“引用精确率”衡量的是什么?
- A.引用片段中真正支持答案的比例← 正确答案
- B.回答中引用符号出现的次数
- C.知识库文档条目的总数量
- D.检索模块平均消耗的时间
答案:A。引用精确率衡量模型给出的引用中真正支持对应陈述的比例,即“引用了的东西靠不靠谱”。B 统计符号数量没有意义,C、D 与校验无关。就像查采购小票:写了的编号里有多少真能对得上进货单,因此选 A。
Q6. 多路检索中证据出现冲突时正确的做法是什么?
- A.以时间上最早返回的一路为准
- B.用一致性投票与置信度加权综合← 正确答案
- C.直接把冲突证据从知识库中删除
- D.让模型自由发挥不再参考任何证据
答案:B。证据冲突时应综合所有通道,用一致性投票与置信度加权判断。A“先到先得”不科学,C 删除冲突证据会丢失信息,D 放弃证据正是幻觉源头。如同采购对不上账时查市场均价做第三方佐证,而不是轻信先回来的人,故选 B。
Q7. 防幻觉提示词中“资料不足则拒答”的本质是什么?
- A.无依据时明确拒答而不是凭空编造← 正确答案
- B.无论什么情况都拒绝回答用户
- C.把全部答案都写得模棱两可不表态
- D.只输出检索原文而不做任何加工
答案:A。“资料不足则拒答”的本质是让模型在无依据时明确承认不知道,宁可少答也不编造。B 把拒答扩大为全部拒绝是矫枉过正,C 模棱两可损害可用性,D 只回原文无法完成推理型问答。像菜单写明“沽清”而不是硬上替代菜,所以选 A。
Q8. RAG 幻觉的主要成因包括哪些?
- A.对检索文档内容进行断章取义← 正确答案
- B.超出材料范围进行过度推理← 正确答案
- C.知识库压缩导致存储空间溢出
- D.编造检索结果中不存在的事实← 正确答案
答案:ABD。断章取义、过度推理、编造事实是幻觉的三大主要成因;C“存储溢出”是工程故障而非模型行为层面的幻觉。区分成因才能对症下药——先分清是食材不对、火候过头还是厨子乱编,故选 A、B、D。
Q9. 下列哪些属于事实校验阶段常用的技术手段?
- A.把答案拆解成原子级主张← 正确答案
- B.用自然语言推理判断证据关系← 正确答案
- C.对生成 Token 做随机采样
- D.计算引用片段与主张的一致性← 正确答案
答案:ABD。事实校验的常用手段包括把答案拆成原子主张、用 NLI 判断主张与证据关系、计算引用片段与主张的一致性;C 的随机采样是生成阶段的解码策略,与校验无关。校验层做的是“回头查账”,不是“掷骰子”,故选 A、B、D。
Q10. 关于忠实度与答案正确性的关系,下列说法正确的是?
- A.忠实度高说明答案一定完全正确
- B.忠实度只度量答案是否基于材料← 正确答案
- C.材料错误时高忠实度仍会误导← 正确答案
- D.需结合相关性与上下文性综合评估← 正确答案
答案:BCD。忠实度只衡量答案是否被检索材料支持,不判断材料本身对错;材料错误时高忠实度同样误导用户,故 A 错、B 和 C 对。要综合答案相关性、上下文相关性等指标评估,D 对。就像一道菜完全按坏菜谱做,依然是一道坏菜,故选 B、C、D。