日期:2026-07-26
本文为工程实践复盘,客户信息已脱敏;所述数据均为示意值。
我们在一个面向企业内部的知识问答与报告生成项目里,反复观察到大模型会"自信地编造":它引用一条根本不存在的制度条款,给出一个明显错误的数字,甚至把 A 客户的案例安到 B 客户头上。把这类输出直接对外发布,出错成本极高,而信任一旦受损,后续再怎么解释都很难挽回。问题并不在于模型能力不足,而在于生成与事实校验被放在了同一个环节,没有任何独立把关。
我们当时定的目标,是给生成链路加一道"事实一致性校验"闸,让模型的每一次断言都能被证据源检验。这个项目里我们采用自研的 AI 私有化底座承载模型服务化,RAG 知识库提供可引用的证据源,校验服务和生成服务解耦部署,互不替对方背书。
落地之后,流程变成这样:模型先生成回答,并同时产出"主张点",也就是那些带引用的句子;校验管线拿到主张点后,逐个做证据比对——能不能在知识库里找到对应出处、引用的编号是否真实存在、引用的数字是否和源文档一致;凡是拿不出证据或者与证据冲突的主张,被标红,模型被要求补充引用或者干脆拒答;只有通过校验的输出,才允许对外。
对于那些明确没有依据的问题,比如问一份尚未录入的政策,模型不再硬编,而是直接走拒答模板,提示"暂无依据,建议人工确认"。我们把校验做成独立服务,既能在生成之后批量跑回归,也能在网关侧对外部调用做实时校验,哪里需要挡就在哪里挡。
第一是生成内容与证据源比对。我们让模型在生成时强制输出"引用块编号",校验服务按编号回查知识库切片,比对主张与切片之间的语义一致度,低于阈值就判为冲突。这一约束把"凭空生成"变成了"带凭证生成"。
第二是引用真实性与可核验。模型有时候会编造引用编号,我们因此维护了一份"合法引用编号集合",编号不在集合内直接判为幻觉,并要求模型重新生成带真实编号的版本,这是拦住虚构引用成本最低的手段。
第三是不确定与拒答策略。对知识库覆盖之外的问题,我们用检索命中数作为信号:命中为空或者置信度过低,就拒答并提示暂无依据,避免强行作答误导用户。
第四是误杀与体验权衡。过度校验会把正确但措辞不同的回答也拦下来,我们用"软标红加人工确认"而非硬阻断,只在关键场景强制拦截,把误杀控制在可接受范围。
接入校验大约一个月之后,以脱敏示意口径来看:对外回答的幻觉率,也就是被抽查发现编造的比例,下降约七成;引用可核验率,也就是引用能回查到真实切片的比例,提升到九成以上;因"无依据"而主动拒答的比例约一成,用户投诉"答非所据"显著减少;需要人工复核的比例控制在低个位数百分比。数据为示意值。
没有证据不生成,校验独立于生成,这是我们最想传递的经验。最大的体会是:让模型"自证"远不如让独立服务"他证"——同一个模型既生成又校验,会互相包庇,问题被掩盖。引用编号必须可回查,这是拦住编造引用的最低成本手段。校验服务要可插拔,既能批跑也能在网关实时挡,不要把逻辑写死在生成脚本里,否则后续调策略要动全身。
幻觉治理的本质,是把"模型说了算"改成"证据说了算"。当每一次断言都必须挂上可回查的凭证,模型从"创作者"回归到"基于证据的助手",对外发布的底气才真正立得住。这一步看似增加了链路复杂度,实则换来的是信任,而信任是企业用大模型最稀缺的东西。
回过头看,幻觉治理的本质,是把模型说了算改成证据说了算。当每一次断言都必须挂上可回查的凭证,模型从创作者回归到基于证据的助手,对外发布的底气才真正立得住。这一步看似增加了链路复杂度,实则换来的是信任,而信任恰恰是企业用大模型最稀缺的东西。我们把校验服务沉淀为网关侧的标准插件之后,新接入的外部模型也能自动获得事实一致性把关,不需要每个业务方各自造轮子。可插拔的校验,才是能让治理持续跑下去的形态。
案例片段(已脱敏):事实一致性校验核心逻辑(示意) - 生成约束:
answer MUST include [ref:N] for each claim; N in legal_ref_set- 校验:for claim: hit = retrieve(claim); if not hit or sim(claim, hit) < 0.7 -> flag_hallucination- 拒答:if retrieve(query).top1.score < 0.4 -> respond("暂无依据,建议人工确认")案例片段(已脱敏):一次回归测试(示意)——对 200 条历史坏样本(含虚构引用/错数字),校验服务识别准确率约 94%,其中编造引用编号的捕获率接近 99%,仅个别"语义一致但措辞偏差"被误标,经阈值微调后误杀下降。