🎯 缓存命中:AI 推理中最被低估的指标
你的 LLM API 账单里可能藏着 70% 的水分——一切都取决于这三个字:命中率
💡 引言:一个被忽略的杠杆
当你把 system prompt 从 3,000 token 优化到 500 token,你很高兴。当你切换到更便宜的模型,你更高兴。
但你可能从来没问过一个问题:我的缓存命中率是多少?
2025-2026 年,AI 推理缓存已经不再是「可选的优化」,而是架构的核心支柱。OpenAI、Anthropic、Google 都内置了自动缓存,vLLM 和 SGLang 把 KV Cache 命中率做到了 95%+。然而,大多数团队根本没意识到自己正在为重复的计算付两次钱——而且是全价。
这篇文章不聊缓存技术原理,我们只聚焦一个数字:Cache Hit Rate(缓存命中率)——它是什么、怎么算、什么影响它、如何优化、以及它到底值多少钱。
🔄 前传:缓存是什么?AI 缓存跟一般缓存有何不同?
缓存是什么
缓存(Cache)是计算机科学最古老的优化手段之一:把昂贵操作的结果存下来,下次需要时直接复用。
- CPU 有 L1/L2/L3 缓存——避免每次都去内存读数据
- 数据库有 Buffer Pool——避免每次都去磁盘读数据
- CDN 有边缘缓存——避免每次都回源站拉文件
- 浏览器有 HTTP 缓存——避免每次都重新下载资源
它们的共同逻辑:空间换时间。花一点存储空间,换取大量重复计算或 I/O 的节省。
AI 缓存的独特之处
AI 模型推理的缓存,和传统缓存有本质差异:
1️⃣ 缓存粒度:从「文件」到「数学状态」
传统缓存缓存的是完整的结果——一个 HTML 页面、一张图片、一条 SQL 查询结果。命中了就直接返回,不存在「部分命中」的概念。
AI 缓存缓存的是计算的中间状态——Key-Value 矩阵。一个 prompt 可能有 8,000 token,缓存命中了前 6,000,剩下 2,000 仍然需要计算。这意味着:
- 命中率不是 0 或 100%,而是一个连续的百分比
- 80% 的命中率表示 80% 的 token 被缓存覆盖,只需计算剩下的 20%
- 这带来了潜在地累计算错误的可能:命中率 60% 的请求比 50% 的便宜一些,但差距只是 10 个百分点的 prefill 量
2️⃣ 缓存键:从「精确 Key」到「前缀匹配」
传统缓存用精确 Key来索引——URL、SQL hash、文件名。Key 不对,就是 miss。
AI 缓存用前缀匹配——新请求的 prompt 开头和缓存中的某个 prompt 开头一致,就是 hit。这意味着:
- 缓存命中判断本身就是一个计算操作(字符串/向量匹配)
- 两个请求不必完全相等,共享一部分前缀就能获益
- 同一个缓存条目同时服务无数个不同的请求(只要它们的前缀相同)
3️⃣ 一致性模型:从「强一致」到「近似一致」
传统缓存要求命中返回的结果必须与重新计算结果完全一致。返回过期数据是 bug。
AI 缓存面临不同的权衡:
- KV Cache 缓存的中间状态在数学上保证与重新计算完全一致
- Semantic Cache(语义缓存)则允许一定程度的近似——两个语义相似的 prompt 共享同一个回答,可能丢失细微差异
- GenCache(生成式缓存)更进一步:缓存的不再是结果,而是生成结果的模式,用程序动态合成适应变化的新回答——这已经完全不是传统意义上的「缓存」了
4️⃣ 成本结构:从「省存储」到「省计算费」
传统缓存节省的是 I/O 和带宽成本。一个 CDN 命中 = 省了回源的服务器 CPU + 带宽。
AI 缓存节省的是 GPU 计算成本,这是目前最昂贵的计算资源之一:
- 一次 GPT-4 级别的 prefill,100K token 的 prefill 可能需要数秒的 GPU 时间
- 缓存命中后,这部分 GPU 时间归零
- API 层面的缓存折扣高达 90%(Anthropic)或 50-75%(OpenAI)
- 在 AI 场景,缓存直接等于真金白银
5️⃣ 时效性与写成本
传统缓存没有「写成本」的概念——为了给将来的命中做准备,缓存写入本身几乎免费。
AI 缓存的写入是有真实成本的:当你第一次发送一个 prompt,API 提供商会完整计算一遍 prefill,然后把中间结果(KV Cache)存起来。这个计算过程你付了 100% 的费。对于 Anthropic 而言,你还要额外付 25% 的「写溢价」——因为它消耗了服务端宝贵的 GPU 显存来保存你的缓存条目。
| 维度 | 传统缓存 | AI 缓存 |
|---|
| 缓存内容 | 完整结果(HTML、图片、数据) | 计算中间状态(KV 矩阵) |
| 索引方式 | 精确 Key 匹配 | 前缀匹配 |
| 命中粒度 | 二值(hit/miss) | 连续百分比 |
| 一致性 | 强一致(过期=bug) | 可接受部分近似 |
| 成本节省 | I/O + 带宽 | GPU 计算(最贵的资源) |
| 写入成本 | 几乎为零 | 25-100% 的额外费用 |
| 缓存体量 | KB ~ MB | MB ~ GB(单请求可能数 GB) |
这就是 AI 缓存如此独特的原因:它面对的「昂贵操作」比传统场景贵几个数量级,但缓存本身的代价也同样高昂。命中率不仅是性能指标,更是财务指标。

