内容提要
文章介绍用Python实现声明级RAG证据门禁:模型输出候选声明及来源ID,再由确定性代码逐条校验来源是否存在、是否过期、是否覆盖声明,并输出ALLOW、REVIEW或BLOCK。强调引用应细到声明级,结合语义蕴含、版本化索引与权限过滤,适用于制度问答等场景。
延伸解读
为什么引用要细到声明级
文章指出,RAG的风险常出现在最后一公里:模型可能用旧条款支持新结论,或把两个来源拼成看似合理的回答。文档级引用只能证明“来自哪里”,段落级能定位依据,但只有声明级才能证明“这句话由哪条材料支撑”。因此门禁应逐条校验候选声明与来源ID,而不是在回答末尾挂一个链接。
门禁的判定逻辑与输出
示例代码中,verify函数对每条声明依次检查:无来源ID则BLOCK;来源ID不存在则BLOCK;任一来源超过一年则REVIEW;声明文本未被任何来源覆盖则BLOCK;全部通过才ALLOW。这种确定性代码不依赖模型自判,输出可直接映射为界面徽标或人工队列,便于定位是缺证据、来源过期还是来源不存在。
生产环境还需补哪些能力
文章强调,示例只是本地门禁,生产环境还要做语义蕴含检查、版本化索引和来源权限过滤。常见错误包括只引用最相似文档却不检查是否支持结论、混用不同生效日期的政策、把内部文档ID暴露给无权限用户,以及相信模型自己判断新鲜度。这些都会让门禁形同虚设。
适用边界与监控重点
该方式适合制度问答、知识库助手和客服草稿,不适合在缺少权威材料时假装能给出事实答案。对于金额、期限、资格等高风险声明,缺证据时可只展示相关原文而不生成结论。还应监控被拦截原因:若大量回答因“来源过期”进入REVIEW,问题通常在内容治理而非提示词。
Q&A
RAG系统为什么不能只靠提示词让模型诚实引用?
因为RAG的风险在最后一公里:模型可能拿旧条款支持新结论,或把两个来源拼成看似合理的回答。仅写“请诚实”的提示词无法解决,需要让模型输出候选声明与来源ID,再用确定性代码逐条校验。
声明级RAG证据门禁的校验流程是怎样的?
模型输出候选声明及来源ID,确定性代码逐条检查:来源ID是否存在、是否超过一年、来源文本是否覆盖声明,并输出ALLOW、REVIEW或BLOCK。
证据门禁中ALLOW、REVIEW、BLOCK分别代表什么?
ALLOW表示证据覆盖且新鲜;REVIEW表示来源超过一年,需人工复核;BLOCK表示没有来源、来源ID不存在或来源未覆盖该声明。
有效引用应该做到哪几个粒度?
至少三个粒度:文档级证明“来自哪里”,段落级证明“依据在哪一段”,声明级证明“这句话由哪条材料支撑”。
生产环境部署声明级门禁还需要补充哪些机制?
需要做语义蕴含检查、版本化索引和来源权限过滤,避免只引用最相似文档却不检查是否支持结论、混用不同生效日期的政策、把内部文档ID暴露给无权限用户,以及相信模型自己判断新鲜度。
声明级RAG证据门禁适合哪些场景,不适合哪些场景?
适合制度问答、知识库助手和客服草稿;不适合在缺少权威材料时假装能给出事实答案。