大模型的幻觉并不是“胡说八道”这么简单。更准确地说,它是在证据不足、证据冲突或提示诱导下生成了看似合理但不可验证的内容。要压住这类问题,事实核查机制不能只靠一句“请基于资料回答”,而要把生成结果拆成可审计的事实单元,再逐条和证据源对齐。真正有效的方案,更像一条质检流水线。
核查对象:不要查整段,要查“事实声明”
很多团队犯的第一个错误,是把模型完整回答丢给另一个模型,让它判断“是否正确”。这太粗。一个回答里可能有定义、时间、数字、因果关系、建议条件,混在一起检查,误判率很高。
更稳妥的做法是做 claim extraction,把回答拆成原子事实:
- “某政策于2023年发布”
- “该政策适用于小微企业”
- “申请材料包括营业执照和纳税记录”
- “办理周期通常为5个工作日”
每一条都应能被独立验证。Google Research 在关于事实一致性评估的研究中也反复强调,claim 级别评估比段落级评估更接近人工审校逻辑。说白了,别问“这篇答案可靠吗”,要问“这句话有没有证据”。
证据检索:给每条声明找出处
事实核查的第二步不是让模型再想一遍,而是重新检索。这里建议采用“声明驱动检索”,即用每条 claim 作为查询,而不是沿用用户原始问题。
一个实用配置是:
- BM25 负责精确命中日期、编号、专有名词
- 向量检索负责语义相近内容
- reranker 对候选证据重排,取前3到5段
- 对证据保留文档ID、段落位置、更新时间
比如模型回答“某药物可用于12岁以下儿童”,系统必须检索药品说明书、监管机构公告或临床指南,而不是拿一篇健康科普文章凑数。医疗、金融、法律场景里,证据等级比相似度分数更要命。
一致性判断:NLI 比“打分”更可控
核查模型最好输出三类结果:支持、矛盾、证据不足。这与自然语言推理(NLI)的 entailment、contradiction、neutral 三分类对应,工程上也容易落地。
| 判断结果 | 处理方式 |
|---|---|
| 支持 | 保留,并附引用 |
| 矛盾 | 删除或改写 |
| 证据不足 | 标记不确定,禁止确定性表述 |
这里有个细节很容易被忽略:证据不足不等于错误。比如知识库里没有“2024年最新收费标准”,系统不该编一个价格,也不该直接说“没有收费”。更合理的表述是:“当前资料未提供2024年收费标准,需以官方页面为准。”这句话看起来保守,却能少背很多锅。
置信度阈值:别迷信一个分数
生产环境里可以设置多维阈值,而不是只看模型给出的 confidence。
- 检索相似度低于阈值:不生成确定答案
- 支持证据少于2条:降低语气强度
- 证据更新时间超过业务有效期:提示可能过期
- claim 中包含数字、日期、法规条款:强制引用来源
- 出现矛盾证据:触发人工复核或返回分歧说明
某企业客服系统曾做过一次灰度测试:在售后政策问答中加入 claim 级核查后,答案拒答率从3.8%升到7.1%,但错误承诺率从2.4%降到0.6%。运营同事一开始嫌“回答变怂了”,两周后投诉单少了一截,态度立刻变了。
输出层:让模型学会“少说一句”
幻觉抑制的终点不是让模型永远回答正确,而是让它知道什么时候闭嘴。提示词里应明确约束:
若证据无法支持某项声明,不得补充常识性推断;可说明缺少依据,并给出需要核验的来源类型。
最终答案最好带上轻量引用,例如“依据:文档A第3段”。不必把引用做成论文格式,但必须让用户或审计人员能追到原文。没有可追溯性,事实核查就只是心理安慰。
更可靠的机制,是把“不确定”产品化
事实核查机制做得好,系统会显得没那么“聪明”:它会拒答,会改口,会提示资料过期,也会把漂亮但无证据的句子砍掉。可这恰恰是专业系统和玩具 Demo 的分水岭。幻觉不是靠模型自觉消失的,它需要检索、拆句、证据、推理和阈值一起拦截;少一个环节,漏洞就会从最贵的地方冒出来。

感觉这套方法挺靠谱,尤其是拆claim那步
医疗场景确实证据等级比相似度重要,之前吃过亏
BM25+向量检索这种组合在实际中会不会很慢?
NLI三分类听起来美好,实际效果可能没那么准吧?
之前搞客服问答,错误承诺率降了0.6%确实值