📐 第一章:命中率是什么?怎么算?
定义
AI 模型推理中有两层缓存,命中率的定义也不同:
1️⃣ Prompt Cache 命中率(API 层)
命中率 = 命中缓存的 token 数 / 总输入 token 数
当你调用 OpenAI 或 Anthropic 的 API,如果 prompt 前缀和之前的请求相同,API 服务端会跳过重复的 prefill 计算,直接读取缓存结果。这部分 token 享受折扣价。
- 每次响应都会返回
usage.cached_tokens 字段
- 如果 0,说明完全没有命中的 token
2️⃣ KV Cache 命中率(引擎层)
命中率 = 缓存中匹配的 token 数 / 总预填充 token 数
在 vLLM、SGLang 等推理引擎内部,这衡量的是:新请求能在已有缓存中找到多少个匹配的前缀 token。命中越多,需要从头计算的 prefill 越少。
基线数据
不同场景下的典型命中率差异巨大:
| 场景 | 典型命中率 | 说明 |
|---|
| 多轮对话(活跃 session) | 80-95% | 对话历史几乎不变,前缀稳定 |
| RAG 流水线 | 70-90% | 大量共享的文档 chunk + 固定指令 |
| Few-shot 推理 | 60-80% | 示例部分可缓存 |
| Agent 工作流(工具定义) | 50-85% | 系统 prompt + 工具 schema 不变 |
| 随机多样化查询 | 20-40% | 前缀变化大,命中困难 |
| 一次性任务 | <5% | 几乎没有机会命中 |
💰 第二章:命中率的真实经济学
API 层:Prompt Cache 的算账
这是最直观也最容易算清楚的部分。2025-2026 年主流平台的定价模型:
Anthropic(Claude Sonnet 4.6 为例)
| 操作 | 单价 | 相对于基础价 |
|---|
| 基础输入 | $3.00/M tokens | 1.00× |
| Cache 写入(首次) | $3.75/M tokens | 1.25× |
| Cache 命中 | $0.30/M tokens | 0.10× |
OpenAI(GPT-4.1 / GPT-5)
| 操作 | 单价 | 相对于基础价 |
|---|
| 基础输入 | $2.00/M tokens | 1.00× |
| Cache 命中 | $0.50/M tokens | 0.25× |
| Cache 写入 | 无额外费用 | 1.00× |
注意关键差异:Anthropic 命中后打 90% 折扣(0.10×),但首次写入要付 25% 溢价(1.25×)。OpenAI 命中后打 50-75% 折扣,但不收写入溢价。
盈亏平衡点
这是最容易被忽略的陷阱。Anthropic 缓存写入要付 25% 的溢价,意味着:
你需要至少约 1.4 次命中才能收回写入成本。
计算过程:
- 写入成本:8K tokens × $3.75/M = $0.030
- 每次命中节省:8K tokens × ($3.00 - $0.30)/M = $0.0216
- 盈亏平衡:$0.030 / $0.0216 ≈ 1.39 次命中
也就是说:如果同一个缓存前缀在 5 分钟 TTL 窗口内(Anthropic 默认缓存时间为 5 分钟)只被请求了 1-2 次,你可能还不如不开缓存——因为写一次亏一次。
OpenAI 则不同
由于 OpenAI 不收写入溢价,每次命中都是纯省:
- 命中 1 次 → 节省 50%
- 命中 0 次 → 不亏不赚
所以 OpenAI 的缓存几乎永远是净收益,只是收益大小取决于命中率。
真实账单对比
场景:一个客服 Agent,每天 200 个 session,每个 session 5 轮对话。
设定:
- System prompt + tool definitions = 8K tokens(每轮不变)
- 用户输入(每轮不同)= 2K tokens
- 每轮 API 调用:system prompt(8K)+ 用户输入(2K)
不缓存(每轮全价付 10K tokens):
每 session:5 轮 × 10K = 50K tokens
每天:200 × 50K = 10M tokens
每月(26 个有效天):260M tokens
成本(Anthropic $3/M):260M × $3/M = $780/月
Anthropic 缓存(system prompt 命中):
每 session:
第一轮:写入 8K → $3.75/M × 8K = $0.030
用户输入 2K → $3.00/M × 2K = $0.006
小计:$0.036
第 2-5 轮:命中 8K → $0.30/M × 8K/轮 × 4轮 = $0.0096
用户输入 2K → $3.00/M × 2K × 4 = $0.024
小计:$0.0336
每 session 合计:$0.0696
每天 200 session:$0.0696 × 200 = $13.92
每月(26天):$13.92 × 26 = $362
节省:$780 → $362,约 54%。
如果使用 OpenAI(50% 缓存折扣,无写溢价):
每 session 成本略高(折扣较小),但无写溢价风险。
命中率 > 40% 即可净收益。
关键洞察是:缓存节省的幅度取决于稳定前缀占总输入的比例。本例中 8K/10K = 80% 的 token 是稳定的—这部分享受 90% 折扣。如果 system prompt 只有 2K 而用户输入占 8K,即使 100% 命中,节省也有限。
实际案例研究
🎯 案例 1:一个安全工具公司将动态内容(时间戳、请求 ID)放在 system prompt 前面,命中率只有 7.4%。把稳定内容移到前缀后,命中率飙升至 84%。仅仅一个结构变动,没有改任何业务逻辑。
🎯 案例 2:某 AI 代码助手在 OpenAI 上启用 prompt_cache_key 后,命中率从 60% 提升到 87%。这个参数让请求更可能路由到同一台缓存了前缀的推理引擎。
🎯 案例 3:Culprit(事故分析工具)在 Anthropic 上利用 prompt caching,每轮 RCA 调用成本从 $0.0065 降到 $0.0033——降幅约 50%。加上 Batch API 的 50% 折扣后,边际成本几乎可以忽略。
🧰 第三章:影响命中率的六大因素
1️⃣ 前缀稳定性
命中率的天花板由你的 prompt 结构决定。
❌ 差:system_prompt + 用户 ID + 时间戳 + 功能描述
✅ 好:system_prompt + 功能描述 + 用户 ID + 时间戳
核心原则:把稳定内容放前面,动态内容放后面。
2️⃣ 最小缓存长度
- OpenAI / Anthropic 要求 ≥ 1024 token 才能触发缓存
- Gemini 要求 ≥ 32K token
如果你的 system prompt 只有 500 token,缓存永远不会被触发。永远 0 命中率。
有趣的是:把 prompt 变长反而可能更省钱。一个 900 token 的 prompt 永远不会命中缓存,但加上一个 200 token 的 stable prefix 变成 1,100 token 后,如果命中率 50%,整体成本反而更低。
3️⃣ 请求密度
缓存是有 TTL 的:
- OpenAI:5-10 分钟
- Anthropic(默认):5 分钟
- Anthropic(延长):1 小时
- Gemini:用户自定义
如果两个相同前缀的请求相隔 10 分钟以上,Anthropic 的 5 分钟 TTL 已经过期,第二次请求需要重新写入(又付一次 25% 溢价)。
高密度流量是缓存的朋友,低密度流量是缓存的敌人。
4️⃣ 路由亲和性
OpenAI 内部根据 prompt 前 ~256 token 做哈希路由。没有路由亲和性,相同前缀的请求可能打到不同的推理实例上,导致缓存 miss。
prompt_cache_key 参数可以增强路由亲和性,让相同前缀的请求更可能到达同一实例。但要注意:每个 prefix + cache_key 组合超过 ~15 RPM 时会溢出到其他实例。
5️⃣ 调度策略(引擎层)
在自部署推理引擎中,请求到达的顺序直接影响 KV Cache 命中率:
- 不感知缓存的调度:按 FCFS 处理请求,频繁切换不同前缀
- 缓存感知调度(如 SGLang 的 LPM、PRISM 的 QAS):按前缀相似度分组,先处理能命中缓存的请求
PRISM(2026)的调度-缓存协同设计表明,联合优化调度和缓存驱逐策略可以将命中率提升 5.9-12.2 个百分点。
6️⃣ 驱逐策略
当缓存空间不足时,哪些被踢出去直接决定未来命中率:
| 策略 | 核心思路 | 命中率表现 |
|---|
| LRU(最近最少使用) | 默认选择,踢最久未访问的 | 均衡,对 burst 场景好 |
| LFU(最不频繁使用) | 踢访问次数最少的 | 对长 session 好,但可能有 stale 问题 |
| FIFO(先进先出) | 踢最先缓存的 | 简单但次优 |
| UniCache(2026) | 联合捕捉 session 复用和结构复用 | 比 LRU 好 3.86%-17.32% |
| RAC(2026) | 基于语义关系的驱逐 | 比强基线好 20-30% |
其中 UniCache 的关键洞察是:没有一种驱逐策略在所有负载下最优。混合负载下,LRU、LFU、FIFO 各有所长,UniCache 能动态适配。
🚀 第四章:如何在生产环境提升命中率
4.1 Prompt 结构优化(最简单、最高回报)
第一步:审计你的 prompt
// 每次调用时检查
{
"usage": {
"prompt_tokens": 4500,
"cached_tokens": 0 // 如果一直是 0,预警!
}
}
第二步:分离稳定和动态部分
❌ 当前结构(命中率 < 10%):
时间戳 + 用户ID + system prompt + 检索文档 + 用户问题
✅ 优化后结构(命中率 70-85%):
system prompt + 工具定义 + 检索文档 + 时间戳 + 用户ID + 用户问题
第三步:对 OpenAI 使用 prompt_cache_key
# 为所有共享同一 system prompt 的请求设置相同的 key
response = client.responses.create(
model="gpt-4.1",
input=[...],
prompt_cache_key="my-app-v1-system-prompt" # ✨ 关键参数
)
第四步:对 Anthropic 显式标注缓存边界
# 缓存 system prompt 和工具定义
response = client.messages.create(
model="claude-sonnet-4-20250514",
system=[
{
"type": "text",
"text": SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"} # 🎯 标记缓存
}
],
messages=[{"role": "user", "content": user_input}]
)
4.2 引擎层优化(自部署场景)
选择 RadixAttention(SGLang)而不是 PagedAttention(vLLM)
SGLang 的 RadixAttention 基于 token 级 radix tree,自动发现和复用任意长度的共享前缀。vLLM 的 PagedAttention 基于 block 级匹配——如果共享前缀与 block 边界不对齐,最后几个 token 会被重新计算。
基准测试:
| 场景 | vLLM 命中率 | SGLang 命中率 | 优势 |
|---|
| 多轮对话 | 70-80% | 90-95% | SGLang 强 |
| RAG 流水线 | 60-75% | 80-92% | SGLang 强 |
| 随机查询 | 20-30% | 20-30% | 持平 |
共享前缀比例 > 40% 时,切换到 SGLang 可降低 30-40% 的预填充延迟。
启用缓存感知调度
在 SGLang 中设置 --schedule-policy lpm,优先处理能与现有缓存匹配的请求。在 PRISM 中启用查询感知调度器(QAS),跟踪可复用 segment 的优先级。
调整驱逐策略
基于你的负载特征选择驱逐策略:
- 多轮对话为主 → LRU
- 长期 session + 频繁复用 → LFU
- 混合负载 → UniCache 或 SGLang 的 priority-based eviction
4.3 监控与指标

