跳转到主要内容

长出胳膊和腿的缓存提示词前缀

阅读需 2 分钟Tian PanTian Pan

六个月前,你的提示词前缀是 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 里一个依赖一样的问题。它带来什么能力?如果删掉,谁会坏掉?它和周围的字节如何交互?它什么时候过期?

会员专享

余下内容仅对会员开放。

会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。

  • 完整文章,包含未公开存档的部分
  • 可落地的工作框架,附带权衡与决策依据
  • 新文章抢先看,先于公开发布

随时取消 · 一次订阅,畅读全部

参考资料

保持联系,关注我获取更多内容

阅读需 10 分钟

系统提示词提供的人格,模型每次都会以同样的方式选择

当你的系统提示词要求模型在不同人格之间做出选择时,模型的训练先验决定了结果——在实验平台察觉到之前,你的 A/B 测试分支就已经坍缩了。

insider
llm
阅读需 10 分钟

被反向代理剥离的 SSE Keep-Alive,以及你支付了两次费用的 Prompt

LLM 流式响应看起来像是从模型到用户的通畅管道 —— 直到一次 35 秒的工具调用导致反向代理断开连接,你的客户端针对无状态 API 重试整个 Prompt,最终用户的账单为同一个响应支付了两次费用。

insider
ai-engineering
阅读需 9 分钟

主权崩塌:记录你的 Prompt 究竟去了哪里

应用日志显示请求发送到了 eu-west-1,但提供商在故障转移期间将其路由到了美国和新加坡。构建单次请求的主权路径,将审计转化为可查询的资产。

insider
llm
阅读需 9 分钟

FinOps 鸿沟:为什么没有人批准你那 4 万美元的 AI 账单

模型支出通过你的变更管理流程从未审查的代码路径进入生产环境。本文将探讨为什么 Token 成本在审批中是不可见的,以及弥补这一鸿沟的归因、成本分摊(Showback)和支出闸门(Spend-gate)等原语。

insider
finops
阅读需 10 分钟

Token 预留容量:被人们忽略的、尚未从云时代迁移过来的预留实例决策

预置吞吐量和承诺使用折扣让你能像以前预留 EC2 一样预留 LLM 推理资源 —— 但盈亏平衡点比你想象的要高,而且你的承诺可能会因为模型弃用而陷入困境。这里是移植过来的实战手册,以及其中一个危险的变数。

insider
finops