跳到主要内容

为生产环境中的 LLM 构建幻觉检测流水线

· 阅读需 15 分钟
Tian Pan
Software Engineer

你的 LLM 应用通过了每一项评估(eval)。演示看起来完美无缺。接着,一位用户询问了一个利基监管要求,模型自信地引用了一个根本不存在的法规。十二小时后,这份支持工单躺在了你的收件箱里,而那个虚假的答案早已被转发给了合规团队。这就是生产环境中的幻觉问题:并不是模型会犯错,而是它们犯错时表现出的流畅度和自信心,与它们回答正确时完全一样。

大多数团队将幻觉视为提示词(prompting)问题——增加更多上下文、调整温度(temperature)、告诉模型“仅使用提供的信息”。这些措施有所帮助,但并不能解决根本问题。事后验证(Post-hoc verification)——即在生成后检查主张,而不是寄希望于模型不产生幻觉——比任何仅限预防的策略都更便宜、更可靠,且能更好地与现有基础设施结合。

幻觉的三种类别

并非所有幻觉都是平等的,你的检测策略取决于你正在处理哪种类型。

捏造(Fabrication) 是最危险的类别。模型虚构了在任何来源中都没有根据的实体、引用、统计数据或事件。一个捏造的法律引用在语法上看起来是正确的——标准的报告格式、看似合理的卷号——但却指向了一个从未宣判的案例。研究估计,在已发表的文献中,由 AI 幻觉产生的引用目前已达数十万条。捏造需要存在性验证:检查引用的实体是否确实存在于权威来源中。

矛盾(Contradiction) 发生在模型的输出与其提供的上下文信息相冲突时。RAG 系统检索到的一份文档称季度营收为 42 亿美元,而模型的摘要却说是 48 亿美元。这是机械检测最容易实现的类别,因为你的上下文窗口中就有事实标准(ground truth)。自然语言推理(NLI)模型在这方面表现出色——它们可以分类一个主张是被源段落蕴含、中立还是矛盾。

过时的知识(Outdated knowledge) 是最微妙的失败模式。模型的参数化知识在训练时是正确的,但世界已经发生了变化。某家公司更换了 CEO,一项法规被修订,或者一个库弃用了一个函数。这类问题尤其具有误导性,因为模型以极高的自信陈述它所训练的事实,而任何提示词工程都无法解决训练数据的问题。检测需要具备新鲜感感知(freshness-aware)的检索:根据当前来源检查主张,而不是信任模型的内部知识。

每个类别都需要不同的检测机制。一个能捕获矛盾但忽略捏造的流水线会提供虚假的信心——你抓住了简单的问题,却漏掉了那些真正损害信任的问题。

生产环境检测流水线的解剖

最有效的幻觉检测架构遵循三阶段模式:分类、检测、解释。这种方法由 vLLM 的 HaluGate 等系统率先采用,通过避免对不需要的查询进行昂贵的检测,在延迟和精度之间取得了平衡。

阶段 1:哨兵分类(Sentinel classification)。 并非每个 LLM 响应都需要事实核查。创意写作、头脑风暴和寻求意见的查询可以不经检查直接通过。一个轻量级的二分类器——带有 LoRA 适配器的微调编码器模型——负责确定传入的查询是否属于事实寻求型。该分类器在 P50 下的运行时间约为 12 ms,并能过滤掉约 35% 的不需要验证的请求,从而将下游检测成本降低 70% 以上。

阶段 2:Token 级检测。 对于事实寻求型查询,Token 分类器会根据提供的上下文(工具输出、RAG 结果或其他参考来源)检查响应中的每个 Token。与其为整个响应生成一个“是否幻觉”的二进制标签,Token 级检测能准确识别哪些片段(span)缺乏支持。输入格式将上下文、问题和回答通过分隔符连接起来,分类器将每个回答 Token 标记为受支持或不受支持。连续的不受支持 Token 会合并为片段,以便生成人类可读的输出。

阶段 3:NLI 解释。 仅靠 Token 级检测会产生约 33% 的误报率,并漏掉约一半的实际幻觉。解释层对每个标记出的片段应用自然语言推理(NLI),将其分类为蕴含(entailed,可能是误报——将其过滤掉)、中立(neutral,无法核实的主张)或矛盾(contradicted,直接的事实错误)。这种三路分类映射到严重性评分,从而驱动下游决策:矛盾的响应会被拦截或标记,中立的主张会被记录以供审查,而蕴含的结果则被放行。

整个流水线的总延迟在 P50 下为 76 ms,在 P99 下为 162 ms——相对于典型 LLM 5 到 30 秒的生成时间来说微不足道。延迟随上下文长度线性增加:4K Token 约为 125 ms,16K Token 则上升至 365 ms。

Grounding:你的 Ground Truth 来源何处

一个检测流水线的好坏取决于其参考资料的质量。在生产环境中,Ground Truth 的三个实际来源是工具输出、RAG 检索结果和结构化数据。

工具输出作为 Ground Truth。 如果你的智能体(agent)调用了一个返回结构化数据的函数 —— 数据库查询、API 响应、计算结果 —— 那么该输出就是你置信度最高的参考。模型的响应应与这些工具结果保持一致。这是最简单的验证路径,因为工具输出通常是精确且机器可读的。在函数调用(function-calling)架构中,工具响应内容直接作为幻觉检测的上下文。

RAG 检索结果。 检索到的段落为知识密集型查询提供了 Grounding(依据),但它们引入了一个复杂问题:检索本身可能不足。研究表明,即使检索按相似度指标“成功”了,超过 50% 的复杂检索查询仍缺乏正确生成所需的充足上下文。你的检测流水线需要区分三种失败模式:模型在拥有正确上下文的情况下产生幻觉(生成失败)、检索到的上下文不包含答案(检索失败),或者模型正确地拒绝回答(这是上下文不足时的预期行为)。

结构化数据和知识库。 对于实体验证 —— 检查引用的个人、公司、法规或产品是否真实存在 —— 你需要对照权威来源进行查找。这不需要模型;数据库查询或 API 调用就足够了。挑战在于覆盖范围:你需要针对你的领域拥有正确的参考数据。

一个关键的设计原则是:永远不要根据模型自身的输出来验证其陈述。使用同一个 LLM 同时进行生成和验证会创建一个闭环,模型会在其中确认它自己的捏造。跨模型验证(使用不同的模型进行检查)有所帮助,但对照外部来源进行 Grounding 始终是首选。

在没有“人机回环”瓶颈的情况下衡量幻觉率

你无法修复你无法衡量的东西,如果每个陈述都需要人工审核,你就无法大规模衡量幻觉。六个自动化指标构成了一个实用的测量栈。

忠实度 (Faithfulness) 是主要指标。对于模型输出中的每一句话,检查它是否得到所提供上下文的支持。实现方式从基于 NLI 的蕴含评分到带有约束评分细则的 LLM-as-a-judge 不等。未经支持的陈述与总陈述的比率为你提供了每个响应的忠实度得分。汇总整个流量的数据以获得系统级的幻觉率。

片段级归因 (Span-level attribution) 超越了二元的忠实度,用于验证引用是否真正支持了其陈述。引用存在与否与事实准确性之间几乎没有相关性 —— 无论引用是否支持陈述,模型引用段落的频率几乎相同。你需要验证:(a) 引用的段落确实存在,(b) 它确实蕴含了其所附带的陈述。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates