RAG 检索相关,不代表来源可信
小规模合成文档实验表明,检索相关性无法可靠区分现行规则与过期规则,移除来源元数据后,时效性识别 AUC 降至 0.51—0.72。来源选择还需结合文档类型、状态、日期含义及替代关系,实验结果不能直接外推到生产语料。
AI 深度解读
客服 RAG 同时搜到今年和去年的退款政策,相关性都很高,最后却引用了旧规则。问题未必出在检索质量:检索擅长找出「与问题有关」的内容,却不能单凭相似度决定哪份文件有资格拍板。
这篇文章把问题拆成了来源身份、替代关系和生效时间。结论很实用:想让 AI 回答当前规则,先把规则何时适用、替代了谁存清楚,再交给模型组织答案。不过,文中的实验很小,产品能力也来自文档阅读,不能当成选型榜单。
搜得相关,为什么还是会答错
常见混合检索经过关键词匹配、向量检索、排名融合,再选择性加入 reranker。它们主要判断同一件事:这段内容与问题有多相关。
旧政策、未批准的草案、讨论政策的论坛帖子,都可能高度相关。知识图谱也有类似边界:找到关联关系,不等于确定哪个值可信。
原文引用 Manoj Kumar Vohra 在 2026 年 10 月 9 日发表的测试。长文档测试只有一个退款问题、八份合成文档,其中 reranker 把未批准草案和已被替代的政策排在第 3、4 位,高于官方但不相关的文档。
这个排序符合相关性目标。尤其是测试中的 reranker 只收到问题和正文,不能据此认定它能识别却忽略了审批状态。
另一个小块测试覆盖退款期限、免费试用时长、可用性保证三个问题。移除来源标题、类型、日期、状态四项信息后,各系统的时效性 AUC 降至 0.51 至 0.72;该指标中,1.00 表示总能正确区分,0.50 相当于随机判断,接近 0 表示方向相反。
这里的 AUC 是按问题计算后取平均,不能读成回答准确率。更不能把下降全部归因于缺少日期,因为四个字段被一起拿掉了。
模型不能补出索引从未记录的来源状态。
作者据此建议在入库时记录来源信息。索引里有字段、送给模型时却只剩正文,同样会制造信息缺口。
判断当前规则,要看生效日而不是更新时间
文章区分了三种日期:
- 生效日期决定规则从什么时候开始适用。
- 发布日期记录首次公开时间,可以辅助排列版本。
- 最后修改日期记录内容变化,改错字也会更新它。
Schema.org 中对应的字段是 validFrom、datePublished、dateModified。记忆系统还可能记录入库时间:Zep 接收原始事件时间的 reference_time,缺失时会使用入库时间。刚导入的旧文件,因此不能自动算成新规则。
原文用一组虚构材料解释风险:旧条款、FAQ、客服话术都写着 30 天退款;新的 14 天政策于 10 月 1 日获批发布,11 月 1 日生效,并明确替代旧条款;10 月 10 日,旧 FAQ 又修正了一个错字。
问 10 月的规则,应回答 30 天,并说明未来调整;问 11 月 5 日的规则,应回答 14 天。按发布时间立即切换,会提前执行新政;按修改时间选最新,旧 FAQ 又会胜出。
解决办法是保存替代对象及其生效时间,并在代码或数据库里计算是否适用:
valid_from <= asked_at and (valid_to is null or valid_to > asked_at)
要盯住的是第一项 valid_from <= asked_at,它挡住尚未生效的新政策。asked_at 是问题所针对的时间,valid_to 是停止适用的时间,仍适用时为空。
未来政策也应保留:它可以作为已公布的变化展示,同时明确今天执行哪条规则。
三份旧材料,不能靠票数压过一份新政策
Vohra 的另一个发现来自提问方式。直接问某份文档是否与其他证据矛盾,几个系统会把正确文档 D1 标为矛盾,因为另外三份材料都反对它。
但旧条款、据此编写的 FAQ、再据 FAQ 编写的客服话术,可能只是同一条规则被复制三遍。数量增加,没有带来三个独立判断。
更合理的判断是:这份材料的主张,相对于最权威且当前适用的证据,是否已经错误或过时。明确替代关系应从生效日起起作用,不能只数支持者。
也不是所有分歧都属于版本替换。业务上线日与技术上线日可能同时成立,只是视角不同。文章因此提出至少三种处理结果:确认替代关系;保留并列观点及其负责人;无法确定时间顺序时,标记为无日期材料并交给人处理。
产品文档展示了部分实现方式,但开关和边界各不相同:
- Cognee 用
external_metadata中的effective_date辅助冲突审查,键名可由IMPROVE_EFFECTIVE_DATE_KEY配置;improve()的审查阶段需通过review_conflicts=True开启,默认关闭。 - Mem0 Platform 区分记忆创建时间与事件日期,文中所述时间推理能力不在 OSS SDK 中。Dream 默认不删除或隐藏旧记忆,
latest_only=true才将结果收窄到活跃记忆。 - Mnemoverse 的
POST /memory/write接收supersedes,旧记录通过superseded_by指向新记录,仍可按 ID 获取;默认读取隐藏旧版本的过滤开关处于关闭状态。 - Supermemory 接收 ISO 8601 格式的
date,文档称新事实会替代旧事实参与搜索,历史可以保留。 - Zep 用
valid_at表示事实开始成立的现实时间,created_at表示系统获知时间,也使用invalid_at记录失效边界。
这些字段能表达时间关系,却不能证明事实是真的。Zep 文档也明确写出了这条限制。
我的判断
我认同把「是否适用」从模型临场判断中拿出来。对于有审批流程、版本号和生效日的政策库,确定性规则比反复叮嘱模型「优先相信最新资料」更容易检查。
但来源官方、状态已批准,也不代表任何场景都适用。文章没有完整讨论地区、用户类别等适用条件,不能把时间过滤当成全部授权逻辑。
实验边界同样要守住:Vohra 测的是少量合成文档;文章作者没有提供自己的准确率、延迟或基准数据。退款时间线和四组验收材料都是示例,文中产品信息截至 2026 年 10 月 23 日,来自厂商文档阅读,并非上手横评。作者本人来自 Mnemoverse,读产品介绍时也应知道这一关系。
与继续优化 reranker 相比,补齐元数据解决的是另一个环节的问题,两者需要配合。文章没有给出成本或端到端收益的对照数据,因此这是一套有道理的方法,尚不是经过充分验证的通用收益承诺。
能拿来做什么
- 给客服或内部知识库做 RAG 时,在入库阶段保存标题、来源类型、状态、生效与失效日期,并把替代关系随新版本一起保存。Node 服务可以先计算适用性,再将结果交给模型。
- 用自己的材料建立四组回归样例:一份新政策对三份旧材料;新政已发布但未生效;旧 FAQ 修改时间更新;新政缺少日期。先写期望结果,再运行系统。
- 让回答区分「当前执行」和「未来生效」,遇到无日期材料时明确暴露不确定性。原文第四组样例要求标记日期缺失,不能自信地猜一个退款期限。
- 给日常 AI 编程维护的知识库补上日期和决策关系。被替代的决定指向新来源,同期不同视角保留负责人,避免把所有分歧都处理成删除旧记录。