算力缓存命中和泄露

本笔记原为 AI 问答生成的科普内容,经重新分析 + 查询 2025-2026 最新官方文档与安全研究后重构。核心修订:修正计费细节(无独立存储费、read 折扣各家差异大)、补充「泄露」的真正技术本质——缓存时序侧信道攻击(跨租户缓存共享可被探测)。

一、概念:缓存写入与缓存读取

在大模型 API 计价中,缓存写入(Cache Write)与缓存读取(Cache Read)是围绕上下文缓存(Context Caching)技术衍生的两种计费模式。

缓存写入(Cache Write / Creation):首次发送符合缓存条件的长文本(系统提示词、参考文档、历史对话等)时,模型处理该前缀并将其保存到服务端缓存。写入需对文本完整编码,单次价格通常高于普通输入 Token 价(见计费表)。注意:主流厂商不单独收取存储费,缓存存储成本通过较高的写入价吸收。

缓存读取(Cache Read / Hit):后续请求命中已缓存内容时,直接复用缓存,仅处理新增的 Prompt 部分。读取大幅降低计算开销,价格显著低于普通输入价(各家折扣差异大,见计费表)。

各家计费对比(2026 年官方文档)

提供商触发机制写入价读取价TTL / 保留
Anthropic自动缓存 + 显式 cache_control 断点5 分钟 TTL:1.25× 基础输入价;1 小时 TTL:2× 基础输入价0.1×(-90%)默认 5 分钟,命中免费续期;可选 1 小时;TTL 从请求开始计时(非响应结束)
OpenAI自动缓存(≥1024 tokens 前缀)+ 显式断点;按前缀 hash(前 256 tokens)路由到同机GPT-5.6 前免费;GPT-5.6 起 1.25× 未缓存输入价折扣(早期模型约 0.5×,具体因模型而异)约 5 分钟;GPT-5.6 起 prompt_cache_options.ttl 为最小保留期语义;支持租户级 prompt_cache_key
DeepSeek自动 KV 缓存无独立写入费(按未命中价计)约 0.02×(命中价约为未命中价的 1/50,-98%)自动管理

二、技术本质:KV Cache 复用

Transformer 架构处理输入时,必须为每个 Token 计算 Key-Value 向量(KV Cache),消耗大量 GPU 算力与显存带宽。无缓存时,即便前 10,000 个 Token 完全相同,每次请求都要从第 1 个 Token 重新计算;有缓存时,首次请求生成并保存 KV Cache(写入),后续请求直接挂载读取(命中),跳过前序 prefill 计算。

  • 断点(breakpoint):缓存按前缀划分,断点标记可缓存块的边界;自动缓存时断点自动移动到最后一个可缓存块,无需随对话增长手动更新
  • 路由:OpenAI 按前缀 hash(前 256 tokens)将请求路由到最近处理过相同前缀的机器,以提高命中率
  • 隔离:多数厂商实现 per-account / per-organization 缓存空间,防止跨租户命中(但隔离并非总有效,见第五节)

Prefill 从零拆解:输入、计算、产物与用途

一句话本质:Prefill = 把整段输入「读一遍、算一遍」,产出两层东西——每层的 K/V 张量(输入的记忆快照)+ 第一个输出 token。

  • 输入什么:整段输入的 token 序列经 embedding 后的向量序列,形状 [N, H](N = 输入 token 数,H = 隐藏维度)。例:Llama-3-8B 输入 100K token → [100000, 4096] 浮点矩阵(约 1.6GB fp16)
  • 做什么计算:向量逐层穿过全部 L 层(8B 模型 32 层),每层两类计算:Attention(x 投影为 Q/K/V,softmax(Q·K^T)·V 让每个 token 按相关性聚合全序列信息);MLP(两次大矩阵乘升维降维)。整个 prefill 是并行的——N 个 token 同时算(矩阵乘天然并行),所以叫「一次性读完整段」
  • 计算成什么:① 每层每 token 的 K 和 V 张量 → KV Cache(形状 [L, N, kv_head, head_dim],8B 模型 ≈ 64KB/token,100K token ≈ 6.1GB);② 末 token 最终 hidden state → 喂给 LM head 预测第一个输出 token
  • 交给谁用:KV Cache 交给 decode 阶段的 Attention——之后每生成一个新输出 token,它的 Q 都要和全部历史 token 的 K/V 做 attention(查相关性、取内容);末 token hidden state 交给 LM head——softmax 出词表概率,采样出首个输出词
  • 作用是什么:KV 是「输入的记忆快照」,把输入编码成可供后续生成随时引用的中间表示,回答「当前要生成的词,和输入里的哪些内容相关」
  • 为什么要做:生成是自回归的,第 t 个输出 token 要 attend 全部已生成 token(含整个输入)。不存 KV → 每生成 1 个 token 重跑 O(N) 的 prefill,生成 M 个 token 总代价 O(N×M);存 KV → 每步只做 O(1) 的 attention(读 K/V),总代价 O(N+M)。prefill 是一次性投资,KV 是投资产物,decode 是持续收租

