Appearance
11.2.2 哪些环节适合做缓存?
先给结论:RAG 不是只能缓存“最终答案”。检索结果、重排结果、上下文构造结果都可以缓存,但必须绑定权限、版本和时间边界。缓存位置选错,会带来比延迟更严重的风险。
很多团队一谈缓存,第一反应是:
- 缓存最终答案
这当然是最直接的方式,但在真实系统里,答案缓存往往最敏感,也最容易出错。更合理的做法是按链路分层缓存。
一、适合缓存的环节
1. 检索结果缓存
适合场景:
- 高频查询
- 文档更新不频繁
价值:
- 减少向量库或搜索引擎压力
- 稳住高并发下的检索延迟
注意:
- 必须绑定
tenant、permission、version、time_range
2. 重排结果缓存
适合场景:
- 重排模型成本高
- 查询重复率较高
价值:
- 减少重排调用
- 稳定最终排序
注意:
- 如果候选池更新频繁,需要设置较短 TTL
3. 上下文构造结果缓存
适合场景:
- 上下文构造逻辑复杂
- 长文档、多文档组合成本高
价值:
- 减少拼接和聚合成本
- 稳定生成输入
注意:
- 上下文构造和模板版本要纳入缓存键
4. 生成结果缓存
适合场景:
- 高频 FAQ
- 低时效内容
价值:
- 最显著地降低成本和延迟
注意:
- 最敏感,必须绑定权限和版本,必要时设置短 TTL
二、不适合缓存的环节
以下情况通常不适合缓存或需要非常谨慎:
强时效问题
例如实时库存、订单状态、价格等高风险或强合规问题
错误答案的代价非常高高度个性化场景
与用户上下文强绑定的问题
在这些场景里,缓存会带来:
- 答案过期
- 权限穿透
- 个性化错配
三、缓存设计必须绑定的几个关键条件
一个可用的缓存键至少应包含:
tenant/org
避免租户串数据permission_scope
避免权限越界version/effective_time
避免新旧版本混答query_norm
避免同义问题重复计算
这四个条件如果少了任何一个,缓存就可能从“提升性能”变成“制造风险”。
四、缓存的常见误区
误区一:只缓存最终答案
结果可能是:
- 缓存命中率不高
- 风险最高
更稳的做法是:
- 优先缓存检索或重排结果
误区二:缓存键只用 query
这会导致:
- 权限串数据
- 新旧版本混用
误区三:缓存没有失效策略
如果没有 TTL 或版本失效机制,缓存会:
- 越用越不可信
五、一个最小缓存层级示意
python
cache_layers = {
"retrieval_cache": ["tenant", "permission", "version", "query_norm"],
"rerank_cache": ["tenant", "permission", "version", "query_norm"],
"context_cache": ["tenant", "permission", "version", "query_norm", "template_id"],
"answer_cache": ["tenant", "permission", "version", "query_norm"]
}这个示意的重点是:
- 不同环节能缓存
- 但缓存键必须足够严格
一句话总结
RAG 缓存应该分层放在检索、重排、上下文和生成等环节,但必须绑定权限、版本和时间边界。缓存位置选错或缓存键设计不完整,性能提升会换来系统风险。