长出胳膊和腿的缓存提示词前缀
六个月前,你的提示词前缀是 4,000 tokens。它稳定、缓存预热,几乎可以摊销到不计成本——系统指令的每次调用附加费,相比每次响应的成本,只是一个舍入误差。今天那个前缀变成了 11,000 tokens,你的缓存命中率从 92% 滑到了 31%,你的推理账单上升了 4 倍。团队里没有人能指出是哪个 PR 干的。没有一条 commit message 写着"将提示词增加 7,000 tokens"。每一次修改都很小,每一次修改都有理有据,每一次修改都干干净净地合入了。
提示词前缀长出胳膊和腿,就像地下室积攒纸箱一样。一个团队需要注入用户的订阅等级,这样 agent 才能解释套餐限制。另一个团队需要用户时区的今天日期,这样"明天提醒我"才能工作。第三个团队把当前 A/B 变体名硬塞进去,这样 eval traces 才能切片。市场团队加进了当前促销 banner,这样 agent 才能适时提及它。合规团队加进了功能标志清单,这样模型才能拒绝那些不在灰度名单里的用户访问 beta 功能。每一条都是一行的添加。每一条单独看都站得住脚。但加起来摧毁了你的缓存。
这是新一代的依赖地狱。它无声地复合,躲过代码评审,只在你的 CFO 不看的那条 预算线超过某个阈值时才浮出水面。你的团队为其他回归形式建立的防御——类型检查、CI、eval gates——都不会看这个层面。那个在系统提示里加了一行的 PR 没有改变一个测试。它没有翻动一个基准。它改变了之后每一次请求的可缓存性,而那次改动的成本被每个用户、永远地、每次一个 token 地支付,直到有人把那行代码再拽出来。
为什么前缀是一个没有主人的共享资源
系统提示在代码库里处在一个尴尬的位置。它技术上只是一个配置文件里的字符串,但功能上它是一个共享的 API 表面。每个发布 AI 功能的产品团队都有理由往里加东西。PM 想让 agent 知道当前的促销活动。增长团队想让 agent 推荐升级路径。客服想让 agent 永不提到已下线的功能。法务想要免责声明段落。提示词就是所有这些需求最后落地的地方,因为提示词是唯一所有人一致同意"模型会看到这条约束"的地方。
问题在于这个提示词没有维护者。仓库里其他每一个共享资源都有 owner。Dockerfile 有人负责让构建保持精简。CI 配置有人负责调成本。package.json 有一位 steward 顶住添加依赖的压力。系统提示没有对应的人。第一个写它的工程师已经换团队了。on-call 轮值不包括它。当一个新团队需要加一行时,他们找到这个文件,加上那行,合并。没有针对提示词前缀膨胀的评审,因为没有任何评审者被告知那是他们的工作。
这就在 token 空间里造就了一场公地悲剧。每一个出资团队都在理性地优化自己的功能;没人看得见自己添加内容的总成本。成本是真实的,但分散。收益是集中且可见的——功能跑起来了,demo 落地了,PR 合入了。工程经济学 101 已经预测了结果。公地崩塌,账单在一个季度后到来,应对的是一场恐慌式的优化冲刺,而不是本可以预防它的常态化所有权。
究竟是什么杀死了缓存命中率
各大供应商的提示词缓存共享一个结构性假设:它们以前缀的字节、按顺序、直到第一个分歧的 token 为 key。Anthropic 要求显式的 cache_control 标记,并把缓存当作严格前缀匹配。OpenAI 在 1,024-token 阈值之上自动应用缓存,但底层用同样的精确前缀机制。Google 的实现细节有别,但精神不变。这三家的缓存被杀死,不是被提示词深处的内容变化,而是被任何发生在可缓存边界之前的改动。
这就是动态注入模式如此致命的原因。当一个团队在系统提示的第 47 行写下 "今天是 {date}" 时,他们并没有添加 11 tokens 的膨胀。他们添加了 11 tokens 的膨胀,并使其后前缀中的每一个字节失效。缓存从位置 0 开始往前读,在第一个不匹配的字节处停下。在位置 47 注入一个每请求变化的值,那么位置 48 到 11,000 现在都是缓存冷态,无论它们单独看多么稳定。
工程师们靠惨痛的代价学到这一点。第一个迹象通常是一个跟功能发布对不上号的成本峰值。延迟和成本同步上升,因为模型正在处理它过去从缓存内存里读的 tokens。eval 分数没动,因为提示词内容仍然正确;只是缓存 key 不 再匹配。等团队搞清楚发生了什么,账单已经累积了一个计费周期,加日期注入那行的工程师已经在另一个 sprint 里捍卫另一个优先级了。
按字节的所有权台账
能守住底线的模式是把提示词前缀当作一个共享依赖清单。前缀里的每一个字节都有 owner、引入日期和依赖关系。当一个团队请求添加内容时,这个请求要面对跟 package.json 里一个依赖一样的问题。它带来什么能力?如果删掉,谁会坏掉?它和周围的字节如何交互?它什么时候过期?
- https://genta.dev/resources/prompt-caching-llm-guide
- https://introl.com/blog/prompt-caching-infrastructure-llm-cost-latency-reduction-guide-2025
- https://projectdiscovery.io/blog/how-we-cut-llm-cost-with-prompt-caching
- https://www.prompthub.us/blog/prompt-caching-with-openai-anthropic-and-google-models
- https://www.digitalocean.com/blog/prompt-caching-with-digital-ocean
- https://spring.io/blog/2025/10/27/spring-ai-anthropic-prompt-caching-blog/
- https://inference.net/content/llm-observability-monitoring-production-deployments/
- https://bentoml.com/llm/inference-optimization/prefix-caching
