Skip to content

缓存策略

工程落地第三站:性能。语义缓存、检索缓存、回答缓存的层级设计与一致性。

Updated View as Markdown
For humans

缓存策略

RAG 链路比纯 LLM 调用长:嵌入、检索、重排、生成。缓存命中能同时省延迟和钱,但 RAG 的缓存有个特殊问题:用户问题几乎不会逐字重复,缓存键不能直接用原始文本。

三个缓存层级

RAG 缓存层级

语义缓存(最高层):用户查询先向量化,和缓存的查询向量比对,相似度超阈值直接返回缓存的回答。适合高频重复问题,比如客服场景八成的提问是重复的。风险是语义误命中:两个问题语义相似但答案不同,会返回错误回答,阈值要校准。

检索缓存:相同或相似查询的检索结果复用,跳过嵌入和 ANN。适合查询稳定、知识库更新不频繁的场景。知识库更新时要按文档版本失效相关缓存。

生成缓存:完整回答缓存,按查询相似度加 TTL 管理。和语义缓存功能重叠,二选一即可,通常语义缓存就够。

缓存失效

RAG 缓存的一致性比传统缓存更难:知识库一更新,所有相关缓存都可能过期。策略:

  • TTL:简单兜底,按知识更新频率设置
  • 版本化失效:缓存记录知识库版本,版本变更时全量或按文档失效
  • 敏感查询不缓存:涉及权限、个人信息、实时数据的查询跳过缓存

生产实践

  • 缓存键用归一化后的查询(去标点、统一大小写),提高命中率
  • 热度统计,只缓存高频查询,冷查询写缓存是浪费
  • 缓存层和检索层分开部署,缓存抖动不影响主链路
  • 监控命中率,低于预期先查查询归一化和阈值

面试追问

  1. 为什么 RAG 缓存不能用原文做键? 用户问题几乎不会逐字重复,要用 Embedding 相似度做语义匹配
  2. 语义缓存的风险? 语义误命中:两个问题相似但答案不同,返回错误回答。阈值要校准,敏感查询跳过缓存
  3. 知识库更新了缓存怎么办? TTL 兜底加版本化失效,缓存记录知识库版本,变更时按文档失效
  4. 哪一层缓存性价比最高? 语义缓存。高频重复问题命中后跳过整条 RAG 链路,延迟和成本同时省
  5. 什么查询不该缓存? 涉及权限、个人信息、实时数据的查询。缓存会绕过权限校验和新鲜度要求
Navigation

Type to search…

↑↓ navigate↵ selectEsc close