RAG 检索到的资料互相冲突怎么办?如何判断版本与时效性?
简化版
先确认资料讨论的是不是同一对象、同一适用条件和同一时间,再按预先定义的来源权威性、有效版本与替代关系判断。抓取时间最新或相似度最高都不代表结论最可信;无法消解的冲突应保留出处与分歧,不能让模型强行合并成确定答案。
详细版
- 对齐实体、产品版本、地区、用户类型及问题所问的时间,排除表面冲突。
- 元数据区分发布时间、修改时间、业务生效区间和抓取时间,并保留来源与版本关系。
- 先按权限和适用范围筛选,再判断证据可靠性;相关性分数不能代替真实性判断。
- 对明确被替代的旧规则,按问题时点选择有效版本;历史问题不能一律使用当前版本。
- 把冲突组织成“子结论—来源—适用条件—有效时间”的证据表,必要时回查原文或权威系统。
- 无法确认的结论单独标为未确定,引用绑定原文版本,索引和答案缓存也要同步失效。
完整版教学
一、先判断是不是在回答同一个问题
两份资料分别写“保留 7 天”和“保留 30 天”,不一定互相否定。 第一份可能针对免费版,第二份针对企业版;也可能一个说回收站保留期,另一个说备份保留期。 如果直接让模型投票或取平均值,得到的数字可能在任何版本里都不存在。 判断冲突前,应先把主语、属性、条件与时间对齐。
例如用户问“企业版删除文件后还能找回多久”,至少要确认找回指回收站恢复还是备份恢复。 若资料只支持不同套餐分别处理,可以给出条件化答案,而不必宣告知识库矛盾。 若缺失的条件会改变答案,应明确说明这一条件,不能偷偷假设用户属于某个套餐。
断言 = 对象 + 属性 + 数值/结论 + 适用条件 + 有效时间
A:免费版 + 回收站保留期 + 7 天 + 标准设置 + 当前有效
B:企业版 + 回收站保留期 + 30 天 + 标准设置 + 当前有效
结论:适用条件不同,可以并存
二、四种时间分别回答不同的问题
发布时间回答文档何时发布,修改时间回答页面何时变更。 业务生效时间回答规则何时适用,抓取时间回答系统何时获取这份内容。 它们可能相差很久,也可能由于页面模板刷新而出现无关更新。 因此不能把网页的 updated_at 或向量库的写入时间直接当成规则生效时间。
| 时间字段 | 回答的问题 | 常见误用 |
|---|---|---|
| published_at | 何时公开发布 | 误认为发布即生效 |
| source_updated_at | 来源何时修改 | 页脚变化被当成规则变化 |
| valid_from / valid_to | 规则在哪个区间适用 | 不处理历史查询与未来版本 |
| ingested_at | 本系统何时抓取 | 旧资料刚抓取就被认成最新版 |
假设文档 V2 在 6 月 20 日发布,但 7 月 1 日才生效;系统在 6 月 21 日已经抓取。 用户问 6 月 25 日适用的规则时,仍应查此前有效的 V1,不能因为 V2 更新就立即使用。 用户问 7 月 10 日则应依据 V2,同时检查适用对象是否相同。 以下是教学用的半开区间规则,真实业务必须明确时区和边界精度。
有效条件:valid_from <= question_time < valid_to
valid_to 为空时:没有已知结束时间,但仍需核查撤销/替代状态
V1:[1 月 1 日, 7 月 1 日)
V2:[7 月 1 日, 未知结束)
三、来源优先级不能由检索排名代替
检索分数反映问题与文本的匹配程度,不能证明来源负责制定这条规则。 一篇过期教程可能比正式文档更贴近用户措辞,因此排得更靠前。 生产系统应按业务预先维护来源类型和责任主体,例如产品规范、正式变更公告与第三方说明。 但来源优先级也需要结合适用范围:正式的旧版文档不能覆盖正式的新版变更公告。
可采用分阶段裁决,而不是把所有因素任意相加成一个看似精确的总分。 先排除越权、对象不符和时间不适用的材料,再检查正式的替代关系及权威依据。 对于优先级相同且确实冲突的证据,应保留分歧并请求补查,不能让相似度决定事实。 来源分类应由可信的接入流程管理,不能接受文档正文自称“最高权威”就提升优先级。
权限可见? -> 对象与条件匹配? -> 问题时点有效?
-> 是否有明确的 supersedes 替代关系?
-> 是否存在适用的权威裁决依据?
-> 仍冲突:保留分歧,补查或给出未确认结论
四、把冲突处理到子结论,而不是整篇丢弃
一份文档可能只有默认超时值过期,部署步骤仍然正确。 若整篇删除,会丢掉其他可用信息;若整篇采信,又会把过期数字带入答案。 更合理的是把用户所需答案拆成几个可支持的子结论,逐项关联原文与适用条件。 这样既能复用一致部分,也能准确指出分歧只发生在哪里。
假设资料 D1 写版本 2 默认超时 10 秒,D2 写版本 3 默认超时 20 秒,D3 未标版本却写 15 秒。 用户明确使用版本 3 时,D2 才是对应证据;D3 的版本未知不能自动解释成版本 3。 如果 D2 与另一份同级版本 3 文档仍相矛盾,就应说明两处数值冲突,并回查配置定义或责任方。 这些数字是构造的教学样例,不是某个产品的真实配置。
claim_id: default_timeout
target_version: 3
selected_evidence: D2@revision_4
excluded:
D1: applies_to_version_2
unresolved:
D3: missing_version
最终引用要能回到支持该子结论的具体版本和片段,不能只链接一个随时变化的首页。 有权限与保留条件时,可以保存来源修订号、内容哈希和受控快照用于复核。 哈希只能帮助判断内容是否变化,不能单独证明内容真实或来源权威。 模型负责组织解释,裁决依据仍需随答案保留下来。
五、时效性需要贯穿索引与缓存
文档更新并不代表所有派生产物已经同步更新。 旧切块可能还留在向量索引,重排阶段可能同时看到新旧版本,答案缓存也可能继续返回旧结论。 因此发布新版本时要记录切块所属的文档修订,并明确旧版本在当前查询与历史查询中的可见性。 对当前问题可以过滤过期版本,对历史问题则通过时间条件保留可追溯查询能力。
假设索引更新最多延迟 5 分钟,旧答案又可能在这段时间被重新缓存 10 分钟。 如果没有版本校验或主动失效,最坏情况下旧答案可能在更新后接近 15 分钟仍被返回。 这个推演假定缓存可在索引滞后期间重建;不能把两个时限中的较大值直接当成总新鲜度保证。 若业务要求更短的滞后,就要加入版本绑定、主动失效或在回答前校验关键来源状态。
t=0:来源变更
t≈5 分钟前:索引仍旧,生成旧答案并缓存 10 分钟
t=5 分钟:索引更新完成,但旧答案缓存仍在
t≈15 分钟:该旧缓存才自然到期
验收用例应覆盖未来生效、历史查询、撤销后恢复、同级冲突与版本未知等情况。 同时检查最终回答的条件和引用,不能只看“最新文档是否入库”。 对关键配置可设置确定性断言,检查答案是否把旧数字或未确认数字写成确定结论。 线上监控则关注来源更新时间到有效回答更新时间的实际滞后。
六、常见误区与追问
- 误区:抓取时间最新的资料就是最可信的。 抓取时间只说明系统获取时间,旧文档也可能刚被抓取,应核查适用版本与生效区间。
- 误区:多份文档都这么说就能按多数决定。 多个转载可能来自同一旧来源,不是独立证据;应追溯原始依据和替代关系。
- 追问:历史问题为什么不能只查最新版? 用户要的是过去某时点的规则,当前版本可能尚未生效,应按问题时点选择证据。
- 追问:同级权威资料仍然矛盾怎么办? 保留冲突的具体结论和出处,补查责任系统或明确未确认,不能任意选一个数值。
- 误区:把冲突文档都塞给模型就解决了。 模型可能混合条件或取错版本,仍需提供结构化适用范围与明确裁决依据。
- 追问:索引更新后为什么还回答旧内容? 还要检查旧切块残留、查询快照和答案缓存,来源更新只是整条时效链路的起点。
七、加强记忆
把冲突资料看成带日期和适用范围的说明书:先看是不是同一台设备,再看是不是同一时期,最后看谁有权定义这条规则。资料较新、排名较高或转载较多,都不能单独替代这三个判断。结论按子问题裁决,未知就保留未知,引用和缓存都绑定版本,才能让 RAG 回答既可追溯又符合所问时点。
记忆钩子:先对对象,再对时间,最后对依据;刚抓到不等于刚生效,能引用不等于已消解冲突。