Seven Mental · 心智七篇
← Knowledge Atlas · Concept

Prefix Caching(前缀缓存)

Prefix Caching(前缀缓存):KV cache 复用机制,三大厂商实现对比,静态前缀稳定性原则,harness 设计的首要经济杠杆
CONCEPT · PREFIX CACHING · AGENT COST LEVER · PREFILL REUSE

Prefix Caching

Prefix Caching — reuse KV tensors on a shared prefix, skip the duplicate prefill

Agent loops run a prefill/decode ratio around 100:1; prefix-cache hit rate directly drives cost. Take Claude Sonnet: uncached 3.00/MTok,cachehit3.00/MTok, cache hit 0.30/MTok — a 10× gap. Going from 0 to 80% hit rate can cut per-task API cost roughly 8×.

Cache-friendly harness layout
Static region (globally cached)tool definitions (full set, never changes) · core system prompt · fixed knowledge base
--- DYNAMIC BOUNDARY ---
Dynamic region (not cached)project-specific config · current git state · conversation history (growing)
Three cross-vendor principles
Stable static prefix
put tools/system prompt up front; byte-for-byte identical across requests; nothing dynamic inside
Structural conflict with compaction
summarizing/compressing modifies the conversation prefix → cache miss. Manus’s answer: externalize to the filesystem instead of compacting
Session affinity
Anthropic: implicit backend affinity; OpenAI: prompt_cache_key; Kimi: x-session-affinity header
→ Context Management · Harness Engineering · Context CompressionAnthropic / OpenAI / Kimi (2024)

Prefix Caching(前缀缓存)

定义

Prefix caching(亦称 prompt caching、KV cache reuse)是 LLM 推理服务的一种优化机制:当连续请求共享相同的 prompt 前缀时,服务端复用已计算的 KV(Key-Value)张量,跳过 prefill 阶段的重复计算。

对 agent 系统的意义:agent loop 的 prefill/decode token 比例约为 100:1(远高于对话场景),因此 prefix cache 命中率直接决定运行成本和延迟,是 harness 层最重要的经济杠杆之一。

三大厂商的实现机制

Anthropic:显式断点 + Lookback 窗口

Anthropic 要求开发者在请求中用 cache_control 显式标记缓存断点。系统对每个断点计算累积前缀哈希,在后续请求中向后查找最多 20 个 block 位置,寻找哈希匹配的历史写入。

关键参数:

  • TTL:默认 5 分钟(缓存读取时自动刷新),可选 1 小时扩展 TTL
  • 最小可缓存大小:Claude Sonnet 4.6 = 2,048 token;Sonnet 3.5/4 = 1,024 token;Opus = 4,096 token
  • 定价:写入 1.25× base,读取 0.10× base(命中率越高,节省越多)
  • Lookback 溢出陷阱:若对话增长超过 20 个 block,早期断点会滑出查找窗口,导致 miss。解决方案:在稳定的中间位置添加第二个断点

Cache 层级(失效级联):

tools → system → messages

修改 tools 定义会使三层全部失效;仅修改 messages 只影响 messages 层。工程含义:工具定义应最大化稳定,放在最前面。

自动破坏缓存的操作: 开关 web search、citations、speed mode(使 tools 层失效);更改 tool_choice、添加/移除图片、修改 thinking 参数(使 tools + system 层失效)。

OpenAI:自动路由 + Prefix Hash

OpenAI 的缓存完全自动,无需显式标记。系统对 ≥ 1,024 token 的 prompt 前缀以 128 token 为粒度进行哈希,路由到最近处理过相同前缀的后端机器,直接复用其 GPU 内存中的 KV 张量。

关键参数:

  • 默认 TTL:5–10 分钟不活跃,最长 1 小时
  • 扩展 TTL(prompt_cache_retention: "24h"):gpt-5.x 系列支持,仅存储 KV 张量(ZDR 兼容)
  • 定价:gpt-4o 系列 50% 折扣;gpt-5 nano/5.2 最高 90%+ 折扣;缓存 token 仍计入 TPM
  • Response API vs Chat Completions:Response API 通过 previous_response_id 保留思维链 token,Cache 利用率提升 40–80%;Chat Completions 因推理模型会丢失隐藏 token 而破坏前缀稳定性

prompt_cache_key 参数: 可选字段,偏置路由到共享该 key 的服务器。推荐值为 session ID 或 task ID。每个唯一前缀+key 组合可承受约 15 req/min,超出后分布到其他机器产生 miss。多 agent 系统中,每个 agent/用户应有独立的 prompt_cache_key

