AI 缓存策略、Prompt Cache、语义缓存、RAG 缓存与 KV Cache 治理全景图
从前缀复用、语义命中、检索结果、工具结果到 KV Cache,回答 AI 系统怎样省钱提速,又不把旧答案、错证据和越权数据缓存成事故
阅读定位: 推理计算 / KV Cache讲底层 prefill、decode 和 KV Cache 成本,
AI 成本与性能讲成本优化总盘,
请求 Trace讲 cache_hit 怎样进入观测证据。
本页专门补缓存治理层:哪些内容可以缓存、缓存键怎么设计、什么时候必须失效、命中后怎样校验权限和版本,以及缓存收益怎样被证据化。
Prompt Cache
稳定前缀
→
Semantic Cache
近似问题
→
RAG Cache
检索结果
→
Tool Cache
外部结果
→
KV Cache
推理状态
→
Output Cache
最终答案
→
Invalidation
版本 / 权限
| 缓存类型 | 缓存什么 | 收益 | 最大风险 |
| Prompt Cache / Prefix Cache | System Prompt、工具说明、长文档前缀、稳定上下文 token | 降低 prefill 成本和 TTFT | 模板版本变化、权限变化后仍复用旧前缀 |
| Semantic Cache | 语义相近问题的最终答案或中间结果 | 减少模型调用,提升高频问答速度 | 相似不等于相同,可能答错上下文或用户 |
| RAG Retrieval Cache | query rewrite、检索候选、rerank 结果、证据摘要 | 降低检索和重排成本 | 知识库刷新、ACL 变化、文档撤回后仍命中旧证据 |
| Tool Result Cache | 只读 API、价格、库存、配置、统计结果 | 降低外部依赖延迟和成本 | 实时状态过期,或把租户 / 用户级结果串用 |
| KV Cache | 推理过程中每层 attention 的 Key / Value 状态 | 让 decode 不重复计算历史 token | 显存占用高、长请求挤占并发、取消后不释放 |
| Output Cache | 最终模型回答、结构化结果、摘要结果 | 高重复任务极快返回 | 答案过期、个性化错误、不可审计来源 |
| 键字段 | 为什么要进入 cache key | 漏掉会怎样 |
| tenant_id / user_scope | 区分租户、用户、角色和数据权限 | 把 A 租户或高权限用户的结果返回给 B |
| prompt_version / template_version | Prompt 和 Chat Template 改动会改变输出语义 | 上线新模板后仍复用旧行为 |
| model_id / sampling_config | 模型、温度、schema 和 stop rule 改变输出分布 | 缓存结果与当前模型策略不一致 |
| context_hash / rendered_prompt_hash | 确认模型看到的上下文是否一致 | 历史、RAG 证据或工具结果变化后仍命中旧结果 |
| index_version / doc_version | RAG 知识库和文档版本会影响证据 | 知识刷新、撤回或修订后旧证据继续污染答案 |
| policy_version / risk_tier | 安全策略和风险等级决定能否输出或执行 | 策略收紧后仍返回旧的高风险答案 |
| locale / product_surface | 语言、地区和产品入口影响格式和法律边界 | 跨地区、跨入口复用造成体验和合规错误 |
缓存键本质上是“什么条件下结果仍然有效”的声明
不要只用用户问题文本做 key。AI 请求结果通常依赖模型版本、Prompt、上下文、权限、知识库、策略和产品场景。
适合缓存
稳定系统提示、工具说明、固定文档前缀、长但很少变化的产品规则、同一会话内重复前缀。
不适合缓存
频繁变化的用户输入、权限敏感证据、实时工具结果、尚未定版的 Prompt 实验分支。
观测字段
prefix_hash、prefix_tokens、cache_hit、cache_reuse_tokens、prefill_saved_ms、cache_version。
| 问题 | 判断字段 | 动作 |
| 首 token 慢但输出不长 | context_tokens、prefix_tokens、cache_hit、prefill_ms | 把稳定前缀拆出来,观察 Prompt Cache 命中和 prefill 节省 |
| 模板上线后行为不一致 | prompt_version、prefix_hash、cache_version | 模板版本进入 cache key,旧版本缓存按版本自然退场 |
| 缓存命中率低 | prefix_stability、variable_order、rendered_prompt_hash | 固定消息顺序,减少无意义变量扰动,拆稳定前缀和动态尾部 |
| 场景 | 是否适合 | 关键约束 | 失败模式 |
| 公开 FAQ、固定政策解释 | 适合 | 版本稳定、无个性化、低风险 | 政策过期后继续返回旧答案 |
| 企业内部知识问答 | 谨慎 | 必须绑定 ACL、知识库版本和证据 id | 跨权限、跨部门、跨版本误命中 |
| 用户私人上下文问答 | 通常不适合共享 | 只能用户内或会话内复用 | 隐私泄露和个性化错答 |
| 代码、财务、法律、医疗类高风险任务 | 高门槛 | 需要强校验、低阈值慎用、人工或工具确认 | 相似输入对应不同事实,错误代价高 |
语义缓存要有“相似度阈值 + 适用域 + 证据版本”
只看 embedding 相似度不够。还要看任务类型、用户权限、知识版本、风险等级和答案是否可复用。
| 缓存层 | 缓存内容 | 失效条件 | Trace 字段 |
| Query Rewrite Cache | 原问题到检索 query 的改写结果 | 改写 Prompt、语言、任务类型变化 | query_rewrite_version、rewrite_hash |
| Retrieval Candidate Cache | 向量召回 / 关键词召回候选 | 索引版本、ACL、embedding 模型变化 | index_version、embedding_version、acl_snapshot |
| Rerank Cache | 候选排序和分数 | rerank 模型、query、候选集合变化 | rerank_model、rerank_scores、candidate_hash |
| Evidence Summary Cache | 长文档片段的摘要或压缩证据 | 文档版本、摘要 Prompt、权限变化 | doc_version、summary_prompt_version、evidence_hash |
| Citation Cache | 引用位置、页码、段落 id | 文档解析、切片策略、页码版本变化 | parser_version、chunk_version、citation_ids |
RAG 缓存必须和 ACL 一起设计
检索结果缓存如果不带权限快照,最容易把“某人可见的证据”误当作“所有人可见的知识”。
| 工具类型 | 缓存策略 | 必要字段 | 不该缓存什么 |
| 只读配置 / 字典 | 可较长 TTL | tool_version、tenant_scope、updated_at | 带用户隐私的查询结果 |
| 价格 / 库存 / 状态 | 短 TTL 或事件驱动失效 | freshness_sla、source_timestamp、ttl | 需要强实时一致性的动作依据 |
| 搜索 / 外部 API | 按 query、地区、时间窗缓存 | provider、query_hash、region、expires_at | 许可不允许复用的数据 |
| 写操作结果 | 通常不缓存结果,只缓存幂等状态 | idempotency_key、operation_status、side_effect_committed | 把一次写操作响应复用给另一次写操作 |
它解决什么
decode 时避免反复计算历史 token 的 Key / Value,让逐 token 生成可承受。
它不解决什么
不会自动减少输出 token,也不会让错误上下文变正确,更不能当跨用户业务缓存。
治理重点
显存占用、长请求驱逐、取消释放、连续对话复用、batch 调度和 P95 / P99 抖动。
| 问题 | 字段 | 动作 |
| 长请求挤占并发 | kv_cache_bytes、active_sequences、context_tokens | 长短请求分池,限制上下文,驱逐低优先级请求 |
| 取消后显存不降 | client_cancelled、resource_released、kv_cache_released | 检查取消传播,释放 KV Cache 和队列状态 |
| 多轮对话首 token 仍慢 | conversation_cache_hit、prefix_reuse_tokens、prefill_ms | 检查是否能复用稳定前缀,或历史摘要是否破坏前缀稳定 |
| 失效来源 | 触发条件 | 处理方式 | 必须记录 |
| 版本变化 | Prompt、模型、工具 schema、RAG 索引、策略版本变化 | 版本进入 key,旧版本自然过期或批量清理 | invalidated_by_version、old_version、new_version |
| 权限变化 | 用户角色、租户 ACL、文档权限变化 | 按权限快照失效,敏感缓存短 TTL | acl_snapshot、permission_version |
| 知识变化 | 文档新增、删除、修订、撤回、解析重建 | 按 doc_id / index_version 精准失效 | doc_version、index_version、parser_version |
| 策略变化 | 安全、合规、拒答、风险等级策略变化 | 策略版本进入 key,高风险场景强制重算 | policy_version、risk_tier |
| 质量反馈 | 缓存结果被判错、投诉或进入事故 | 封禁 key、回滚缓存、进入坏例评测 | cache_key、review_label、incident_id |
| 指标 | 含义 | 为什么重要 |
| cache_hit_rate | 命中比例 | 只说明复用频率,不说明复用是否正确或有价值 |
| prefill_saved_ms / tokens_saved | 节省的时间和 token | 衡量 Prompt Cache 和前缀复用的真实收益 |
| false_hit_rate | 命中但后来被判错的比例 | 语义缓存和 RAG 缓存的核心风险指标 |
| stale_hit_rate | 命中过期知识、旧权限或旧策略的比例 | 判断失效策略是否可靠 |
| cache_cost_overhead | 缓存存储、索引、校验和失效的成本 | 缓存系统本身也会消耗工程和资源 |
| quality_delta_on_hit | 命中缓存时质量指标变化 | 证明缓存没有用速度换掉质量和安全 |
缓存收益要进入 Trace 和 Eval
每次命中最好记录 cache_type、cache_key_hash、cache_version、hit_reason、freshness、tokens_saved、latency_saved 和 quality_label。否则缓存优化很容易变成只看账单的局部优化。
跨租户命中
cache key 没有 tenant / ACL,A 用户的证据或答案被 B 用户命中。必须把权限边界放进 key 或结果校验。
知识撤回后旧答案继续出现
RAG 缓存没有绑定 doc_version / index_version,文档删除、修订或撤回后旧证据仍被复用。
语义相似导致答非所问
embedding 相似度高,但任务条件、时间范围或用户上下文不同。要加任务类型、场景和风险约束。
Prompt 改版后缓存污染评测
新 Prompt 的请求命中旧 Prompt 缓存,导致线上表现和离线 Eval 对不上。
取消后 KV Cache 泄漏
用户停止生成后模型服务仍保留状态,GPU 显存和队列被慢慢吃满。
缓存命中率高但质量下降
缓存节省了调用,但把旧答案、过期证据或低质量答案放大。必须看 false_hit_rate 和质量切片。
| 相邻页 | 它回答什么 | 本页补什么 |
| 推理计算 / KV Cache | prefill、decode、KV Cache 的底层计算和显存成本 | 把 KV Cache 放进生产缓存治理,区分底层状态和业务缓存 |
| 上下文组装 / 窗口预算 | 哪些上下文进入模型 | 说明稳定前缀、rendered_prompt_hash 和 token budget 如何影响缓存 |
| 生成运行时 | 生成请求怎样排队、prefill、decode、流式和收尾 | 补充 cache_hit、prefix reuse、取消释放和 TTFT 优化证据 |
| 请求 Trace / 排障模板 | 请求证据字段和排障模板 | 定义 cache_type、cache_key、cache_version、freshness、tokens_saved 等观测字段 |
| AI 成本与性能 | 质量、延迟、成本和资源平衡 | 把缓存从“省钱技巧”升级为可评测、可失效、可审计的治理层 |
| 权限 / 租户 / 数据边界 | 谁能看什么、能做什么 | 强调缓存必须带上 tenant、ACL、permission_version 和数据边界 |