新鲜度是什么问题
知识过期是 RAG 里最隐蔽的质量问题:旧制度、旧价格、旧参数照样能被检索出来,模型也照样照着它们回答,而答案看上去毫无异常。解法是建立增量更新管线(变更检测 → 重新解析切分 → 向量更新 → 旧块删除),给文档记录更新时间并在排序中适度加权,同时定期对「过期答案」做抽检,把过期命中率当作常规指标看。
基本信息
| 更新流程 | 变更检测、重新解析切分、向量更新、旧块删除 |
|---|---|
| 幂等要求 | 任务可重跑,不产生重复切片 |
| 排序手段 | 按更新时间适度加权,让新内容优先 |
| 质量监控 | 定期抽检过期答案,统计命中旧内容的比例 |
典型使用场景
- 制度与规范更新:新版生效后旧版必须停止被检索命中
- 价格与费率调整:过期费率被引用会直接造成业务损失
- 产品版本迭代:旧版本参数与新版本并存时按版本过滤
- 文档下架:源文件删除后同步清理索引中的对应切片
- 定期体检:按月抽样问题,人工核对答案是否引用了过期内容
增量更新骨架
增量更新骨架
changed = detect_changes(source, last_sync_ts) # 只处理变更过的文档
for doc in changed:
old_ids = index.find_by_doc(doc.id) # 先找出旧切片
new_chunks = split(parse(doc)) # 重新解析与切分
index.upsert(embed(new_chunks)) # 写入新切片
index.delete([i for i in old_ids if i not in {c.uid for c in new_chunks}])
# 删除与写入放在同一幂等任务里,失败重跑不会产生残留
更新方式对比
| 方式 | 特点 | 适用情况 |
|---|---|---|
| 全量重建 | 干净彻底,可清理全部残留 | 语料规模小、变更频繁 |
| 增量更新 | 省资源,需正确处理删除 | 语料大、变更集中在局部 |
| 定时批处理 | 实现简单,延迟可见 | 允许小时级延迟的场景 |
| 事件触发 | 接近实时 | 对时效要求高的业务 |
删除旧块与写入新块要放在一个幂等任务里完成,避免中途失败留下半新半旧的状态,这种状态最难排查。
更新时间加权的系数需要评测:加权过强会让新文档压过更相关的旧文档,反而降低检索质量。