跳到主要内容

10 篇博文 含有标签「prompt-caching」

查看所有标签

当源数据已更改,你的 Prompt 缓存仍在提供旧的工具执行结果

· 阅读需 11 分钟
Tian Pan
Software Engineer

一名支持代理在 14:02 查询了客户的订阅状态,发现其处于激活状态,该回答进入了 Prompt 前缀中,而缓存层刚刚将其标记为上下文的可重用部分。在 14:14,计费系统取消了该订阅。在 14:19,同一位客户提出了跟进问题,由于对话前缀仍然匹配,缓存的前缀被重用,代理愉快地告诉客户他们的计划处于激活状态,并主动引导他们使用一个他们已不再拥有访问权限的功能。下游系统是正确的。模型与上下文保持了一致。但用户被缓存命中(Cache Hit)欺骗了。

这是 Prompt 缓存为原本对数据陈旧度(Staleness)保持诚实的系统引入的失效模式。在引入缓存之前,工具调用是对单一事实源(Source of Truth)的请求,并遵循该源所声明的任何新鲜度契约。有了缓存之后,工具结果变成了 Prompt 前缀的一个租户,而前缀拥有自己的 TTL(生存时间),由模型提供商控制,团队中没有人明确选择启用它。

被你的个性化层悄悄杀掉的 Prompt 缓存

· 阅读需 12 分钟
Tian Pan
Software Engineer

产品团队发布了个性化功能。智能体(Agent)现在会直呼用户姓名,根据用户的偏好调整回答长度,了解用户在医疗行业工作,并尊重用户在提及日期时所处的时区。用户满意度的提升是真实且可衡量的——A/B 测试显示点赞率提升了四个百分点,随后功能全量上线。三周后,财务部门指出推理成本大约翻了三倍,而 AI 团队中没人能立即解释原因。

解释就在系统提示词(System Prompt)构建器中一行被埋没的代码修改里。每个用户的上下文——姓名、偏好的回答长度、行业、时区——都被添加到了系统提示词的开头,以便模型在每一轮对话中都能看到。这使得从第一个 Token 开始,每个用户的 Prompt 都是独一无二的。你的供应商提供的 Prompt 缓存——原本能以标准价格的十分之一服务大约 90% 的输入 Token——失效了。延迟几乎没有波动,所以性能仪表盘(Performance Dashboard)依然显示绿色。直到月底,计费仪表盘才反映出这一情况。

悄无声息击穿提示缓存的那次模型迁移

· 阅读需 11 分钟
Tian Pan
Software Engineer

迁移看上去很干净。评估已经针对新模型版本重新校准。Judge 提示词重新调校过。两周的影子流量显示行为对齐在容差范围内。p50 和 p99 延迟都在预算之内。周四下午的上线评审签字通过,团队各回各家。

到了周五早上,推理账单是平时的 3 倍。评估分数依旧没问题。延迟依旧没问题。上线评审上没有人想到要对缓存命中率做埋点,因为前缀根本没变 —— 系统提示词逐字节相同,工具定义逐字节相同,对话框架逐字节相同。变的是请求体里的模型版本,而供应商的前缀缓存键是 (前缀字节 + 模型版本)。切换之后的每一个请求都打到了一个冷缓存上。预热曲线靠自然流量花了六周才恢复,在此期间团队为每个请求的每一个 token 都支付了完整的未命中价格。

Prompt Caching 的隐形代价:当缓存命中提供错误的用户上下文时

· 阅读需 13 分钟
Tian Pan
Software Engineer

Prompt 缓存被宣传为一种稳赚不赔的方案。缓存长期的共享前缀——你的系统提示词、工具定义、检索到的上下文——只需为变化的短尾部分支付全额费用,然后看着账单下降。数字是真实的:缓存读取的成本大约是新鲜输入 Token 的十分之一,因此具有大量稳定前缀的工作负载,其输入成本可以降低 80% 或更多。团队因此采用它,因此调整它,并用单一指标来汇报:缓存命中率,且趋势向好。

这种表述掩盖了一个事实:你刚刚划定的边界——缓存前缀与非缓存尾部之间的界线——并不是一个计费旋钮。它是一个正确性边界。缓存断点之上的所有内容都是系统认为可以在请求之间互换的内容。如果你为了最大化命中率而划定这条线,你就是在让财务指标来决定你的 Prompt 中哪些事实可以在用户之间、租户之间以及跨时间共享。这是一个隔离决策,理应有目的地做出。

这种失效模式是隐蔽的,因为它永远不会报错。如果缓存命中提供了一个由另一个用户概况塑造的上下文,它会返回一个格式完全正确的响应。如果缓存命中提供了一个在缓存预热时为真、但在重用时已失效的个性化信息,它会返回一个自信、连贯但错误的答案。你的延迟图表或错误率不会有任何波动。唯一的信号是看起来 非常棒 的命中率——因为 Key 太粗颗粒度了。

Prompt 的 Pre-Commit Hooks:LLM 团队一直缺失的内环工具链

· 阅读需 11 分钟
Tian Pan
Software Engineer

打开任何生产环境中的 LLM 代码库里的提示词文件,你会发现评审者的目光变得呆滞。这个 diff 是 15 行自然语言,其中包含一个微调过的 few-shot 示例,一条重新表述的指令,以及编辑器留下的一个多余的尾部空格。没有针对它的语法检查,没有 Linter 抱怨相互矛盾的指令,没有扫描器注意到 few-shot 示例包含上周二支持日志中真实客户的电子邮件地址,也没有冒烟评估(smoke eval)来确认这一更改不会导致系统实际提供的提示词延迟飙升。评审者凭感觉批准——就像 2008 年团队批准 HTML 模板的 diff 一样——然后在 6 小时后,生产遥测系统捕获到了回归。