你需要追踪的不只是命中率,而是收益归因:
命中收益 = 命中 token 数 × (基础价 - 缓存命中价)
写入成本 = 写入 token 数 × 写入溢价
净收益 = 命中收益 - 写入成本
有效命中率 = 净收益 > 0 的会话比例
生产中的预警阈值:
| 指标 | 健康 | 警告 | 危险 |
|---|
| Prompt Cache 命中率 | > 60% | 30-60% | < 30% |
| KV Cache 命中率 | > 70% | 40-70% | < 40% |
| 缓存止损比 | > 2:1 | 1:1 ~ 2:1 | < 1:1 |
必做的监控工具:
- 每次 API 调用记录
cached_tokens 字段
- 按最常 miss 的 prompt 模式排序分析
- 定期检查「写入命中比」——如果写入太多命中太少,调 TTL 或改策略
🔬 第五章:2026 年的前沿探索
随机化驱逐:RLT
2026 年的一项研究表明,随机化驱逐策略在某些动态负载下比 LRU 好 6.92 倍。直觉:LRU 面对「恶意」或高波动的到达模式时,缓存被反复冲刷。随机化牺牲了确定性,换来了对任意模式的理论下界保证。
结合学习式路由(LBGR),端到端延迟降低 11.96 倍,命中率提升 36.45%。
PRISM:调度与缓存协同设计
PRISM 的核心洞察:调度和缓存是同一枚硬币的两面。
- 调度的决策(先处理哪个请求)直接影响未来缓存的 content
- 缓存驱逐的决策(踢谁出去)反过来影响调度的选择空间
PRISM 的查询感知调度器(QAS)会把共享前缀的请求聚合成”hot lane”优先处理,同时保留冷 lane 的空位避免饥饿。需求感知 radix tree(DART)利用调度器的提示来保护高价值的前缀不被驱逐。
结果:P99 TTFT 降低 23-37%,命中率提升 5.9-12.2 个百分点(绝对值)。
上下文截断与命中率陷阱
一个来自生产环境的反直觉发现:截断上下文会大幅降低命中率。
某企业使用滑动窗口处理超长上下文,将输入截断到只保留最新 token。结果,前缀缓存命中率从 85% 暴跌到 45%,因为截断后的输入不再匹配已缓存的完整前缀。
教训:如果必须截断,尽量保持前缀稳定——截取应从尾部开始,而不是头部。
📊 总结:命中率优化路线图
快速检查清单(今天就能做)
中期优化(一周内)
终极目标
| 场景 | 目标命中率 | 预期节省 |
|---|
| 客服 Agent | > 85% | 60-80% 输入成本 |
| 代码助手 | > 80% | 50-70% 输入成本 |
| RAG 系统 | > 75% | 40-60% 输入成本 |
| 多轮对话 | > 90% | 70-85% 预填充延迟 |
缓存命中不是「锦上添花」。在 2026 年,它是一个竞品差距——你的竞争对手可能已经在用相同的模型、相同的数据,但因为命中率高 30%,成本低 50%、响应快 3 倍。
而你,可能还在为同一个 system prompt 付全价。
📅 2026-05-26 | 🏷️ #LLM #CacheHit #CostOptimization #AIEngineering #SystemDesign
🎯 キャッシュヒット:AI推論において最も過小評価されている指標
あなたのLLM API利用料の70%は無駄になっているかもしれません—鍵は「ヒット率」の三文字にあります。
💡 序論:見過ごされがちなテコ入れポイント
システムプロンプトを3,000トークンから500トークンに最適化できた時、あなたはきっと満足したでしょう。さらに安価なモデルに切り替えた時は、もっと満足したはずです。
しかし、あなたは一度もこの問いを投げかけたことがないかもしれません。「私のキャッシュヒット率はどれくらいだろう?」と。
2025年から2026年にかけて、AI推論キャッシュはもはや「オプションの最適化」ではなく、アーキテクチャの核となる柱となっています。OpenAI、Anthropic、Googleはいずれも自動キャッシュを組み込んでおり、vLLMやSGLangはKVキャッシュヒット率を95%以上に高めています。しかし、ほとんどのチームは、繰り返し行われる計算に二重に—しかも全額—料金を支払っていることに全く気づいていません。
この記事ではキャッシュの技術的な原理には触れません。私たちが焦点を当てるのはただ一つの数字、**Cache Hit Rate(キャッシュヒット率)**です。それが何を意味し、どのように計算され、何がそれに影響を与え、どう最適化するのか、そして一体どれくらいの価値があるのか、を掘り下げていきます。
🔄 序章:キャッシュとは何か?一般的なキャッシュとAIキャッシュの違い
キャッシュとは
キャッシュ(Cache)は、コンピューターサイエンスにおける最も古くからの最適化手段の一つです。高コストな操作の結果を保存しておき、次回必要になった際に直接再利用するというものです。
- CPUにはL1/L2/L3キャッシュがあります—メモリから毎回データを読み込む手間を省きます。
- データベースにはバッファプールがあります—ディスクから毎回データを読み込む手間を省きます。
- CDNにはエッジキャッシュがあります—オリジンサーバーから毎回ファイルを引っ張ってくる手間を省きます。
- ブラウザにはHTTPキャッシュがあります—毎回リソースを再ダウンロードする手間を省きます。
これらに共通するロジックは「時間と空間のトレードオフ(空間的リソースを使って時間的リソースを節約する)」です。わずかなストレージスペースを費やすことで、大量の繰り返し計算やI/Oを節約します。
AIキャッシュの独自性
AIモデル推論におけるキャッシュは、従来のキャッシュとは本質的に異なります。
1️⃣ キャッシュの粒度:「ファイル」から「数学的状態」へ
従来のキャッシュは完全な結果—HTMLページ全体、画像1枚、SQLクエリの結果1件—をキャッシュします。ヒットすればそのまま返され、「部分的なヒット」という概念は存在しません。
AIキャッシュは計算の途中状態—Key-Value行列—をキャッシュします。プロンプトが8,000トークンあっても、キャッシュが最初の6,000トークンにヒットした場合、残りの2,000トークンは依然として計算が必要です。これは以下のことを意味します。
- ヒット率は0または100%ではなく、連続的なパーセンテージで表されます。
- 80%のヒット率は、80%のトークンがキャッシュでカバーされ、残りの20%のみを計算すればよいことを示します。
- これにより、計算コストの削減が段階的になるという特性が生まれます。60%のヒット率のリクエストは50%のヒット率のリクエストよりも少し安くなりますが、その差はプレフィル(事前処理)量の10パーセントポイントにすぎません。
2️⃣ キャッシュキー:「完全一致」から「前方一致」へ
従来のキャッシュは完全一致するキー—URL、SQLハッシュ、ファイル名—でインデックスを付けます。キーが一致しなければ、ミス(キャッシュされていない状態)と見なされます。
AIキャッシュは前方一致を使用します。新しいリクエストのプロンプトの冒頭が、キャッシュ内のプロンプトの冒頭と一致すればヒットと見なされます。これは以下のことを意味します。
- キャッシュヒットの判定自体が計算操作(文字列/ベクトルマッチング)です。
- 2つのリクエストが完全に等しくなくても、一部のプレフィックスを共有していれば恩恵を受けられます。
- 一つのキャッシュエントリが、同じプレフィックスを持つ無数の異なるリクエストに同時にサービスを提供できます。
3️⃣ 整合性モデル:「厳密な整合性」から「近似的な整合性」へ
従来のキャッシュは、ヒットして返される結果が再計算された結果と完全に一致することを求めます。古いデータが返されることはバグです。
AIキャッシュは異なるトレードオフに直面します。
- KVキャッシュがキャッシュする途中状態は、数学的に再計算された結果と完全に一致することが保証されます。
- **Semantic Cache(セマンティックキャッシュ)**は、ある程度の近似を許容します。意味的に類似した2つのプロンプトが同じ回答を共有するため、微妙なニュアンスが失われる可能性があります。
- **GenCache(生成的キャッシュ)**はさらに進んでいます。キャッシュするのは結果そのものではなく、結果を生成するパターンです。プログラムによって変化に適応した新しい回答を動的に合成するため、これはもはや従来の意味での「キャッシュ」とは全く異なります。
4️⃣ コスト構造:「ストレージ節約」から「計算コスト節約」へ
従来のキャッシュはI/Oと帯域幅のコストを節約します。CDNのヒットは、オリジンサーバーのCPUと帯域幅のコストを節約することに相当します。
AIキャッシュが節約するのはGPU計算コストであり、これは現在最も高価な計算リソースの一つです。
- GPT-4レベルのプレフィルでは、10万トークンのプレフィルに数秒のGPU時間を要することがあります。
- キャッシュヒットすれば、このGPU時間はゼロになります。
- APIレベルでのキャッシュ割引は、最大90%(Anthropic)または50-75%(OpenAI)にもなります。
- AIのシナリオでは、キャッシュは直接的に「真のお金」に相当します。
5️⃣ 有効期限と書き込みコスト
従来のキャッシュには「書き込みコスト」という概念がありません。将来のヒットに備えるためのキャッシュの書き込みは、ほとんど無料です。
AIキャッシュの書き込みには実際のコストがかかります。初めてプロンプトを送信する際、APIプロバイダーはプレフィル計算を完全に実行し、その中間結果(KVキャッシュ)を保存します。この計算プロセスに対して、あなたは100%の料金を支払います。Anthropicの場合、あなたはさらに25%の「書き込みプレミアム」を支払う必要があります。これは、サーバー側の貴重なGPUメモリを消費してキャッシュエントリを保存するためです。
| 項目 | 従来のキャッシュ | AIキャッシュ |
|---|
| キャッシュ内容 | 完全な結果(HTML、画像、データ) | 計算の中間状態(KV行列) |
| インデックス方法 | 完全一致のキーマッチング | 前方一致 |
| ヒット粒度 | 二値(ヒット/ミス) | 連続的なパーセンテージ |
| 整合性 | 厳密な整合性(期限切れはバグ) | ある程度の近似を許容 |
| コスト節約 | I/O + 帯域幅 | GPU計算(最も高価なリソース) |
| 書き込みコスト | ほぼゼロ | 25-100%の追加料金 |
| キャッシュ容量 | KB 〜 MB | MB 〜 GB(単一リクエストで数GBも) |
これこそが、AIキャッシュがこれほどまでにユニークである理由です。それが直面する「高コストな操作」は従来のシナリオよりも桁違いに高価ですが、キャッシュ自体のコストも同様に高価です。ヒット率は性能指標だけでなく、財務指標でもあるのです。

