这道题其实是在问,怎么让大模型既能拥有最新知识,又不会因为知识库过时而胡说八道。[[RAG]]的本质就是给大模型配一个外挂知识库,让它能实时查资料再回答。
先说RAG的完整流程。用户提一个问题,我们先用 [[Embedding]] 模型把它转成向量,然后去[[向量数据库]]里做相似度检索,召回最相关的Top-K片段。这一步核心是从语义上匹配,不是关键词匹配。召回来后通常会加一个 [[Rerank]] 步骤,把最精准的排到前面,然后把这些片段和用户问题拼在一起,作为上下文送给大模型生成答案。这里有个坑:prompt设计必须明确告诉模型引用来源,否则它还是会自己编,也就是 [[Hallucination]]。
接下来是时效性问题。说白了,知识库里的信息是静态的,但现实世界在变。比如电商平台的满减政策,昨天还是满200减50,今天改成满300减80了,如果知识库没更新,用户问“今天有什么优惠”,模型可能会给出过时的答案。
我的应对策略不是单一方案,而是分层加组合。先说数据层,我会把知识分成热数据、温数据、冷数据。热数据比如最新的促销政策、实时库存,24小时内变化频繁,我会放在内存缓存里,秒级生效。温数据比如产品说明、常见问题,更新周期按小时算,用增量索引。冷数据比如历史法规、老版本文档,更新频率低,按天或周重建全量索引。这样既保证实时性,又控制成本。
再一个,索引层我会做多路召回融合。具体说就是[[混合检索]]:用 [[BM25]] 捕捉时效性关键词,比如“最新”、“2024年”,同时用向量检索捕捉语义。两条路的结果合并后,再按时间戳加权排序,近期文档得分更高。另外,同一实体我会保留历史快照,但检索时只返回最新版本,避免混淆。
检索层还有个动态补偿机制。如果query明显带有时间意图,比如“今天股市行情”,我会触发实时API去拉取最新数据,而不是只依赖知识库。如果检索得分低于某个阈值,说明知识库可能没有相关内容,这时候降级到搜索引擎或实时数据库,保证信息新鲜。这里有个关键点:必须设置置信度阈值,得分太低就直接走实时通道,否则模型会基于过时信息生成错误答案。
举个例子,在金融场景里,股票价格是秒级变化的,RAG必须结合实时数据流和历史背景一起用。而在医疗法律场景,知识更新慢,更侧重权威来源的版本控制,比如某个药品说明书更新了,旧版本要标记为已废弃,不能直接删掉,因为法律上可能需要追溯。
落地时有个常见失败场景:知识库刚更新,但检索时还是召回旧版本,因为 [[HNSW]] 索引的局部性导致动态更新不及时。我的做法是把更新分成新增、修改、删除三类,新增直接增量插入,修改和删除用软删除加异步重建,同时维护base和delta双索引,查询时合并再按版本过滤。构建完不能直接上线,我会用一批固定query回放,对比Recall@K和延迟,通过才原子切换,不通过就回滚。
说到版本控制,其实还有一个更细的坑:如果同一个实体有多个历史版本,检索时怎么保证召回的是最新且最相关的那一个? 我倾向的做法是在文档元数据里加时间戳和版本号,检索时按时间降序取第一个,但如果有语义不匹配的情况,比如用户问的是“去年的政策”,那就得靠query意图识别来切换版本。
所以整体来看,我会把RAG的时效性看作一个系统性问题,不是单靠某个算法就能解决的。我更倾向用分层策略加多路召回,再配合实时补偿,同时做好版本控制和索引一致性校验。如果面试官对版本控制或者混合检索的具体实现感兴趣,我可以再展开讲讲。