先这样答
向量检索的核心是计算语义相似度,这个过程本身不包含时间维度。这会导致旧文档如果内容更长或描述更完整,得分会高于较短的新文档,过期信息就会顶掉新信息。在处理价格、政策、版本号等时效敏感内容时,这种现象会导致严重的错误。处理时间衰减,主要从召回侧和写入侧两个方向切入。
在召回侧,最直接的做法是在检索分数中加入时间衰减项。最终得分等于相似度乘以衰减函数,衰减函数可以根据文档年龄呈指数或线性下降,其中的半衰期参数需要根据具体的业务节奏来调节。另一种做法是按时间窗过滤,先只检索近几个月的文档,如果召回数量不足,再退化为全库检索。此外,还可以采用新旧双路召回,在最终融合排序时给新文档赋予更高的权重。
在写入侧,需要配合做好元数据管理,让文档自带生效期或失效期字段。一旦文档过期,系统自动将其降权或移出主索引。同时要定期重刷知识库,对齐源文档状态,避免源文档修改了但检索出来的答案还是旧的。在具体策略上,不能采取一刀切的全局衰减。长期稳定的知识,比如基础概念解释,不应该被压低分数;而时效敏感的内容,比如新闻或价格,需要强衰减。按文档类型或字段配置不同的衰减强度是更合理的做法。
最后,为了确保时间衰减策略有效,需要按时间切片构建评测集。通过对比新旧问题的准确率,验证衰减参数在提升时效性的同时,没有误伤长期稳定的基础知识。
面试官会怎么追问
- 「指数衰减里的半衰期参数具体怎么调?」 设定半衰期需要结合业务节奏,先给出一个初始预估值。随后利用按时间切片构建的评测集进行测试,观察不同参数下时效性问题和稳定知识问题的综合准确率。最终选择一个能平衡新知识召回,又不让旧知识得分过低的参数。
- 「怎么判断哪些文档该衰减,哪些不该衰减?」 这依赖于文档入库时的分类和元数据提取。在文档解析阶段,为文档打上类型标签。检索时系统读取这些标签,对概念解释类标签应用零衰减或极弱衰减,对新闻或价格类标签应用强衰减函数。
- 「源文档被修改了,怎么保证知识库不读到旧版本?」 需要建立定期重刷机制对齐源文档状态。在源系统侧获取文档的状态变更情况,一旦发生修改,触发知识库的更新操作。知识库根据文档标识定位并覆盖旧的向量和元数据,避免文档改了答案还是旧的。
回答的坑
- 认为把时间戳转换为向量一起参与相似度计算就能解决时效问题,实际上向量检索难以直接理解时间数值的大小关系,应该在计算完相似度后用时间衰减函数调整最终得分。
- 忽略了知识类型的差异而采用全局统一的时间衰减策略,正确的方向是按文档类型或字段分别配置衰减强度,防止长期稳定的知识被误伤。
同系列的题
—— 本题完 ——