📐 第一章:ヒット率とは何か?どう計算するのか?
定義
AIモデル推論には二層のキャッシュがあり、ヒット率の定義も異なります。
1️⃣ プロンプトキャッシュヒット率(API層)
ヒット率 = キャッシュにヒットしたトークン数 / 総入力トークン数
OpenAIやAnthropicのAPIを呼び出す際、プロンプトのプレフィックスが以前のリクエストと同じであれば、APIサーバーは重複するプレフィル計算をスキップし、キャッシュ結果を直接読み取ります。この部分のトークンは割引価格が適用されます。
- 各レスポンスには
usage.cached_tokensフィールドが返されます。
- もし0であれば、キャッシュにヒットしたトークンが全くなかったことを意味します。
2️⃣ KVキャッシュヒット率(エンジン層)
ヒット率 = キャッシュ内でマッチしたトークン数 / 総プレフィル(事前処理)トークン数
vLLM、SGLangなどの推論エンジン内部では、これは新しいリクエストが既存のキャッシュ内でいくつのマッチするプレフィックス(前方一致)トークンを見つけられたかを測定します。ヒット数が多いほど、最初から計算する必要のあるプレフィルが少なくなります。
ベースラインデータ
異なるシナリオでの典型的なヒット率は大きく異なります。
| シナリオ | 典型的なヒット率 | 説明 |
|---|
| マルチターン対話(アクティブセッション) | 80-95% | 対話履歴がほとんど変わらず、プレフィックスが安定している。 |
| RAGパイプライン | 70-90% | 大量の共有ドキュメントチャンクと固定された指示。 |
| Few-shot推論 | 60-80% | 例示部分がキャッシュ可能。 |
| エージェントワークフロー(ツール定義) | 50-85% | システムプロンプト + ツールスキーマが不変。 |
| ランダムで多様なクエリ | 20-40% | プレフィックスの変化が大きく、ヒットが困難。 |
| ワンショットタスク | <5% | ヒットの機会がほとんどない。 |
💰 第二章:ヒット率の真の経済学
API層:プロンプトキャッシュの算出方法
これは最も直感的で、最も簡単に計算できる部分です。2025年から2026年にかけての主要プラットフォームの料金モデルです。
Anthropic(Claude Sonnet 4.6を例に)
| 操作 | 単価 | 基本料金に対する比率 |
|---|
| 基本入力 | $3.00/100万トークン | 1.00倍 |
| キャッシュ書き込み(初回) | $3.75/100万トークン | 1.25倍 |
| キャッシュヒット | $0.30/100万トークン | 0.10倍 |
OpenAI(GPT-4.1 / GPT-5)
| 操作 | 単価 | 基本料金に対する比率 |
|---|
| 基本入力 | $2.00/100万トークン | 1.00倍 |
| キャッシュヒット | $0.50/100万トークン | 0.25倍 |
| キャッシュ書き込み | 追加料金なし | 1.00倍 |
重要な違いに注意してください。Anthropicはヒット後に90%割引(0.10倍)を適用しますが、初回書き込みには25%のプレミアム(1.25倍)を支払う必要があります。OpenAIはヒット後に50-75%割引を適用しますが、書き込みプレミアムは徴収しません。
損益分岐点
これは最も見過ごされがちな落とし穴です。Anthropicのキャッシュ書き込みには25%のプレミアムがかかるということは、以下のことを意味します。
書き込みコストを回収するためには、最低でも約1.4回のヒットが必要です。
計算過程:
- 書き込みコスト:8Kトークン × $3.75/100万トークン = $0.030
- 1回のヒットで節約できる額:8Kトークン × ($3.00 - $0.30)/100万トークン = $0.0216
- 損益分岐点:$0.030 / $0.0216 ≈ 1.39回ヒット
つまり、もし同じキャッシュプレフィックスが5分間のTTL(有効期限)ウィンドウ内(Anthropicのデフォルトキャッシュ時間は5分)で1〜2回しかリクエストされなかった場合、あなたはキャッシュを使わない方が良かったということになりかねません。なぜなら、一度書き込むたびに損をしてしまうからです。
OpenAIは異なります
OpenAIは書き込みプレミアムを徴収しないため、1回のヒットごとに純粋な節約となります。
- 1回ヒット → 50%節約
- 0回ヒット → 損も得もしない
したがって、OpenAIのキャッシュはほぼ常に純粋な利益をもたらし、その利益の大きさはヒット率に依存します。
実際の請求額比較
シナリオ:カスタマーサポートエージェント、1日200セッション、各セッション5ターンの対話。
前提:
- システムプロンプト + ツール定義 = 8Kトークン(全ターンで不変)
- ユーザー入力(各ターン異なる)= 2Kトークン
- 1ターンあたりのAPI呼び出し:システムプロンプト(8K)+ ユーザー入力(2K)
キャッシュなし(各ターンを全額負担):
1セッション:5ターン × 10K = 50Kトークン
1日:200 × 50K = 10Mトークン
月額(26有効日):260Mトークン
コスト(Anthropic $3/M):260M × $3/M = $780/月
Anthropicキャッシュ(システムプロンプトにヒット):
1セッション:
1ターン目:書き込み 8K → $3.75/M × 8K = $0.030
ユーザー入力 2K → $3.00/M × 2K = $0.006
小計:$0.036
2-5ターン目:ヒット 8K → $0.30/M × 8K/ターン × 4ターン = $0.0096
ユーザー入力 2K → $3.00/M × 2K × 4 = $0.024
小計:$0.0336
1セッション合計:$0.0696
1日200セッション:$0.0696 × 200 = $13.92
月額(26日):$13.92 × 26 = $362
節約効果:$780 → $362、約 54%。
OpenAIの場合(50%割引、書き込みプレミアムなし):
1セッションあたりのコストは若干高くなるが、書き込みプレミアムリスクなし。
ヒット率40%以上で純利益。
重要な洞察:キャッシュによる節約幅は、安定プレフィックスが総入力に占める割合によって決まる。本例では8K/10K = 80%が安定トークンで、これに90%割引が適用される。システムプロンプトが2Kでユーザー入力が8Kの場合、100%ヒットしても節約効果は限定的。
実際のケーススタディ
🎯 ケース1:あるセキュリティツール企業は、システムプロンプトの先頭に動的な内容(タイムスタンプ、リクエストID)を置いていたため、ヒット率はわずか**7.4%でした。安定した内容をプレフィックスに移動させたところ、ヒット率は84%**に急上昇しました。ビジネスロジックを一切変更せず、構造を変えただけです。
🎯 ケース2:あるAIコードアシスタントがOpenAIでprompt_cache_keyを有効にしたところ、ヒット率が60%から87%に向上しました。このパラメータにより、リクエストが同じキャッシュ済みプレフィックスを持つ推論エンジンにルーティングされる可能性が高まります。
🎯 ケース3:Culprit(事故分析ツール)はAnthropicでプロンプトキャッシュを利用し、1回のRCA呼び出しコストを$0.0065から$0.0033に削減しました。約50%の削減です。Batch APIの50%割引と合わせると、限界費用はほとんど無視できるレベルになります。
🧰 第三章:ヒット率に影響を与える6つの主要因
1️⃣ プレフィックスの安定性
ヒット率の上限は、あなたのプロンプト構造によって決まります。
❌ 悪い例:システムプロンプト + ユーザーID + タイムスタンプ + 機能説明
✅ 良い例:システムプロンプト + 機能説明 + ユーザーID + タイムスタンプ
核心原則:安定した内容を先に、動的な内容を後に置く。
2️⃣ 最小キャッシュ長
- OpenAI / Anthropic はキャッシュをトリガーするために1,024トークン以上を要求します。
- Gemini は32,000トークン以上を要求します。
もしシステムプロンプトが500トークンしかない場合、キャッシュは永遠にトリガーされません。ヒット率は常に0%です。
興味深いことに、プロンプトを長くすることでかえってコストが節約できる可能性があります。900トークンのプロンプトは決してキャッシュにヒットしませんが、200トークンの安定したプレフィックスを追加して1,100トークンにすることで、ヒット率が50%であれば、全体的なコストはかえって低くなります。
3️⃣ リクエスト密度
キャッシュにはTTL(有効期限)があります。
- OpenAI:5-10分
- Anthropic(デフォルト):5分
- Anthropic(延長):1時間
- Gemini:ユーザー定義
もし同じプレフィックスを持つ2つのリクエストが10分以上間隔を空けている場合、Anthropicの5分間のTTLは既に期限切れとなり、2回目のリクエストは再度書き込みが必要になります(再び25%のプレミアムを支払うことになります)。
高密度のトラフィックはキャッシュの味方、低密度のトラフィックはキャッシュの敵です。
4️⃣ ルーティングアフィニティ
OpenAI内部では、プロンプトの最初の約256トークンに基づいてハッシュルーティングが行われます。ルーティングアフィニティがない場合、同じプレフィックスのリクエストが異なる推論インスタンスに分散され、キャッシュミスを引き起こす可能性があります。
prompt_cache_keyパラメータを使用すると、ルーティングアフィニティを強化し、同じプレフィックスのリクエストが同じインスタンスに到達する可能性を高めることができます。ただし、prefix + cache_keyの組み合わせが約15RPMを超えると、他のインスタンスに溢れることに注意が必要です。
5️⃣ スケジューリングポリシー(エンジン層)
セルフデプロイされた推論エンジンでは、リクエストの到着順序がKVキャッシュヒット率に直接影響します。
- キャッシュ非認識型スケジューリング:FCFS(先着順)でリクエストを処理するため、異なるプレフィックスが頻繁に切り替わります。
- キャッシュ認識型スケジューリング(SGLangのLPM、PRISMのQASなど):プレフィックスの類似性に基づいてグループ化し、キャッシュにヒットする可能性のあるリクエストを優先的に処理します。
PRISM(2026年発表)のスケジューリングとキャッシュの協調設計は、スケジューリングとキャッシュのエビクション(追い出し)ポリシーを連携して最適化することで、ヒット率を5.9〜12.2パーセントポイント向上させることが可能であることを示しています。
6️⃣ エビクションポリシー(キャッシュ追い出し戦略)
キャッシュスペースが不足した際、どの項目を追い出すかが将来のヒット率を直接決定します。
| ポリシー | 核心的な考え方 | ヒット率のパフォーマンス |
|---|
| LRU(Least Recently Used) | デフォルトの選択。最も長くアクセスされていないものを追い出す。 | バランスが良く、バースト的なシナリオに適している。 |
| LFU(Least Frequently Used) | 最もアクセス頻度の低いものを追い出す。 | 長いセッションに適しているが、古いデータの問題を抱えることも。 |
| FIFO(First-In, First-Out) | 最初に入ったものを最初に出す。 | シンプルだが、最適とは言えない。 |
| UniCache(2026) | セッションの再利用と構造の再利用を統合的に捉える。 | LRUよりも**3.86%-17.32%**優れている。 |
| RAC(2026) | 意味的な関係に基づいた追い出し。 | 強力なベースラインよりも**20-30%**優れている。 |
中でもUniCacheの重要な洞察は、すべての負荷において最適な追い出しポリシーは存在しないということです。複合的な負荷の下では、LRU、LFU、FIFOそれぞれに長所があり、UniCacheは動的に適応することができます。
🚀 第四章:プロダクション環境でヒット率を向上させる方法
4.1 プロンプト構造の最適化(最も簡単で高リターン)
ステップ1:プロンプトを監査する
// 各API呼び出しでチェック
{
"usage": {
"prompt_tokens": 4500,
"cached_tokens": 0 // もし常に0なら、要注意!
}
}
ステップ2:安定した部分と動的な部分を分離する
❌ 現在の構造(ヒット率 < 10%):
タイムスタンプ + ユーザーID + システムプロンプト + 検索ドキュメント + ユーザーの質問
✅ 最適化後の構造(ヒット率 70-85%):
システムプロンプト + ツール定義 + 検索ドキュメント + タイムスタンプ + ユーザーID + ユーザーの質問
ステップ3:OpenAIでprompt_cache_keyを使用する
# 同じシステムプロンプトを共有するすべてのリクエストに同じキーを設定
response = client.responses.create(
model="gpt-4.1",
input=[...],
prompt_cache_key="my-app-v1-system-prompt" # ✨ 重要なパラメータ
)
ステップ4:Anthropicでキャッシュ境界を明示的に指定する
# システムプロンプトとツール定義をキャッシュ
response = client.messages.create(
model="claude-sonnet-4-20250514",
system=[
{
"type": "text",
"text": SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"} # 🎯 キャッシュをマーク
}
],
messages=[{"role": "user", "content": user_input}]
)
4.2 エンジン層での最適化(セルフデプロイ環境)
vLLMのPagedAttentionではなく、SGLangのRadixAttentionを選択する
SGLangのRadixAttentionはトークンレベルのRadix Treeに基づいており、任意の長さの共有プレフィックスを自動的に発見し再利用します。vLLMのPagedAttentionはブロックレベルのマッチングに基づいているため、共有プレフィックスがブロック境界と整列していない場合、最後の数トークンは再計算されます。
ベンチマーク:
| シナリオ | vLLMヒット率 | SGLangヒット率 | 利点 |
|---|
| マルチターン対話 | 70-80% | 90-95% | SGLangが強い |
| RAGパイプライン | 60-75% | 80-92% | SGLangが強い |
| ランダムクエリ | 20-30% | 20-30% | 同等 |
共有プレフィックスの割合が40%を超える場合、SGLangに切り替えることでプレフィル(事前処理)のレイテンシーを30-40%削減できます。
キャッシュ認識型スケジューリングの有効化
SGLangで--schedule-policy lpmを設定し、既存のキャッシュとマッチするリクエストを優先的に処理します。PRISMでは、クエリ認識型スケジューラ(QAS)を有効にし、再利用可能なセグメントの優先順位を追跡します。
エビクションポリシー(キャッシュ追い出し戦略)の調整
ワークロードの特性に基づいてエビクションポリシーを選択します。
- マルチターン対話が主 → LRU
- 長期セッション + 頻繁な再利用 → LFU
- 複合的な負荷 → UniCacheまたはSGLangの優先度ベースのエビクション
4.3 モニタリングと指標

