幻觉检测 Hallucination Detection

Hallucination Detection

在 LLM 生成答案后,通过事实核查、召回文档对齐、多模型交叉验证等技术手段自动识别输出中不存在于上下文或不符合真实世界事实的虚构内容。

详细解释

LLM Hallucination Detection(幻觉检测 / 事实核查) 一句话定义:LLM 天生会编(幻觉率在开放域生成里约 5% 至 20%),你不能指望它自己说「我编了」——所以必须在答案吐给用户之前,加一个独立的核查层,把生成的答案和「已知真实信息源(RAG 召回文档 / 企业知识库 / 外部权威数据库)」逐句、逐事实点比对,标记出不一致的地方并做拦截/修正。很多团队做 RAG 上线后翻车,就是因为他们觉得「给了上下文 LLM 就不会瞎编」——实测即使有 Top-10 chunk 作为上下文,LLM 仍然会在 8% 至 15% 的回答里掺杂上下文里没有的假信息,幻觉检测就是最后一道防线。

幻觉分两类:(1) 内在幻觉(Intrinsic / Contextual Hallucination)——生成的内容和给定的 RAG 上下文不一致(上下文写「张三是 CTO」,回答写「张三是 CEO」),这个是 100% 可以自动化检测的,也是 RAG 场景下最主要的问题;(2) 外在幻觉(Extrinsic / Factual Hallucination)——生成的内容和上下文一致但和真实世界事实不一致(上下文是一份假的 PDF 文档,LLM 照着 PDF 念了,但 PDF 本身就是错的),这个很难自动检测,通常要靠外部权威知识库或人工复核。

唯元智创 控制台的 Guardrails 模块内置了「三档幻觉检测开关」:低档(轻量 NLI 分类器,20ms,¥0.0003,适合 FAQ)、中档(LLM-as-Judge 逐句判,150ms,¥0.003,适合绝大多数场景)、高档(三模型交叉验证 + 外部知识图谱核验,500ms,¥0.02,适合金融医疗等高风险)。打开后自动在网关层拦截,幻觉标记 >0.2 的回答要么自动重写要么拒绝输出,不会流到用户端。

主流幻觉检测技术方案对比(2025 年工程落地推荐)

方案技术原理延迟单次成本准确率(内在幻觉)准确率(外在幻觉)推荐场景
① NLI 分类器(Natural Language Inference)小型 Transformer(BERT/DeBERTa 300M 参数)专门在「前提-假设」对上二分类训练:输入=(召回文档所有 chunk 拼接=前提,生成答案=假设),输出=蕴含/中立/矛盾三分类20-50ms¥0.0001 至 ¥0.000582% 至 88%几乎为 0FAQ、聊天机器人等低风险场景
② LLM-as-Judge 逐句 + Rubric把生成答案按句号/换行切分成 N 个事实句,每一句单独送给 LLM(GPT-4o-mini 级别),配合固定 Rubric 判「是否有上下文支撑 / 支撑来源是哪段」,最后统计无支撑句子占比100-300ms¥0.002 至 ¥0.00892% 至 97%30% 至 40%(Rubric 里加「常识核对」可提升)90% 企业生产场景默认选这个
③ 检索增强式核查(SelfCheckGPT 风格)把生成答案再拆成 N 句,每一句反过来作为查询去知识库重新检索,如果检索回来的 Top-3 文档和这句话相似度 <0.6 就标为幻觉300-800ms(多次检索)¥0.005 至 ¥0.02(含多次检索)88% 至 93%50% 至 60%(外部知识被重新检索到)没有 RAG 上下文的纯开放域生成场景
④ 多模型交叉投票同一个问题 + 相同上下文,让 3 个不同厂商/不同架构的模型独立生成答案,三者一致的事实点=真,不一致=标疑1-3s(三倍生成)¥0.03 至 ¥0.1(三倍成本)95% 至 98%60% 至 70%(依赖三个模型的多样性)金融、医疗、法律等合规要求极高的场景
⑤ 结构化事实抽取 + 知识图谱对齐从生成答案中抽取出(实体, 关系, 值)三元组,去企业知识图谱 / Wikidata / 内部数据库里逐条验证存在性400ms-2s(含数据库查询)¥0.01 至 ¥0.0590%+(对结构化事实)70%+(如果图谱覆盖率够)有成熟知识图谱的企业,只核查数值类、实体类事实

幻觉检测落地的三个工程铁则(别踩)

铁则 1:不要只做「整段答案打一个分」,必须做「原子事实级」的细粒度标注。整段打分的问题是——100 字答案里只有 10 字是编的,整体分数可能是 0.9(看起来没毛病),但就是这 10 字假信息导致客诉。正确做法:先把答案切分成「原子事实单元」(NLP 工具或 LLM 输出 JSON 列表,每个事实带 start/end 字符偏移),每个事实单元单独核查,最终输出必须是「每一句话对应的:状态(已验证/矛盾/无资料) + 证据来源(是哪段召回 chunk 的哪句话支撑的)」。用户端 UI 上,已验证的句子打绿勾,无资料的句子标黄(「以下内容未在知识库中找到引用」),矛盾的句子打红叉直接拦截不输出。