量级感受(8B 模型,100K token 输入):Prefill ≈ 640 TFLOPs(A100 上约 7~20 秒)——重但并行、确定;KV ≈ 6.1GB——这正是缓存要存的东西;Decode 每 token 读 6.1GB KV 做 attention——输出越多越贵,且无法缓存。

一句话收尾:Prefill 把「文本」变成「可引用的向量记忆」(KV),交给 decode 生成时逐字查用;不做它,生成就失去了对输入的参照。

三、商业本质:算力让利与成本结构设计

  • 对用户:将变动少的长上下文打包缓存,大幅降低调用成本并缩短等待时间
  • 对服务商:避免重复 prefill 计算,显著提升 GPU 节点吞吐与资源利用率;写入价 > 基础价的部分即缓存存储与维护成本的对价
  • 适用场景:智能客服(固定知识库)、代码助手(固定项目上下文)、Agent(复杂系统提示词)、超长文档/合同问答
  • 不适用场景:每次全新、无重复的短文本单轮问答(写入有额外开销与最低 Token 门槛,享受不到读取优惠)

四、对效果的影响

输出质量:零影响。缓存读取复用数学上完全一致的中间计算结果(KV 矩阵),不会造成能力下降、精度损失或回答质量变差;命中缓存与每次重传完整上下文在理论上无区别。

性能与成本:巨大提升。

维度影响
推理首字延迟(TTFT)极大幅降低。长文档/大代码库未缓存时可能 5~10 秒出首字,命中后降至毫秒级(跳过 prefill)
API 整体成本对话、长文档分析、Agent 循环中高频复用同一上下文时,整体 Token 费用可节省 50%~90%+(DeepSeek 场景可更高)
上下文上限利用使高频使用超长 Context(128K~1M tokens)具备商业可行性

常见误解澄清:命中到底省了什么、不省什么

一次请求分四段:① 分词 tokenize(CPU,文本切 token id)→ ② Embedding(GPU 轻量,token 变向量)→ ③ Prefill(GPU 重型,把整段输入算成 KV 张量并产出首个输出 token)→ ④ Decode(GPU,逐 token 生成输出)。

环节计算位置是否被缓存成本占比
① 分词 tokenizeCPU否,每次重做极小
② EmbeddingGPU(轻量)否,每次重做极小
③ Prefill(KV 计算)GPU(重型)✅ 缓存的就是这块长输入时占 90%+
④ Decode(输出生成)GPU否,无法缓存与输出长度成正比

关键认知:

  • 命中省的是 ③ prefill——GPU 上把输入向量算成 KV 张量的重计算(跳过前缀),这是长上下文请求最重最慢的部分(TTFT 大头);不是 CPU 分词/嵌入(① ② 每次照做,成本占比极小,缓存不涉及它们)
  • ④ decode 不节省:每个新输出 token 都要跑完整前向,串行生成、内容未知、无法预存——输出部分永远按全价计算
  • 原因:prefill 是并行、确定性计算(结果可复用);decode 是串行、依赖前序 token(结果未知)
  • 结论:命中省「大头」(长输入 prefill),不省「小头」(输出 decode 与分词嵌入)

五、本地部署:缓存命中机制与 IO 权衡(实践)

硬件分层与各层角色

本地推理(vLLM / SGLang)的 KV 缓存可跨多级存储分层,命中速度与带宽逐级递减:

层级带宽量级适用角色是否适合在线命中
GPU 显存(HBM)约 2~3 TB/sKV 主缓存,推理工作集✅ 最优
内存(CPU RAM)跨 PCIe 传输约 32 GB/sswap / offload 空间:显存紧张时换出低频 KV⚠️ 短前缀可用,长前缀读回慢
固态硬盘(NVMe / SATA)NVMe 约 3~7 GB/s;SATA 约 0.5 GB/s磁盘缓存 / 转储:跨重启持久化、冷数据⚠️ NVMe 短前缀可用;SATA 基本只适合转储
机械硬盘(HDD)约 0.1~0.2 GB/s归档 / 冷备❌ 不适合在线命中

建立命中机制的工程做法

  • vLLM:Automatic Prefix Caching(APC,自动前缀缓存,默认启用)按公共前缀复用 KV;--swap-space 分配 CPU 内存作为换出空间(显存紧张时防 OOM 的兜底,不用于提速);V1 架构支持分布式磁盘 offload(超长上下文或大批并发时把 KV 卸载到磁盘暂存)
  • SGLang:RadixAttention 基数树前缀复用(自动缓存最长公共前缀,多轮对话 / 多请求共享前缀时命中率最高);--cpu-offload-gb 把部分 KV 放内存;--disk-cache-dir 磁盘缓存(可跨进程 / 重启持久化)
  • 提高命中率的关键在 prompt 组织:系统提示词 / 固定指令放最前且保持字节级稳定;动态内容(时间戳、随机 ID、变化参数)不要混入公共前缀;多轮对话保留完整历史让前缀持续复用;同一任务的模板统一;长公共文档(知识库)固定在前

核心权衡:读回缓存 vs 显卡重算