追跡すべきはヒット率だけではなく、収益の帰属です。
ヒットによる収益 = ヒットしたトークン数 × (基本料金 - キャッシュヒット料金)
書き込みコスト = 書き込んだトークン数 × 書き込みプレミアム
純収益 = ヒットによる収益 - 書き込みコスト
有効ヒット率 = 純収益が0を超えるセッションの割合
プロダクションにおけるアラートしきい値:
| 指標 | 正常 | 警告 | 危険 |
|---|
| プロンプトキャッシュヒット率 | > 60% | 30-60% | < 30% |
| KVキャッシュヒット率 | > 70% | 40-70% | < 40% |
| キャッシュ損益分岐比 | > 2:1 | 1:1 ~ 2:1 | < 1:1 |
必須のモニタリングツール:
- 各API呼び出しで
cached_tokensフィールドを記録する。
- 最もミスが多いプロンプトパターンを分析し、最適化する。
- 定期的に「書き込みヒット比」をチェックする—書き込みが多すぎてヒットが少なすぎる場合は、TTLを調整するか、ポリシーを変更する。
🔬 第五章:2026年の最先端技術
ランダム化エビクション:RLT
2026年のある研究では、ランダム化エビクションポリシーが、特定の動的負荷下でLRUよりも6.92倍優れていることが示されました。その直感は、LRUが「悪意のある」または高変動の到着パターンに直面すると、キャッシュが繰り返しクリアされてしまうというものです。ランダム化は決定論を犠牲にする代わりに、あらゆるパターンに対する理論上の下限を保証します。
学習型ルーティング(LBGR)と組み合わせると、エンドツーエンドのレイテンシーは11.96倍減少し、ヒット率は36.45%向上します。
PRISM:スケジューリングとキャッシュの協調設計
PRISMの核心的な洞察は、スケジューリングとキャッシュは同じコインの裏表であるというものです。
- スケジューリングの決定(どのリクエストを先に処理するか)は、将来のキャッシュの内容に直接影響します。
- キャッシュエビクションの決定(どれを追い出すか)は、スケジューリングの選択肢に逆方向に影響します。
PRISMのクエリ認識型スケジューラ(QAS)は、共有プレフィックスを持つリクエストを「ホットレーン」にまとめて優先的に処理するとともに、コールドレーンの空きを確保して飢餓状態を防ぎます。需要認識型Radix Tree(DART)は、スケジューラのヒントを利用して、高価値のプレフィックスが追い出されないように保護します。
結果:P99 TTFT(Time To First Token)が23-37%減少し、ヒット率が5.9-12.2パーセントポイント(絶対値)向上します。
コンテキストの切り詰めとヒット率の落とし穴
プロダクション環境からの直感に反する発見:コンテキストを切り詰めるとヒット率が大幅に低下する。
ある企業は、非常に長いコンテキストを処理するためにスライディングウィンドウを使用し、入力の最新トークンのみを保持するように切り詰めていました。結果として、切り詰められた入力がキャッシュされた完全なプレフィックスと一致しなくなったため、前方一致キャッシュのヒット率が85%から45%に急落しました。
教訓:もし切り詰めが必要な場合でも、プレフィックスを安定させるように努めるべきです—切り詰めは、先頭からではなく、末尾から開始するようにします。
📊 まとめ:ヒット率最適化ロードマップ
クイックチェックリスト(今日からできること)
中期的な最適化(1週間以内)
究極の目標
| シナリオ | 目標ヒット率 | 予想される節約 |
|---|
| カスタマーサポートエージェント | > 85% | 入力コストの60-80% |
| コードアシスタント | > 80% | 入力コストの50-70% |
| RAGシステム | > 75% | 入力コストの40-60% |
| マルチターン対話 | > 90% | プレフィルレイテンシーの70-85% |
キャッシュヒットは「あればより良い」といったものではありません。2026年において、それは競合との決定的な差となります。競合他社は同じモデル、同じデータを使用しているかもしれませんが、ヒット率が30%高いため、コストは50%低く、応答速度は3倍速いかもしれません。
一方、あなたは、同じシステムプロンプトに全額を払い続けているかもしれません。