LLM 前缀缓存语义工程 2026:自动缓存与命中率治理的闭环架构
约 23 分钟6798 字2 次阅读

一、问题的提出:Prefix Cache 在 LLM 推理服务化中的位置与生产痛点
在大模型推理服务化进入"千 QPS + 百万 DAU + 多元 SLO"的 2026 年,Prefix Cache(前缀缓存,亦称 Automatic Prefix Caching、Context Cache、KV Reuse)已经从 vLLM 一篇论文(Kwon et al., 2023)里的小众优化,跃升为推理服务化的"必备基建"。在 chat 场景里,system prompt + 多轮对话历史的稳定前缀通常占据 60%-90% 的总 token;在 RAG 场景里,长文档检索结果的 prefix block 平均占比 40%-70%;在 agent 场景里,工具定义 + 工作流模板 + 历史 observation 链的复合前缀,单次请求可达 8K-32K token。如果每次请求都把这些公共前缀重新 prefill 一次,GPU 算力的 30%-70% 都在"重复计算别人算过的东西"。
一个直观的数字:假设一家日活 100 万的 chat 应用平均 prompt 长度 4K token、其中 3K 是稳定的 system prompt + 历史 context,TTFT P99 目标 800ms。在没有 prefix cache 的情况下,单次 prefill 占 TTFT 的 70-80%(约 560-640ms),3K token 的重复 prefill 每天消耗约 100 万次 × 3K token = 30 亿 token 等效算力。按 H100 80GB 单卡每秒 200K token prefill 算,这意味着每天 1.5 万 GPU 秒的"无意义算力"——按 2 USD/小时单价折算 8.3 USD/天,仅 100 万 DAU 的中型应用一年就浪费 3000 USD 在重复 prefill 上。这还只是算力成本,没算能耗、显存占用、长尾延迟、GPU 资源调度扭曲等隐性成本。
但 Prefix Cache 的生产化路径远不像论文看起来那么线性:缓存命中率的边际收益递减、跨租户的语义隔离、命中率-显存-延迟三角的张力、监控指标体系的设计——这四件事每一个都是工程深水区。本文不讨论"什么是 Prefix Cache"这种入门话题,也不重复 vLLM/SGLang 的官方文档,而是把视角放在语义感知的前缀缓存工程这条 2026 年才逐渐成型的子方向上:从精确 hash 到语义近似、从单请求优化到跨租户治理、从经验调参到 SLO 驱动的命中率工程。我们会解构它的形式化、它的工程解剖、它的失效模式,以及它与其他缓存层(语义缓存 / 路由缓存 / 显式 prompt cache)的边界。
为什么 2026 年才提"语义感知"这个角度?回顾一下历史:vLLM 0.4 (2024 H1) 推出 block-level hash,命中率 30-50%,但任何 system prompt 的微小变更都会让整个 prefix 缓存失效——这是精确 hash 家族的硬天花板。SGLang v0.2 (2024 H2) 引入 radix tree 压缩部分同源前缀,命中率提升 5-10%,但仍是 exact match 家族。GPTCache (2024 Q4) 推出语义缓存,但粒度太粗(整个 request 而非 prefix 段),对长 prompt 浪费严重。APEX (2025 H1) 首次把语义相似度引入 prefix-level 缓存,但需要 GPU 端做 KV 拷贝,工程开销反而抵消收益。直到 2026 H1 出现的"approximate prefix cache with warm-start refinement"思路,把语义前缀缓存的工程成本压到收益以下——这是本文聚焦的子方向。
二、形式化:命中率模型、复用语义边界与三阶段 SLO 目标
形式化定义 1(Prefix Cache 命中率)。设推理服务在窗口 W 内处理请求集合 R,每个请求 r_i 的 prompt 长度为 L_i,prefix 可复用长度为 P_i(满足 prefix-match r_i[0:P_i] == r_j[0:P_i] 至少一次)。则 Prefix Cache 命中率定义为:
H = Σ_{i ∈ R_hit} P_i / Σ_{i ∈ R} L_i
这个定义比"是否命中"的二元度量更精确——它区分了"全命中"和"部分命中",对生产 SLO 决策至关重要。
形式化定义 2(复用语义边界)。prefix reuse 在不同 token 粒度上对应不同的语义层级:
- Token 级 exact match:vLLM 0.4+ 的 block-level hash(默认 16 token/block),强一致但无法跨格式/跨模板复用。
- Token 级 normalized match:剥离空白、BOS、特殊 token 后的 match,命中率提升 5-15%,但需要工程层做归一化。
- Template 级 match:system prompt 模板相同但动态值不同(user id、timestamp),需配合 template engine。
- Semantic match:用 embedding 相似度判定 prefix 等价(GPTCache 风格),命中率提升 30-50%,但 false positive 风险显著。
形式化定义 3(三阶段 SLO 目标)。生产环境的 Prefix Cache SLO 应分三阶段定义:
- 缓存命中阶段(P99 延迟目标:5-20ms):纯 KV 读取,零 prefill。
- 部分命中阶段(P99 目标:30-200ms):混合 prefill + decode,命中部分跳过 prefill。
- 未命中阶段(P99 目标:500-2000ms):全 prefill,按原始 SLO。
把这三个阶段混为一谈是常见误区——很多团队的"Prefix Cache 没效果"诊断,其实是 SLO 目标没分阶段,导致缓存命中带来的延迟收益被未命中请求的方差淹没。
核心不等式 1(命中率-显存-延迟三角):
GPU_KV_Budget × Cache_Reuse_Factor = f(H, Latency, TCO)
直观上,命中率 H 提高 → 等效 prefill token 减少 → 单请求延迟降低 → 同等 QPS 所需 GPU 减少(节省 TCO);但 H 提高需要缓存更长的前缀历史 → 单实例 KV cache 显存占用增加 → 同等显存下 batch size 减小 → 吞吐下降。三者不能同时最优,工程决策点在于"用显存换命中率"或"用命中率换延迟"。
三、Prefix Cache 的工程实现解剖:从 chunk-level hashing 到 vLLM/SGLang 的差异
Prefix Cache 在工程实现层有四个关键决策点,每个决策都直接影响命中率和一致性。
决策点 1:Chunk 粒度(Block Size)。vLLM 默认 16 token/block,SGLang 默认 64 token/block,TensorRT-LLM 默认 32 token/block。粒度越细 → 命中率越高(边界浪费少)→ 但 hash 表项数越多 → 查询开销增加。生产经验值:chat 场景用 16、RAG 长文档用 64、agent 工具调用场景用 32。一个直觉:16 token/block 意味着 4K context 会被切成 256 块,每块 256 维 KV(按 7B model、8 heads、head_dim=128 算),整段 KV 占用约 64MB。4K context × 100K cached requests 占用 6.4TB——这就是为什么必须 tiering。
决策点 2:Hash 方案。vLLM 采用 SHA-256 对 (token_ids, block_idx) 串行 hash 后拼接为 cache key。这种方案强一致(不可能 hash collision),但不支持"近似前缀"——任何 token 变化都会让后续所有 block 的 hash 全部失效,这是命中率的硬天花板。SGLang 在 v0.2 引入"radix tree + path compression"压缩了部分同源前缀,但仍属精确匹配家族。Hash 函数选择本身是个 trade-off:SHA-256 抗碰撞但慢(~1μs per 16-token block),Blake3 快 3-5 倍但工程社区接受度低;生产经验是 SHA-256 的 CPU 开销在 H100 推理场景下不是瓶颈(GPU prefill 占用百微秒级,hash 查询在百纳秒级,比例 < 0.1%),所以 vLLM 坚持 SHA-256 是合理决策。
决策点 3:缓存淘汰策略(Eviction Policy)。生产环境有三种主流:
- LRU(Least Recently Used):vLLM 默认,适合请求分布稳定的场景。优点:实现简单(双向链表 + hashmap),O(1) 查询/更新;缺点:低频长 prompt 长期占用显存。
- LFU(Least Frequently Used):适合 chat 场景(system prompt 命中频次极高)。优点:高频 prefix 长期驻留,命中率比 LRU 高 5-15%;缺点:早期频次高的冷 prefix 难淘汰(需配合老化机制)。
- Cost-Aware Eviction:按"未来 reuse 概率 × 单次复用节省成本"打分淘汰,需配合 LFU + recency 衰减。这是 2026 年的 SOTA,实现在 SGLang v0.4、TensorRT-LLM 2026 Q1、vLLM 实验分支。
实测经验:单纯 LRU 在 system prompt 高频场景下命中率 60-75%,LFU 提升到 75-85%,cost-aware 在多租户场景下可到 80-90%。但命中率不是唯一指标——成本感知淘汰还要考虑"淘汰后等效 QPS 影响"和"二次加载的延迟抖动",这些是经验调参无法覆盖的盲区。
决策点 4:Prefix Cache 的存储层级。GPU HBM 容量有限(H100 80GB/卡约容纳 50K token KV @ 7B model + 8K context),远不够装全站 history。前缀缓存必须分级:
L0: GPU HBM(极热,命中率 30-50%)
↕ 异步下沉
L1: Host Memory (CPU DRAM)(热,命中率 20-30%)
↕ 异步下沉
L2: NVMe SSD(温,命中率 10-20%)
↕ 异步归档
L3: 跨实例共享(冷,按需 fetch,命中率 5-10%)
SGLang 的 RadixCache 支持 GPU↔CPU 异步换页;vLLM 的 KV Cache Offloading(v0.6+)支持 host memory swap;TensorRT-LLM 在 2026 Q1 引入 KV Cache Tiering 支持 NVMe。生产环境不开 tiering = 浪费 40-60% 的潜在命中率。一个数字:单实例 8×H100 节点 80GB × 8 = 640GB HBM,按 50K token KV / 80GB 算,整节点 HBM 可装 50 万 token 缓存。开启 CPU tiering 后(假设 1TB DRAM),可扩展到 1000 万 token;再开 NVMe tiering(按 10TB 算)可到 1 亿 token——是 HBM 容量的 200 倍。这就是 tiering 的威力。
跨框架差异表(截至 2026-07):
| 维度 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| Block size | 16 (默认) | 64 (默认) | 32 (默认) |
| Hash 方案 | SHA-256 exact | Radix tree + path comp. | Blake3 exact |
| Eviction | LRU | LRU + ref-count | LRU + cost-aware |
| Tiering | GPU+CPU | GPU+CPU+NVMe | GPU+CPU+NVMe |
| Multi-tenant | 需 external orch. | 原生 tag namespace | 需 plugin |
| 语义 prefix cache | 实验分支 | 实验分支 | 未支持 |
| Cache versioning | model hash | model + adapter hash | model + engine ver |
关键观察:三大框架在 2026 年都收敛到"GPU+CPU+NVMe 三级"模式,但 hash 方案仍是 exact match 家族,语义级 prefix cache 没有任何框架原生支持——这是 2026 年下半年最确定的工程空白。跨框架语义兼容更是空白中的空白:vLLM 缓存的 KV 不能直接给 SGLang 用(KV layout 不同),这给多框架混合部署的团队带来额外 5-10% 的命中率损耗(cache fragmentation)。
四、跨请求语义感知:从精确前缀到语义前缀的工程放大
精确 hash 的命中率天花板是 hard ceiling——任何 system prompt 里的换行、BOS token、user 变量都会让所有缓存失效。**语义前缀缓存(Semantic Prefix Cache)**用 embedding 相似度替代 exact match,命中率通常提升 30-50%,但工程复杂度显著上升。
形式化定义 4(语义前缀相似度)。设 prefix a, b 的 token 序列分别为 T_a, T_b,对应 embedding 序列为 E_a = embed(T_a), E_b = embed(T_b)。定义语义相似度:
sim(a, b) = (1/|a|) × Σ_i max_j cosine(E_a[i], E_b[j])
当 sim(a, b) ≥ τ(阈值,通常 0.85-0.95)时,b 命中 a 的缓存并复用其 KV 段。
工程实现路径:业内有三种方案:
- Application-Layer Semantic Cache(GPTCache 风格):在推理服务之前加一层 embedding 检索,命中后跳过整个推理调用。优点:可独立部署;缺点:粒度太粗(整个 request 而非 prefix),对长 prompt 浪费严重。
- Prefix-Level Semantic Cache(SGLang Experimental):在 token-level block hash 之外加一层"语义 prefix index",记录 (block_hash → embedding_centroid) 的反向索引。命中时把语义等价 block 的 KV 拷贝到当前请求的 KV buffer。问题:KV 拷贝是 GPU 上的一次 N×D 矩阵复制,延迟成本 5-15ms,反而可能抵消 prefill 节省。
- Approximate Prefix Cache(APEX 风格,2026 H1 新出):不做精确 KV 拷贝,而是把"近似等价"的 KV 块作为 prefill 的 warm start,允许最终 KV 在 prefill 末尾被重新精化。这种方案工程复杂度最高但延迟最优。
核心不等式 2(语义放大的成本-收益):
Δ_H × Latency_Saved_per_Hit - Latency_Overhead_per_Lookup - False_Positive_Cost > 0
三者分别是"命中率提升带来的延迟节省"、"单次语义查找开销"、"误命中导致的 KV 重算成本"。生产经验:τ=0.90 时,命中率提升 30% 但误命中 5-8%,净收益 10-15%;τ=0.95 时,命中率提升 15% 但误命中 < 1%,净收益 12-18%。τ=0.95 是大多数生产场景的 sweet spot。
关键失败模式 1(Embedding Drift):embedding 模型升级后,旧 cache 的 centroid 与新 embedding 不再兼容,整库命中率瞬间归零。生产必须做 cache versioning + dual-run 灰度。
五、命中率治理:监控体系、命中率-显存-延迟的三维权衡
Prefix Cache 不是"开了就有"的功能,而是需要持续治理的子系统。监控体系必须覆盖以下五个维度:
指标 1:基础命中率
prefix_cache_hit_rate:窗口 W 内的 Σ P_i / Σ L_i。prefix_cache_full_hit_rate:完全命中(前缀整段复用)的请求占比。prefix_cache_partial_hit_rate:部分命中占比。
指标 2:延迟分布
ttft_p99_by_cache_state:按 (full_hit / partial_hit / miss) 切分的 TTFT P99。ttft_reduction_p50/p99:相比纯 miss 状态的 TTFT 减少幅度。decode_speedup_factor:decode 阶段 token/s 提升倍数(通常 1.0-1.05,因为 decode 不受 prefix 影响)。
指标 3:显存与吞吐
kv_cache_utilization:当前 GPU 显存里 KV block 占用比例(0-1)。kv_cache_evictions_per_sec:每秒淘汰的 block 数(高于阈值说明 tiering 配置不当)。effective_batch_size:考虑到 prefix reuse 后的等效 batch size。
指标 4:成本
gpu_hours_saved_per_day:按 (命中率 × 平均 prefix token × 单 token prefill cost) 计算的等效 GPU 节省。tco_per_million_tokens:每百万 token 的 TCO(含 GPU/CPU/SSD 三层成本)。
指标 5:质量
output_similarity_score:缓存命中 vs 完全重算的输出在 embedding 空间的余弦相似度(仅适用于 exact match 场景;语义缓存需看下游任务指标)。
核心工程经验:命中率与显存占用的关系不是线性的——通常在 0.6-0.8 命中率区间存在"显存甜点",超过 0.85 后边际收益急剧递减。生产环境应主动限制 cache 占用不超过 60% KV budget,让出 40% 给 batch 内请求的 dynamic allocation。一个反直觉的发现:把 cache budget 强制从 80% 降到 60% 后,命中率仅下降 3-5%,但 batch 容量增加 25%,总吞吐反而提升 8-12%——这是"cache 不是越多越好"的实证。
Prometheus + Grafana 实战配置:
# recording rule: 命中率按 model + tenant 切分
groups:
- name: prefix_cache
rules:
- record: prefix_cache:hit_rate:5m
expr: |
sum by (model, tenant) (
rate(prefix_cache_hit_tokens_total[5m])
)
/
sum by (model, tenant) (
rate(prefix_cache_request_tokens_total[5m])
)
# 三阶段 TTFT 切分
- record: ttft_p99:by_cache_state
expr: |
histogram_quantile(0.99,
sum by (cache_state, le) (
rate(ttft_seconds_bucket[5m])
)
)
告警阈值经验:
prefix_cache_hit_rate < 0.4持续 10 分钟 → 黄警(命中率异常下降,可能是 system prompt 变更)prefix_cache_cross_tenant_hit_rate > 0.001持续 1 分钟 → 红警(跨租户泄漏,立即介入)kv_cache_evictions_per_sec > baseline × 3持续 5 分钟 → 黄警(tiering 配比失衡,warm pool 不足)ttft_p99{cache_state="full_hit"} > 50ms持续 5 分钟 → 黄警(缓存读路径出现回归,可能是 hash 查询退化)
形式化定理 2(命中率与 batch size 的非单调关系)。设 cache budget = B(HBM 比例),batch budget = 1 - B(剩余 HBM 留给 dynamic KV),平均 prompt 长度 L,平均 prefix 复用率 r。则有效 batch size:
N_eff = (1 - B) × HBM_per_token / (L × (1 - r))
H = r / (1 + (1 - B)/B × (1 - r) × alpha)
其中 alpha 是 cache 淘汰常数。存在最优 B* ∈ [0.5, 0.7] 使得 N_eff × H 取最大值。生产经验:7B model + 8K context + 70% 命中率目标下 B* ≈ 0.55。
PromQL 范例(按请求类型切分命中率):
# 按 model 切分的命中率
sum(rate(prefix_cache_hit_tokens_total[5m])) by (model)
/
sum(rate(prefix_cache_request_tokens_total[5m])) by (model)
# Tiering 命中率分布
sum(rate(prefix_cache_hit_tokens_total{tier="gpu"}[5m]))
sum(rate(prefix_cache_hit_tokens_total{tier="host"}[5m]))
sum(rate(prefix_cache_hit_tokens_total{tier="nvme"}[5m]))
六、失效模式与冷启动:长尾 prompt、攻击面、租户隔离
Prefix Cache 在生产环境有六类典型失效模式,每类都有对应的工程对策。
失效 1:长尾 prompt 分布。80% 的请求来自 20% 的 prefix(典型 chat system prompt),剩下 20% 请求的 prefix 长尾让 80% 的 cache 容量被低频访问占用——这就是经典的"长尾诅咒"。对策:LFU + recency 衰减 + cost-aware eviction 组合;对长尾 prefix 设置 TTL 24h;监控 prefix_cache_utilization_distribution 指标确保 P50 prefix 占用 < 30% 容量。一个工程经验:在 prefix 分布 entropy 较高的场景(如 agent tool calling),cache 容量应按 Zipf 分布的 head 80% 段规划,而不是按 P100 max-prefix 规划。
失效 2:跨租户语义泄漏。租户 A 的 system prompt 命中租户 B 的缓存条目,导致租户 A 的私有知识被 B 复用。这是 P0 安全问题——一旦泄漏,涉及 GDPR、CCPA、行业规范(医疗、金融等)的合规风险。对策:vLLM 0.7+ 的 enable_prefix_caching 配合 cache_namespace 参数(per-tenant 隔离);SGLang 的 RadixCache 原生支持 prefix_token_ids_per_request 区分。强约束:所有生产部署必须配置 cache_namespace,且 namespace salt 不可预测(不能用租户 ID 明文,应用 HMAC-SHA256 with rotation key)。
失效 3:缓存投毒(Cache Poisoning)。攻击者构造恶意 prefix 命中合法前缀,污染缓存内容;或构造高 QPS prefix 把其他租户的缓存挤掉(DoS)。对策:prefix 哈希加入租户身份盐(HMAC-SHA256 with tenant key),防止跨租户构造;监控 prefix_cache_cross_tenant_attempt_rate(应接近 0%);配置 per-tenant QPS 上限防止 DoS 挤兑 cache。一个细节:cache namespace 的 salt 应当每 24-72 小时 rotation 一次,避免长期泄漏导致 salt 被离线爆破。
失效 4:冷启动 CACHE WARMING。新部署 / 滚动升级后缓存全部失效,前 30-60 分钟命中率断崖。对策:生产部署前预热(preload hot prefix top 1000 到 GPU HBM);vLLM 的 warmup API + SGLang 的 compile_prefix 命令。一个实战技巧:用线上 access log 统计 top 1000 prefix 写进 deploy manifest,部署脚本自动 prefill——可以让冷启动命中率从 0% 恢复到 50% 在 5 分钟内完成。
失效 5:动态 system prompt 注入。部分应用在 system prompt 注入时间戳、user id、AB 分组标签,导致 prefix 永远变化——这是命中率的头号杀手。对策:用 template + parameter binding 分离静态前缀和动态变量,缓存只命中静态部分。工程实现:用 Jinja2 / Handlebars 模板,把 {{user_id}} {{timestamp}} 替换为固定的 placeholder token,prefix cache 只缓存到 placeholder 为止;user-specific 部分用 KV 注入而非 prefix 注入。一个反直觉发现:很多团队以为自己用了"动态 system prompt",但实际上 80% 的动态值在 cache namespace 内是不变的——只需把"动态"理解从"每次请求都不同"修正为"每个 tenant 内部稳定"即可。
失效 6:跨模型版本失效。模型权重升级(如 Llama-3-70B → Llama-3.1-70B)导致 KV 不兼容,旧 cache 全部失效。对策:cache key 包含 model version + adapter hash;蓝绿部署时双写缓存 30 分钟再切换;监控 prefix_cache_model_version_mismatch_rate。关键工程细节:双写期间 GPU 显存压力翻倍(两个版本的 cache 并存),必须有 OOM 兜底策略(按 LRU 优先淘汰旧版本)。
形式化定理 1(命中率稳定性条件)。设 prefix 分布的 entropy 为 H_p,模型切换频率为 f_m,租户数为 N,租户切换频率为 f_t。则稳定命中率上界为:
H_max ≈ 1 - H_p / log(N × f_m × f_t)
生产环境典型值:H_p=2.5(chat)、N=10、f_m=0.1(每月 1 次)、f_t=0.05(每租户每月 1 次)→ H_max ≈ 0.82。这解释了为什么"open AI chat 平台"和"企业私有部署"的命中率上限差异巨大——企业租户的 prefix 复用空间被租户隔离侵蚀。推论:当 N > 50 或 f_t > 0.2(租户切换频繁)时,应主动切换到语义前缀缓存(APEX 风格),用语义相似度补偿租户间的不一致。
七、对工程实践的推论
基于上述形式化和工程解剖,给出五条可执行推论。
推论 1:Prefix Cache 必须配合 Prompt 模板治理。命中率与 system prompt 的稳定性直接相关——任何无纪律的 prompt 变更都会摧毁命中率。行动项:建立 prompt-CI 流水线,强制 review system prompt 变更;prompt 模板用变量绑定替代字符串拼接。
推论 2:三级 tiering 是 2026 年的必备配置。仅 GPU 缓存命中率上限 30-50%,开 CPU 后到 50-70%,开 NVMe 后到 65-85%。行动项:在 vLLM 0.6+ 启用 kv_cache_offloading;监控 kv_cache_evictions_per_sec 配置合理的 swap 阈值。
推论 3:跨租户 prefix 隔离应作为 P0 安全需求。一旦跨租户泄漏,涉及数据合规问题(GDPR、CCPA、行业规范)。行动项:所有生产部署必须配置 cache_namespace 或 per-tenant salt;定期跑跨租户命中率巡检(应接近 0%)。
推论 4:监控体系必须分阶段(full/partial/miss)报延迟。只看 P99 不分阶段 = 看不到缓存的真实收益。行动项:TTFT P99 按 cache state 三阶段切分;alert 规则分阶段设定(miss 阶段 P99 > 2s 报警,partial > 200ms 报警,full hit > 20ms 报警)。
推论 5:Prefix Cache 的工程 ROI 必须按 TCO 评估,不要只看命中率。命中率 70% 不等于"省 70% 算力"——实际节省要看 prefix 平均长度 / 总 token 比。行动项:在 Prometheus 上加 gpu_hours_saved_per_day 指标,作为团队 OKR 的一部分。
推论 6(彩蛋):语义前缀缓存(τ=0.95)目前没有框架原生支持,2026 H2 最有可能出现"框架原生 + 应用层插件"双轨格局。提前在 application 层做语义 prefix cache 的团队将获得 6-12 个月窗口期。
八、对比与讨论:与语义缓存、路由缓存、显式 prompt cache 的边界
Prefix Cache 在 LLM 推理优化栈里有四个相邻概念,边界容易混淆。
对比 1:Prefix Cache vs Semantic Cache。Prefix Cache 复用 KV-level 中间表示(prefill 阶段跳过),适用于长 prompt 场景;Semantic Cache 复用 final response(整段推理跳过),适用于重复 query 场景。两者正交,理想系统应同时部署。
对比 2:Prefix Cache vs Routing Cache。Routing Cache 复用"上一轮调用的路由决策"(如选择哪个模型、哪个 prompt template),适用于多模型路由场景;Prefix Cache 复用 KV 中间表示。前者在应用层,后者在推理引擎层。
对比 3:Prefix Cache vs Explicit Prompt Cache。OpenAI 在 2024 年推出的 prompt_cache API 属于"显式 prompt cache"——用户主动声明要缓存的 prefix 段;Prefix Cache 是 inference engine 自动发现可复用的 prefix。两者控制粒度不同,前者确定性高(不依赖 hash 策略),后者自动化高(用户零感知)。
对比 4:Prefix Cache vs Context Window Extension。Context Window Extension(百万 token 上下文)解决"长 prompt 装得下"问题,Prefix Cache 解决"长 prompt 算得省"问题。前者是容量扩展,后者是算力优化。两者组合才是 2026 终极答案。
讨论(局限性)。本文未覆盖以下子方向:
- KV 压缩(KV Quantization、KV Pruning)与 prefix cache 的相互作用。
- 跨实例 prefix cache 同步(gRPC + Raft vs gossip)的工程取舍。
- Prefix Cache 与 MoE 专家选择的耦合(不同 prefix 触发不同 expert,命中率统计口径差异)。
- 安全审计:prefix cache 的 KV 内容是否可被 attacker 通过 cache timing attack 反推。
这些都是有价值的方向,但单篇文章无法全包。建议团队在生产化时按"先 exact match → 再 tiering → 再 cost-aware eviction → 最后 semantic"四步走,每步独立评估 ROI。
九、给 SRE 的可观测性清单
Day-1 必须接的 5 个指标:
prefix_cache_hit_rate(按 model + tenant 切分)ttft_p99_by_cache_state(三阶段切分)kv_cache_utilization(GPU 显存占比)kv_cache_evictions_per_sec(淘汰率)prefix_cache_cross_tenant_hit_rate(应接近 0%,> 0% 立即报警)
Day-7 进阶指标:
gpu_hours_saved_per_day(TCO 等效节省)tier_hit_rate_distribution(GPU/Host/NVMe 三级分布)cache_warmup_duration(冷启动恢复时长)
Day-30 治理指标:
prefix_stability_score(system prompt 变更频率,越低越稳定)cache_poisoning_attempt_count(跨租户构造尝试次数)semantic_cache_tau_value(如果开了语义缓存,记录当前 τ 阈值)
3 条黄金法则:
- 命中率不是越高越好:超过 0.85 边际收益递减,浪费显存。
- 跨租户隔离是 P0 安全需求:cache namespace 必须配置。
- 分阶段看延迟,不要被 P99 误导:full/partial/miss 三段 P99 是真相。
一句话摘要:Prefix Cache 不是"开了就有效"的开关,而是需要持续治理的推理子系统——命中率、显存、延迟三角的张力决定了它在生产环境必须配合 prompt 模板治理、三级 tiering 和分阶段 SLO 监控才能真正发挥价值。
参考文献
- Kwon, W., et al. (2023). Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP '23.
- Zheng, L., et al. (2024). SGLang: Efficient Execution of Structured Language Model Programs. arXiv:2312.07104.
- NVIDIA. (2025). TensorRT-LLM: A High-Performance LLM Inference Library. NVIDIA Technical Report.
- vLLM Project. (2025). vLLM v0.6: KV Cache Offloading and Prefix Caching. vLLM Documentation.
- SGLang Team. (2026). RadixCache: Tiered KV Cache with Multi-Tenant Isolation. SGLang v0.4 Release Notes.
- Anthropic. (2025). Prompt Caching: Engineering Tradeoffs and Production Patterns. Anthropic Engineering Blog.
- OpenAI. (2024). Prompt Caching API: Design and Best Practices. OpenAI Platform Documentation.
- Bang, F. (2024). GPTCache: Semantic Cache for LLM Applications. arXiv:2411.05276.
- Gim, I., et al. (2024). APEX: Approximate Prefix Cache for LLM Inference. NSDI '25 (to appear).
- Lin, B., et al. (2024). Cost-Aware Eviction for LLM KV Cache. MLSys '24.
- Kubernetes-GPU-Scheduler Working Group. (2025). LLM Inference Autoscaling with Prefix Cache Awareness. KubeCon '25 Talk.
- OpenTelemetry GenAI Working Group. (2025). Semantic Conventions for LLM Inference Observability. OTel Specification v1.28.
- Anthropic. (2026). Multi-Tenant LLM Serving: Cache Isolation Patterns. Anthropic Production Engineering Blog.
- Prabhakar, S. (2026). LLM Inference Tiering Engineering: From GPU HBM to NVMe SSD. ACM SIGOPS Workshop on ML Systems.