一个客服问答的失败现场
某企业的知识库问答系统收到提问:“我们的退款政策对跨境订单是否适用?”检索模块返回了三段文档,其中一段明确写着跨境订单不适用七天无理由退款。生成模型却回答:“跨境订单同样享受七天无理由退款,只需在签收后七天内提交申请。”答案语句通顺、格式规范,和检索到的证据直接矛盾。
这类错误不是检索没找到资料,而是模型在有正确上下文的情况下仍然输出了与证据冲突的内容。RAG 常被描述为“给模型外挂知识库”,但检索只是把候选文本放进提示词,模型是否忠实使用这些文本,是另一个独立问题。企业场景里,一条错误答案可能涉及退款、合规或医疗建议,因此需要在答案返回用户之前自动判断它是否可信。
自动验证要回答两个不同的问题:答案的每个主张是否被检索证据支持,以及模型在生成时是否处于高不确定性状态。前者依赖证据一致性检查,后者依赖概率、熵或采样一致性等信号。两类方法各有失效边界,工程上通常需要组合使用并设定分级处置策略。
基线方案的失效点
最直接的基线是让生成模型自己评价答案。例如用提示词要求模型对答案置信度打 1~5 分,或让另一个模型判断答案是否与上下文矛盾。资料 4 的评估显示,这类自我评价在较简单的数据集上有一定效果,但在需要多步推理或大量数值上下文的场景中表现不稳定。模型对自己生成的错误答案常常给出较高置信度,因为流畅性和事实正确性在模型内部并不完全对应。
另一个基线是只检查检索是否命中。如果检索返回了相关文档,就认为答案可信。这种假设在两类情况下失效:一是检索到的文档本身包含过时或冲突信息,二是模型在综合多个事实时引入错误。资料 4 指出,即使检索到的上下文中包含正确答案,LLM 也可能无法准确生成响应,尤其是当综合响应需要在上下文中对不同事实进行推理时。
还有一类基线是直接使用生成时的 token 概率。模型对每个 token 输出一个概率分布,低概率通常意味着模型不确定。但 token 级概率受表达方式影响很大:同一个事实可以用不同措辞表达,模型可能对某个措辞的 token 概率很低,但语义上仍然正确。反过来,模型也可能用高概率生成一个错误但常见的说法。因此,原始 logit 概率需要经过语义层面的聚合,才能作为幻觉信号。
证据一致性检查:忠实度如何计算
证据一致性检查的核心思路是:把答案拆成若干原子主张,逐条判断它是否被检索到的上下文支持。RAGAS 框架中的忠实度(faithfulness)就是这个思路的代表。资料 1 描述 Ragas 是一个无需人工标注参考的 RAG 评估框架,它提出的指标覆盖检索系统识别相关上下文的能力、LLM 忠实利用上下文的能力以及生成质量本身。
忠实度的计算流程通常分三步。第一步,用 LLM 把答案分解成独立的主张,例如“跨境订单不适用七天无理由退款”是一个主张,“申请需在签收后七天内提交”是另一个主张。第二步,对每个主张,检查它是否能从检索上下文中直接推出或合理推出。第三步,计算被支持主张的比例,作为忠实度分数。分数低意味着答案中有较多内容缺乏证据支撑。
这条路径的优势是可解释:系统不仅给出一个分数,还能指出哪条主张没有证据。对于企业知识库,这可以直接用于生成“该答案部分内容未在知识库中找到依据”的提示,或触发人工复核。资料 4 的评估显示,RAGAS 忠实度在答案准确性与检索上下文密切相关的数据集上表现稳健,例如 PubMedQA 和 COVID-QA,但在需要复杂推理的 DROP 数据集上效果下降。
忠实度检查的失效模式主要有三类。第一,主张分解本身可能出错,把复合句拆成不完整片段,导致判断偏差。第二,上下文可能包含多个相互冲突的陈述,模型选择其中一个时,忠实度检查无法判断哪个才是当前有效的政策。第三,当检索上下文本身不包含答案所需信息时,忠实度低是正确信号,但系统无法区分“模型编造”和“知识库缺失”,需要结合检索覆盖率另行判断。
不确定性估计:从 logit 概率到语义熵
不确定性估计不依赖外部证据,而是观察模型生成过程中的内部信号。最基础的是 token 级概率:模型对下一个 token 的 softmax 输出中,最高概率越低,说明模型越犹豫。但如前所述,token 概率不等于事实不确定性。
语义熵(semantic entropy)对此做了改进。它的直觉是:如果模型对某个事实有把握,多次采样得到的回答在语义上应该一致;如果模型在编造,不同采样会给出相互矛盾的内容。资料 3 提到,Farquhar 等人提出的语义熵通过在一组模型生成上估计语义空间中的不确定性来检测幻觉。具体做法是:对同一个问题采样多个回答,把这些回答按语义等价类聚类,然后计算聚类分布上的熵。语义等价类数量多、分布分散,说明模型对答案的语义没有稳定信念。
语义熵的问题在于计算成本。资料 3 指出,语义熵的计算会带来 5~10 倍的计算开销,因为需要在测试时采样多次生成。对于在线服务,这意味着延迟和显存占用成倍增加。语义熵探针(semantic entropy probes,SEP)试图解决这个问题:它直接从单次生成的隐状态中预测语义熵,不需要在测试时多次采样。资料 3 报告 SEP 在幻觉检测上保持较高性能,并且比直接预测模型准确率的旧探针方法在分布外数据上泛化更好。
另一条路线是 SelfCheckGPT。资料 2 描述它利用一个简单想法:如果 LLM 对某个概念有知识,采样得到的回答往往相似且包含一致事实;对于幻觉事实,随机采样的回答往往会发散并相互矛盾。SelfCheckGPT 不需要外部数据库,也不需要访问输出概率分布,因此适用于只能拿到文本输出的黑盒模型。资料 2 的评估显示,在句子级幻觉检测上,它的 AUC-PR 高于若干灰盒方法,在段落级事实性排序上也有更高相关性。
这些方法的共同前提是:模型对不知道的事实会产生不稳定的生成。这个前提在模型过度自信时失效。如果模型在训练中见过大量类似表述,它可能对错误事实给出高概率、低熵的生成,采样多次也保持一致。此时不确定性信号无法识别幻觉,需要证据一致性检查来补位。
贯穿场景:跨境退款问题的自动验证流水线
回到跨境退款问题。假设系统已经检索到三段文档,生成模型给出了与证据矛盾的答案。自动验证流水线需要在这个答案返回用户之前做出判断。
flowchart TD
A[用户提问] --> B[检索知识库]
B --> C[生成候选答案]
C --> D[主张分解]
D --> E[逐条检查证据支持]
C --> F[采样多次生成]
F --> G[语义聚类与一致性检查]
C --> H[读取 token 概率与隐状态]
H --> I[估计不确定性分数]
E --> J[融合判断]
G --> J
I --> J
J --> K{分数是否超过阈值}
K -->|低风险| L[直接返回答案]
K -->|中风险| M[附加证据提示返回]
K -->|高风险| N[转人工复核或拒答]
流水线的输入是用户问题、检索上下文和候选答案。主张分解把答案拆成可检查的单元。证据检查模块对每个主张标注“有支持”“无支持”或“与上下文矛盾”。采样一致性模块对同一问题重新采样若干次,比较语义等价类分布。不确定性模块读取生成时的 token 概率和隐状态,输出一个连续分数。融合模块把三类信号合成风险等级。
关键转折点在融合判断。如果证据检查发现答案中有主张与上下文直接矛盾,即使不确定性分数很低,也应判定为高风险。反过来,如果证据检查通过但不确定性分数很高,可能说明检索上下文覆盖不全,模型在补充背景知识,此时适合附加证据提示而不是直接拒答。
这个流水线的成本主要来自采样和 LLM 调用。主张分解和逐条检查各需要一次或多次 LLM 调用,采样一致性需要多次生成。对于高并发企业问答,全部走完整流水线可能不现实。工程上通常采用分级策略:先用低成本信号过滤,例如 token 概率和隐状态探针,只有分数落在不确定区间时才触发采样和证据检查。
阈值设定与成本权衡
自动验证的输出是连续分数,部署时必须选择阈值。阈值决定误报和漏报的平衡。误报是把正确答案标为高风险,增加人工复核负担并降低用户体验;漏报是放过错误答案,可能造成业务损失。
阈值设定没有通用数值,需要根据业务风险和数据分布校准。可行做法是收集一批有标注的问答样本,分别计算各方法的分数,画出 ROC 曲线,选择满足目标精度或召回率的截断点。资料 4 使用 AUROC 评估幻觉检测器,定义为从不正确回答子集中抽取的样本得分低于从正确回答子集中抽取的样本得分的概率。AUROC 越高,说明分数越能区分正确和错误答案。
| 方法 | 依赖信号 | 额外成本 | 优势场景 | 主要失效模式 |
|---|---|---|---|---|
| 忠实度检查 | 检索上下文 + LLM 判断 | 主张分解与逐条检查的 LLM 调用 | 答案与上下文关系紧密、需要可解释依据 | 上下文冲突、主张分解错误、知识库缺失 |
| SelfCheckGPT | 多次采样文本一致性 | 多次生成,黑盒可用 | 无概率访问、需要零资源检测 | 模型过度自信时采样一致但错误 |
| 语义熵 | 多次采样 + 语义聚类 | 5~10 倍计算开销 | 需要语义层面不确定性 | 成本高,在线服务延迟敏感 |
| 语义熵探针 | 单次生成隐状态 | 训练探针,推理开销低 | 需要低成本在线不确定性估计 | 分布外数据可能漂移 |
| 自我评价 | LLM 自评置信度 | 一次 LLM 调用 | 简单场景快速筛查 | 对自身错误过度自信 |
从表格可以看出,没有单一方法在所有场景下都可靠。资料 4 的评估也显示,可信语言模型(TLM)在多个数据集上表现较好,它结合了自我反思、跨多个采样响应的一致性和概率度量;RAGAS 忠实度在上下文与答案关系紧密的数据集上稳健;自我评价在较简单环境中有效。对于高风险应用,结合这些方法可以提供更好的结果。
成本权衡需要区分在线和离线。离线评估可以承受多次采样和 LLM 调用,用于校准阈值和监控数据分布变化。在线服务通常只保留低开销信号,例如隐状态探针和 token 概率,把高成本检查作为异步任务或抽样审计。
失效模式与可观测指标
自动验证系统本身也会失效。证据缺失是最常见的情况:知识库没有覆盖用户问题,检索返回不相关文档,忠实度检查因为找不到支持而给出低分,但低分不代表模型幻觉,而是知识库需要补充。系统需要区分“无证据”和“有矛盾证据”,前者应触发检索扩展或拒答,后者应触发高风险告警。
模型过度自信是另一类失效。资料 2 和资料 3 的方法都依赖模型对不知道的事实产生不稳定生成。如果模型对错误事实给出稳定、高概率的输出,采样一致性和低熵都会误判为可信。这类情况需要证据检查兜底,或者引入外部知识源交叉验证。
分布偏移会影响所有基于统计信号的方法。企业知识库更新后,旧文档被替换,模型可能仍在生成旧政策。语义熵探针在训练分布内表现良好,但资料 3 也指出探针方法需要关注分布外泛化。部署后应持续监控检索命中率、忠实度分布、不确定性分数分布和人工复核结果,发现分布漂移时重新校准阈值。
可观测指标建议包括:检索上下文与问题的相关性、答案主张被支持的比例、采样语义等价类数量、平均 token 概率、高风险判定比例、人工复核确认率。这些指标共同描述系统健康度。单独看任何一个都可能误导,例如高风险判定比例突然下降,可能是阈值过松,也可能是知识库覆盖改善,需要结合复核确认率判断。
部署边界与未解决问题
自动验证不能替代人工判断,它只是把有限的人力集中到最可疑的答案上。对于法律、医疗、金融等高风险领域,即使验证分数较低,也建议保留人工复核环节。对于低风险场景,可以采用附加证据提示的方式,让用户自己判断答案是否可信。
当前方法的边界在于:证据一致性检查依赖检索质量,检索不到正确证据时无法判断答案对错;不确定性估计依赖模型对无知的不稳定表达,模型过度自信时失效;两者结合可以覆盖更多情况,但成本和延迟仍然是在线部署的主要约束。
一个尚未解决的问题是如何在没有标注数据的情况下持续校准阈值。企业知识库和用户问题分布会变化,固定阈值很快过时。可行的方向是用少量人工复核结果做在线学习,或者用检索覆盖率、答案长度、问题类型等特征做分层阈值。另一个问题是多语言和长尾领域,现有评估数据集的结论不一定能直接迁移到具体企业场景,需要用自己的数据重新验证。
工程上更现实的目标不是消除所有幻觉,而是把错误答案的漏出率控制在业务可接受范围内,同时让验证成本与问题风险匹配。这需要把验证流水线当作持续运行的系统来维护,而不是一次性的模型评估。