在 RAG 系统中,模型被要求基于检索到的片段生成答案,并可以附带出处引用。然而,模型在生成过程中仍可能发生一种不易察觉的错误:引用的来源与实际使用的片段不一致。例如,回答中写“根据《员工手册》第3.2条……”,但实际检索到的片段来自《福利政策》而非《员工手册》,或者模型自行杜撰了一个不存在的章节号。这种“引用幻觉”会严重损害系统的可信度,尤其在合规场景中可能引发责任问题。
引用一致性校验,就是在系统将答案返回给用户之前,额外增加一道自动检查环节,验证回答中声称的出处是否真实存在于检索结果中,内容是否与原文相符。它把“可溯源”从一种可能性变成一种经过验证的承诺。
为什么需要显式校验
即使提示词中要求模型准确引用,大型语言模型仍然会偶尔产生错误的引用信息,原因包括:
- 长上下文中混淆多个片段的来源元数据;
- 在信息不足时,模型倾向“补全”一个看似合理的出处;
- 片段与来源文件的对应关系在传递中丢失或被错误关联。
如果没有校验步骤,这些错误会直接呈现给用户,直到有人仔细核对原文时才发现问题——这种事后发现对信任的伤害是显著的。
实用的校验方法
一种轻量但有效的做法是:
- 明确引用格式,便于解析
在提示词中要求模型使用固定格式标注引用,例如 【来源:文档名,第x条】 或 (见:《xxx》第y节)。这样在后续可以用简单规则或正则表达式提取出所有引用声明。
- 提取并规范化声明信息
从生成答案中提取每条引用的“文档名称”和“章节/段落标识”。同时,将当前检索步骤获得的来源元数据(文件名、章节、编号等)整理成可查询的集合。
- 逐一比对
对每一条声明:
- 检查文档名是否在本次检索的元数据集合中存在;
- 若引用包含章节号或段落标号,检查该编号是否真的属于该文档(需要知识库保存切片时同时存储结构化位置信息);
- 理想情况下,还可以将声明引用的原文片段与检索到的片段内容做语义相似度对比,判断陈述是否确实基于该片段。
- 分级处理不一致情况
- 如果所有引用都可以在检索结果中找到对应,且内容匹配,回答通过校验;
- 如果存在无法对应的引用,可以触发二次生成,要求模型在更严格的约束下仅使用提供片段重写答案;
- 若二次生成依然校验失败,系统可以回退到直接展示检索片段而不做综合回答,或者标记为“缺少明确依据”通知人工复核。
实践中的简化策略
并非所有业务都需要严格的自动化校验。以下是根据场景需求的递进做法:
- 基础级:仅在前端展示答案时,保留引用原文的链接,把校验交给用户自己做。适用于内部使用、风险较低的知识问答。
- 规则级:用正则检查引用格式是否合法,文档名是否在知识库的白名单中,防止明显编造。适合大多数企业应用。
- 语义级:将声明引用的文本与检索原文做 embedding 相似度比较,阈值以下即认为不一致。适合对合规要求较高的金融、医疗等场景。
一个真实的例子
某律师事务所的 RAG 助理在处理“竞业限制期限”相关提问时,系统检索到第 5 号法律意见书中的一段,但模型生成回答时写道:“根据 2019 年出台的《劳动合同法》第 34 条……”经校验发现,《劳动合同法》本身并不在这次检索到的片段中,且引用条款编号也不存在于当前知识库中的任何文件。系统判定此引用为不一致,自动拦截该回答,并提示模型仅依据片段重新生成,最终得到正确引用出处的答复。
实施的注意事项
- 知识库的元数据决定校验上限:如果切片时没有保存文档标题、章节等结构化信息,后续校验就缺少依据。在构建索引时尽量保留这些元数据。
- 校验本身也有延迟和成本:语义相似度计算会增加响应时间,需权衡准确度与性能,可根据场景选择校验深度。
- 透明地处理校验失败:当答案因校验失败被替换或标记时,应向用户说明“部分引用无法在当前资料中验证”,而不是静默修改,以免造成困惑。
引入引用一致性校验后,RAG 系统完成了从“可溯源”到“已验证溯源”的跃升,让基于知识的回答在真实业务中更具鲁棒性与可靠性。