本笔记原为 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 生成输出)。
| 环节 | 计算位置 | 是否被缓存 | 成本占比 |
|---|---|---|---|
| ① 分词 tokenize | CPU | 否,每次重做 | 极小 |
| ② Embedding | GPU(轻量) | 否,每次重做 | 极小 |
| ③ 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/s | KV 主缓存,推理工作集 | ✅ 最优 |
| 内存(CPU RAM) | 跨 PCIe 传输约 32 GB/s | swap / 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)。