自动破坏缓存的操作: 工具/schema 顺序或 key 变更(Go、Swift 等语言随机化 map key,需注意 JSON 序列化顺序);任何前缀内容修改(包括单个 token);在静态内容前插入动态内容;更改推理 effort 参数;context compaction/摘要(截断破坏稳定前缀)。

Moonshot/Kimi:自动缓存 + Session Affinity

Kimi 的前缀缓存完全自动,无需开发者标注。核心基础设施为 Mooncake——一个解耦 prefill/decode 集群、跨 GPU/CPU/DRAM/SSD 多层存储 KV 张量的分布式推理架构,每日处理 100B+ token。

关键参数:

  • 响应的 usage.cached_tokens 字段反映缓存命中数(kimi-k2 代及以上可用)
  • 定价:kimi-k2.5 未缓存 0.60/MTok,缓存命中0.60/MTok,缓存命中 0.15/MTok(75% 折扣)
  • prompt_cache_key 参数:功能同 OpenAI,推荐设为 session ID 或 task ID

x-session-affinity HTTP Header(Kimi 特有): 在基础设施层引导路由,将请求导向同一模型实例,最大化前缀 cache 命中率。这是 Mooncake KVCache-centric 调度器的 API 暴露。Kimi Code Plan 工作流要求设置此 header。

跨厂商的工程统一原则

Manus 的生产经验和 Don’t Break the Cache 论文都指向三个跨厂商共识:

原则一:静态前缀稳定是首要杠杆

工具定义、系统提示、固定文档必须:

  1. 放在 prompt 最前面
  2. 跨所有请求保持逐字节一致
  3. 不包含任何动态内容(时间戳、session ID、用户特定数据)

动态内容必须推到所有断点/缓存内容之后。这是所有厂商和实践者的共同结论。

原则二:Context 压缩与 Caching 结构性对立

Compaction、摘要、动态截断与 prefix 稳定性天然对立:

  • Compaction 修改对话历史前缀 → cache miss
  • 摘要替换了历史内容 → 前缀哈希改变
  • 按步截断 → 每次请求前缀不同

Manus 的解决方案:以文件系统外部化取代 compaction,避免修改 prefix;压缩仅在可恢复(有路径/URL 指针)时进行。 OpenAI Cookbook 建议:粗粒度、低频率截断(如 retention_ratio: 0.7),而非每轮增量剪枝。

原则三:Session Affinity 是基础设施级机制

分布式推理服务中,即使前缀完全相同,若请求路由到不同机器,缓存仍然 miss。Session affinity 的三种实现:

Provider机制
Anthropic确定性排序 + 隐式后端亲和(无显式 API)
OpenAIprompt_cache_key 参数
Moonshot/Kimix-session-affinity HTTP header + prompt_cache_key

Agent Harness 设计的实践含义

监控指标

cache_hit_rate = cache_read_input_tokens / total_input_tokens

目标:> 80%(重复性 agent 任务)。Anthropic 的缓存命中 token 不计入 TPM 速率限制,OpenAI 的仍计入——影响速率限制的规划。

工具定义管理

在 agent loop 中途添加/移除工具的代价远超静态工具集。正确设计:将完整工具集始终包含在 tools 数组中,通过 logit masking 在解码时约束动作空间(Manus 的方案),而非动态修改 tools 数组。

Harness 结构的 Cache 友好布局

[静态区域,全局缓存]
  - 工具定义(完整集合,从不变动)
  - 核心系统提示
  - 固定文档/知识库
  
__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__(或等价边界)

[动态区域,不缓存]
  - 项目特定配置
  - 当前 git 状态
  - 对话历史(growing)

这正是 Claude Code 内部实现通过 __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__ 标记所采用的结构。

经济影响

以 Claude Sonnet 为例:

  • 未缓存:$3.00/MTok
  • 缓存命中:$0.30/MTok
  • 差距:10×

对 agent 任务(prefill/decode = 100:1),从 0% 到 80% 的 cache 命中率可将每任务 API 成本降低约 8×。这不是边际优化,而是量级差距。

Claude Code 的实现案例

Claude Code 源码分析揭示了生产级 prefix caching 工程的具体形态:

  • __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__ 标记:显式边界,将全局缓存区与 session 特定区分开
  • promptCacheBreakDetection.ts:14 向量检测哪些操作会破坏缓存,“sticky latch”防止功能切换无意中触发 cache miss
  • DANGEROUS_uncachedSystemPromptSection():有意识地标记某些必须绕过缓存的 section
  • 子 agent fork-join KV cache:子 agent 共享父 context 的 KV cache,并行化成本接近零

相关概念

References