Q10RAG吴师兄 · 公众号 吴师兄学大模型5 分钟

面试官问:动态 RAG 的缓存体系怎么设计?

面试官原题

动态 RAG 的缓存体系怎么设计?

面试官 · Agent 岗面试现场

大家好,我是吴师兄。

在前几篇动态 RAG 的文章里,我讲过一个非常关键的事实: 动态 RAG 最大的成本,不是模型,是 I/O 和检索链路。

尤其是:

  • Embedding 计算贵

  • 向量检索慢

  • re-rank 模型重

  • API 调用不可控

这时候,缓存机制就成了“加速 RAG 的核武器级优化”。

很多面试官喜欢问这样的问题:

“动态 RAG 数据变来变去,那缓存还能用吗?怎么保证缓存命中?”

今天这篇文章,就基于训练营内部那套完整的 RAG 全链路优化方案,系统讲一下:

如何给动态 RAG 设计一套真正可落地的缓存体系?

不是概念,而是能直接复制到你的业务里的方案。

动态 RAG 的缓存不是“缓存结果”,而是“缓存环节”

为什么这么说?

因为动态 RAG 的最大特征是:

  • 数据随时更新

  • 网页可能失败

  • 增量内容每天产生

  • Embedding 可能过期

如果你缓存最终答案,一旦上游数据变了,就会变成:

缓存不一致 → 答案错误 → Bug 乱飞。

因此,动态 RAG 的缓存设计一定是分层结构:

缓存输入 → 缓存中间结果 → 缓存检索 → 缓存最终答案(可选)。

像是一个“RAG 的 CDN 层级体系”。

训练营里的 RAG 项目就是这么落地的。

下面我拆开讲。

动态 RAG 的四级缓存体系

基于实战经验,完整缓存体系分为 4 层:

  1. Embedding 缓存(最重要)

  2. 检索结果缓存(用来加速向量库访问)

  3. 答案缓存(针对 FAQ、强结构问题)

  4. 链路级缓存(管路复用,减少重复工作)

这四层缓存是“可组合”的,而不是非此即彼。

第一级缓存:Embedding 缓存

Embedding 是最贵的链路。

  • 调用 OpenAI/大模型 API → 贵

  • 网络延迟 → 慢

  • 重复请求率高

  • 动态页面文本会反复出现同样段落

所以训练营的标准做法是:

把所有 embedding 结果用 Redis 持久化缓存(TTL 30 天以上)

缓存 key 的做法,业界已经沉淀出一套很成熟的组合:

hash(规范化后的文本)

比如:

  • 去掉空格

  • 转小写

  • 修正标点

  • 去噪处理

为什么要规范化?

因为用户问法不同但语义一样,比如:

“今天北京天气怎么样” “北京今天天气如何”

如果不规范化,缓存命中率会非常惨。

有了 embedding 缓存后,我们能减少至少 50~90% 的延时。

第二级缓存:检索结果缓存(search cache)

Embedding 虽然贵,但 Milvus/HNSW 检索也不便宜:

  • 大规模向量库查询 → 毫秒级

  • 多用户并发 → 查询节点压力大

  • 动态数据太多 → 冷热文档混杂

所以我们会对这种查询做缓存:

cache_key = hash(question_text) + k值 缓存内容 = top-k 文档 id 列表

例如:

用户问了 100 次“退货政策是什么”, 检索结果在 12 小时内不会变。

那前 99 次全部可以直接返回缓存结果。

注意: 动态 RAG 要求设置合理 TTL(比如 1 小时~1 天)

避免页面更新导致缓存 stale。

第三级缓存:答案缓存(Answer Cache)

很多人以为 RAG 动态,就不能缓存答案。

错。

答案缓存是所有系统的加速秘诀,只是使用场景有限:

  • FAQ 场景

  • 知识库变化不频繁

  • 答案确定性强

  • 内容是结构化的(如政策、流程)

我们一般不会缓存所有问题,只会缓存命中率高的固定类问题。

比如:

“如何报销?”

“如何开具发票?” “XX 系统在哪登录?”

答案缓存有三个好处:

  1. 首字输出快到飞起

  2. 减少向量检索压力

  3. 减少模型推理成本

训练营里有个真实案例:

某咨询客服机器人,80% 的问题属于 FAQ, 通过答案缓存,把首字时间从 800ms 降到 20ms。

第四级缓存:链路级缓存(Pipeline Cache)

这是整套缓存设计里最容易被忽略、但最有用的部分。

比如:

  • embedding → 检索 → re-rank → prompt → 模型生成

在多用户并发的情况下,大量的任务其实可以“重用部分链路”。

例如:

同一个问题下,embedding 和检索结果是完全一样的。

如果你用 FastAPI + 线程池、或 asyncio pipeline,把任务做成“节点可重用”,可以让整个系统的吞吐量翻倍。

这也是训练营里教得最多的: RAG 的优化不是调模型,是调工程。

动态 RAG 的缓存必须加“脏数据防御”

动态 RAG 的重点不是“缓存”, 而是 缓存不一致怎么办

每一层缓存都必须加 “脏检查”:

  1. Embedding 校验 — 检查文本版本号

  2. 检索缓存校验 — 检查向量库更新时间戳

  3. 答案缓存校验 — 检查对应文档是否更新

  4. 链路缓存校验 — 检查中间节点有效性

举个例子: 网页数据今天更新了,那么:

  • embedding 缓存需要失效

  • 检索缓存需要失效

  • 答案缓存需要失效

  • prompt 缓存需要重建

如果没有这套机制,动态 RAG 会逐渐“发霉”,产生大量幻觉。

这部分我们俗称: “全链路一致性保障”

它属于工程落地的关键内容。

面试官问:动态 RAG 怎样确保缓存不影响召回准确度?

这是今天的核心。

你可以这样回答:

动态 RAG 的缓存本质上是“分层缓存”而不是“结果缓存”。

我们分别缓存 embedding、检索结果、答案与链路节点,并通过文本规范化、TTL 限制、向量库更新时间戳、文档版本号等方式确保缓存不会污染召回结果。

一旦检测到上游数据变化,会自动清理对应层级缓存,保证召回准确性。

百分百会被认为是 真干过项目的人

结语:缓存体系是动态 RAG 的生命线

写到这里你应该能看到:

动态 RAG 要做到快、稳、准,缓存体系是必需品。

很多人做 RAG 做着做着觉得:

  • 越用越慢

  • 向量库越存越大

  • 延迟越来越高

  • 服务器越来越撑不住

其实根本原因不是模型,而是:

没有缓存,没有清洗,没有 TTL,没有脏检查。

—— 本场面试完 ——

把题练成肌肉记忆。公众号「吴师兄学大模型」每周更新面试真题拆解;想系统上手 Agent 工程,看 AgentAlpha 训练营。