围绕代码的内环工具(inner-loop tooling)已经成熟了 20 年。围绕提示词的内环工具则介于“我们在 git 中有一个 .md 文件”和“我们在入职后运行过一次 promptfoo”之间。这种差距正在扩大,因为在许多系统中,提示词现在是杠杆率更高的修改:一个 30 行的系统提示词更改比 1000 行的服务重写更能改变行为,而它的评审过程却像处理一份 Word 文档。

滑动窗口税:为什么 30 轮对话的成本远超单次对话的 30 倍

· 阅读需 11 分钟
Tian Pan
Software Engineer

控制面板上的对话情况看起来很健康。每次调用的平均 token 数合理,p50 输入长度舒适地处于缓存前缀(cached prefix)之内,供应商的发票按照财务部门批准的速度增长。然后,有人导出了一个包含 200 轮对话的单次编程会话,该用户的单项支出就超过了团队其余成员每日流量的总和。控制面板没有撒谎 —— 它只是在算平均值。账单来自于长尾(long tail),而长尾并不会随着轮次增加而线性增长。

每一个多轮对话的 AI 功能最终都会遇到这种“惊喜”。每次调用的 token 数是一个错误的衡量单位,因为 30 轮对话的成本不是单次调用的 30 倍 —— 而是 50 倍到 200 倍之间,这取决于历史记录的结构方式、提示词缓存(prompt cache)的衰减情况,以及一旦输入超过 200K token 后请求所处的计费层级。根据单次调用数据为功能定价的团队,实际上是在为他们从未建模过的长尾风险承保。

Prompt Cache 作为隐蔽信道:TTFT 探测泄露跨租户 Prompt

· 阅读需 13 分钟
Tian Pan
Software Engineer

提示词缓存(Prompt caching)是一种只要开启就能立即获益的优化手段。长系统提示词仅需哈希一次,KV 状态驻留在 GPU 显存中,随后任何复用该前缀的请求都能跳过预填充(prefill)成本。供应商报告称,对于缓存的请求,延迟降低了 80%,输入成本降低了 90%。在大规模应用中,这种经济效益是无法抗拒的:摊销到数百万次调用中的单一共享前缀,将一项支出变成了几乎可以忽略不计的尾差。

实现这种节省的机制本质上是一种共享资源,其命中或未命中的状态可以通过延迟来观察。这种可观察性就是侧信道(side channel)。在网络外部可以清晰分辨缓存命中与缓存未命中,这种差异巨大且具有确定性。这项在成本看板上占有一席之地的优化方案,还兼任了一份无人预料的工作:泄露同一供应商下其他租户当前正在进行的活动信息。

Prompt 缓存抖动:当最大租户上线导致所有人账单翻三倍时

· 阅读需 12 分钟
Tian Pan
Software Engineer

账单在月初寄到,金额是你电子表格预测的三倍。没有人推送过系统提示词(system prompt)的更改。仪表盘显示请求量持平。p95 延迟看起来很正常。每个正确任务消耗的 token 比例(token-per-correct-task ratio)也没有变化。然而,你却欠了推理供应商额外的四万美元,而可观测性技术栈中唯一暗示了原因的信号,是一个大多数团队从未设置过报警的指标:缓存命中率(cache hit rate)。它在计费周期的第二周,也就是某个周二的太平洋时间上午 9:47,从 71% 掉到了 18%。而那个时刻,正是你最大的租户的客户成功团队为两百名新用户启动了一场协调一致的入驻活动。

欢迎来到提示词缓存抖动(prompt cache thrashing)—— 这种多租户故障模式本该在十年前就被 SaaS 策略手册消除,如今却通过推理供应商的共享前缀缓存(shared prefix cache)从后门溜了回来。供应商的缓存是在你组织的流量中共享的。无论你是否愿意,你的租户都在共享这个缓存,而一个租户的前缀形态在夜间发生改变,就可能逐出(evict)所有其他租户的单位经济效益(unit economics)所依赖的前缀。对于那些没做任何改变的租户来说,账单也会激增。财务部呼叫工程部,工程部指着显示一切正常的仪表盘,因为仪表盘并没有测量出那个已经损坏的环节。

提示缓存命中率:你的成本仪表盘缺失的生产指标

· 阅读需 11 分钟
Tian Pan
Software Engineer

当你的团队第一次启用提示缓存时,感觉就像凭空得到了钱。几小时之内,token成本下降了40–60%,延迟也随之缩短。工程师们欢欣鼓舞,然后继续前行。三个月后,有人注意到成本悄悄地爬回去了。从72%起步的缓存命中率现在只剩18%。没有人故意破坏它,没有人注意到。

这是生产LLM部署中最常见的轨迹:缓存只被启用一次,从不被监控,随着代码库的演进而悄然退化。缓存命中率是LLM技术栈中最具影响力的成本杠杆,但大多数团队把它当作一次性的设置任务,而非生产指标。

冷缓存、热缓存:为什么你的 LLM 延迟数据在测试环境中具有欺骗性

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的暂存环境显示 p50 延迟为 400ms。你的生产环境仪表盘却显示 1.8 秒。你检查了代码 —— 同样的模型,同样的提示词(Prompt),同样的供应商。部署和发布之间没有任何改动。数据不应该有这么大的分歧,但事实就是如此。

罪魁祸首几乎总是缓存状态。提示词缓存(Prompt caching)—— 大多数团队依赖的最重要的延迟优化手段 —— 在暂存流量模式下的表现与生产流量模式下有着本质的不同。如果你不考虑这种差异,那么你在发布前收集的每一个延迟数据都是虚假的。