铁则 2:检测拦截后不要直接报错,必须走「自动修正 → 降级 → 人工」三级兜底链路。90% 的团队第一次上线幻觉检测时的做法是「幻觉率超阈值 → 给用户返回 ‘抱歉我无法回答这个问题’」——用户体验极差。正确的三级兜底:(1) 自动修正级:检测到哪句是幻觉,把这句删掉,同时把「该句对应的原始问题 + 更全的召回 chunk(Top-20 而不是 Top-10) + 提示 ‘请只根据上下文回答,禁止额外信息’」喂回生成模型,重新生成只针对该句的替换内容,替换后再过一次检测,通过就输出;(2) 降级级:自动修正失败两次,把答案中已验证的部分先返回给用户,标红一句「以下部分正在人工复核,10 分钟内更新」,同时自动创建人工工单;(3) 人工级:连续 3 次修正都失败且属于高风险请求(金融医疗建议等),直接转人工坐席,不吐自动答案。这一套下来,幻觉检测上线对用户可用率的影响从 -15% 降到 -1% 以内。

铁则 3:检测模型和生成模型必须解耦,最好不要用同一厂商同一系列。用 GPT-4o 生成再用 GPT-4o 检测等于「自己查自己的作业」,相关性偏差会让检测准确率掉 5% 至 10%——生成模型编了一个假事实,因为是同一个模型的知识分布,检测模型可能会「觉得合理」就放过了。最佳实践:生成用强模型(如 GPT-4o / Claude Opus,追求创造力和质量),检测用不同厂商的小模型(如 Anthropic Claude Haiku 做 Judge,或者开源 Qwen2.5-7B 微调 NLI 任务),两套链路完全独立,检测准确率最稳定。

常见问题

LLM-as-Judge 检测幻觉会不会本身就有偏见?比如喜欢给长回答打「无幻觉」分?
会,而且是 LLM-as-Judge 幻觉检测最大的系统误差源——三个经典偏见:长度偏见(长回答被认为更可信)、位置偏见(答案开头的幻觉更容易被放过)、格式偏见(用了列表/加粗等格式的回答更可能被判对)。但都是可以通过 Prompt Engineering 消掉的:(1)强制逐原子事实核查——在 Judge Prompt 里明确写「必须把答案先切分成 N 条独立事实,每条单独查,不允许看整体长度给印象分;每查到一条无支撑幻觉,不管整段多长都要扣分」;(2)加入长度反偏见校准——在 Rubric 里明确写「如果一段回答有 20 条事实其中 1 条幻觉,和一段回答只有 1 条事实且是幻觉,两者严重程度相同」,防止长回答稀释;(3)加入「对照负样本」——每次 Judge 前塞 2 个「看起来格式完美但全是幻觉」的负样本示例到 Prompt 里,告诉 Judge 「长、格式漂亮的回答也可能全是错的」;(4)用校准过的 Judge 模型——开源的 TruthfulQA 数据集 + 专门的 Hallucination Judge 微调权重(如 Zephyr-Hallucination-Judge、Prometheus 2)已经做过去偏,比直接用通用模型当 Judge 准确 10%。按这四条整改,Judge 的偏见系数能降到 2% 以下。
我的知识库本身就是脏的(有过时信息、错别字、错误数据),检测模型照着错误知识库判「一致」,最后给用户的答案还是错的怎么办?
这个问题叫「上游脏数据导致的幻觉转嫁」——幻觉检测只能查「答案 vs 给定上下文」的一致性(内在幻觉),无法自动判断「上下文本身对不对」(外在幻觉 / 数据质量问题),但可以通过四层机制大幅缓解:(1)知识库质量分级 + 引用加权——给每个文档 chunk 打「权威等级」标签(如:官方最新文档=A级,历史旧文档=C级,外部用户评论=D级),检测时如果生成答案的唯一证据来源是 C/D 级文档,标为「证据等级不足」视为黄色警告,不会放行给高风险用户;(2)时间戳新鲜度核查——对于包含「政策/价格/版本」等时效性强的事实,自动比对 chunk 的更新时间,如果超过设定的有效期(如价格超过 180 天未更新),标为「信息可能过时」;(3)多源交叉验证——对于数值类事实(价格、参数、员工数等),检测时自动触发在「知识库 chunk + 内部主数据数据库 + 官网爬取最新版本」三个源里查,如果三个源不一致直接标红拒绝;(4)「知识不一致」告警回流——当检测系统发现同一个实体的两个 chunk 说法矛盾时(A 文档写 100 人,B 文档写 500 人),自动创建知识库修正工单,通知内容运营团队清理脏数据,从源头减少问题。
幻觉检测加上后 P95 延迟从 800ms 变成了 1.5s,怎么加速?
幻觉检测确实是流水线中比较重的环节,但工程上有四个并行化和分层化的技巧可以把延迟压回 1s 以内:(1)流式并行检测——生成模型边输出 token,检测模型边按句并行核查,不需要等整个答案生成完再开始检测,答案最后一个 token 吐完 50ms 内检测也出结果了,延迟完全隐藏在生成过程中;(2)分档触发——不是所有请求都开中档/高档检测,低风险场景(闲聊、FAQ、格式整理)只开轻量 NLI(50ms),高风险场景(金融建议、法律条款解读)才开 LLM-as-Judge 中档(200ms+);(3)检测缓存——对同一个问题 + 同一个上下文的「答案-上下文对」做 hash 缓存,24 小时内重复请求的检测结果 0ms 命中;(4)降级「快速通道」——如果生成答案中的每一句话在上下文里都能找到精确的字符串匹配(而不是语义改写),直接跳过 LLM Judge,因为逐字引用上下文的幻觉率是 0,这一条能覆盖 20% 至 40% 的简单问答请求。四个技巧组合使用,实测 P95 延迟从 1.5s 降到 850ms 左右,几乎和不加检测持平,同时幻觉拦截率只降了 0.5%,几乎无损。