并非所有命中都划算——命中收益 = 跳过的 prefill 计算时间;命中成本 = 从低层存储把 KV 读回的时间。KV 读回是带宽密集型(顺序读大块数据),prefill 重算是算力密集型(GPU 高 FLOPs),两者对比取决于模型大小、前缀长度与存储层带宽。

KV 体积估算:每 token KV 字节 ≈ 层数 × KV 头数 × 头维度 × 2(fp16)。示例:Llama-3-8B ≈ 64 KB/token(100K token ≈ 6.1 GB);Qwen2.5-72B ≈ 160 KB/token(100K token ≈ 15.3 GB)。

存储层读回 100K token KV(8B 模型 ≈ 6.1 GB)与 GPU 重算 prefill(约 7~20 秒)对比
GPU 显存命中毫秒级✅ 远快于重算
CPU 内存(PCIe)约 0.2 秒✅ 远快于重算
NVMe SSD约 1~2 秒✅ 快于重算(超长前缀需实测)
SATA SSD约 10~15 秒⚠️ 与重算相当或更慢
机械硬盘约 30~60 秒❌ 慢于重算,应直接重算

结论规则:

  • KV 读回时间 < 重算时间 → 用缓存;反之直接让 GPU 重算,不要盲目追求命中
  • 机械硬盘只适合冷备归档,绝不应进入在线命中路径;SATA SSD 亦需谨慎;NVMe 是磁盘层唯一可接受的在线候选
  • 显存紧张 + 内存有剩余:优先把换出空间放内存(swap / offload),命中速度尚可;SSD 做跨重启的磁盘缓存;HDD 仅归档
  • 磁盘读回还会占用 PCIe / 内存带宽,可能拖慢并发的其他请求——批量读回大 KV 时尤其明显
  • 重算与读回的临界点随模型与 GPU 变化:大模型(KV 更肥)与慢存储组合更倾向重算;小模型 + NVMe 组合倾向读回

六、泄露:真正的本质(重点修订)

「泄露」存在两个层面,原笔记只覆盖了第一层,遗漏了第二层——技术侧信道,而这才是近两年被实证的核心风险。

层面一:数据留存面(服务商可访问)

  • 缓存为实现多次读取,必须将文本及其 KV 向量持久化到服务端存储(几小时到数天),落盘即降低数据被分析的门槛
  • 技术层面服务商拥有最高读取权限(大模型推理尚无法用同态加密保护缓存)
  • 潜在利用:模型训练(背诵风险)、用户画像与业务分析、系统级工程优化(命中率/热点分析,属合理范畴)
  • 行业规范:企业付费 API 通常承诺数据不用于训练;消费级产品默认用于训练可关闭;SOC2/ISO27001/GDPR 合规、租户隔离、TTL 定时销毁、ZDR(零保留,禁用持久化缓存)

层面二:技术侧信道面(缓存时序侧信道攻击)——真正本质

缓存命中会带来可观测的时序差异:命中请求跳过 prefill,响应更快、首字延迟更低、计费类别也不同。若缓存跨用户共享,攻击者就能利用这些差异探测他人数据:

  • 探测机制:攻击者构造与目标 prompt 相同前缀的请求,若命中(响应明显更快/计费为缓存读取价),即确认该前缀存在于缓存 → 逐段扩展前缀即可枚举出其他用户的 prompt 内容(前缀枚举/字典攻击)
  • 实证 1:Auditing Prompt Caching in Language Model APIs(arXiv 2502.07776,Gu et al.,ICML 2025):统计审计发现 7 家真实 API 提供商(含 OpenAI)存在跨用户全局缓存共享,导致用户 prompt 隐私泄露风险;还通过时序差异推断出 OpenAI embedding 模型是 decoder-only Transformer(此前未公开)——即缓存时序可泄露模型架构等元数据
  • 实证 2:CacheProbe(arXiv 2605.30613,2026-05):审计网关型 API(如 OpenRouter)——网关以共享组织凭据路由请求,可能绕过提供商层面的 per-account/per-org 缓存隔离,造成所有网关用户共享同一缓存空间,扩大侧信道攻击面
  • 攻击面归纳:缓存共享(跨租户/网关)是前置条件;时序差(TTFT)与计费差(cache read 价)是观测通道;前缀枚举是还原手段

防御措施(按敏感度递进)

  • 审查服务协议:确认明确声明数据不用于训练;选择支持 per-account/per-org 缓存隔离的厂商并验证隔离有效性
  • 敏感信息脱敏:上传长文档前对姓名、证件号、密钥、商业名称自动脱敏替换
  • 高合规场景:VPC / 私有化部署(Azure OpenAI、AWS Bedrock 等),或启用 ZDR(禁用持久化缓存)
  • 绝对不出本地:自建本地推理引擎(vLLM、SGLang 支持 KV Cache 复用),使用开源模型

资料来源:Anthropic/OpenAI/DeepSeek 官方文档(2026 年 8 月抓取);arXiv 2502.07776(Auditing Prompt Caching in Language Model APIs);arXiv 2605.30613(CacheProbe);vLLM 文档(Automatic Prefix Caching / swap space / disk offload);SGLang 文档(RadixAttention / disk cache)。