OOOMETA/OS
← 返回洞察

2026 年 11 月 · 5 分钟阅读

缓存让系统提示词的开头变成一份共享状态

缓存让系统提示词的开头变成一份共享状态

关键定义

前缀缓存 模型把每次请求开头已经处理过的一段存下来,下一次请求开头完全相同时直接复用。匹配是逐字节的,一个字节不同,从这个字节之后全部重算。

写入溢价 把内容写进缓存时按标准输入价的一点二五到两倍收费。命中率低的时候,写入次数多,溢价会把省下的读取折扣吃掉。

共享可变状态 多人同时修改的同一份数据。前缀一旦进成本报表就属于这一类,解决办法是版本化、权限和按版本观测,而不是提醒大家小心。

打开一个上线三个月的智能体,看它每次请求最前面的八千个 token。系统提示词、工具定义、检索到的文档、对话历史,按这个顺序拼起来送给模型。这八千个 token 里有七千九百多个每次完全一样,只有第二段里的一句话在变:当前时间。

就是这一句话,让后面七千多个 token 的复用全部作废。缓存按前缀逐字节匹配,模型把已经算过的开头存下来,下一次请求如果开头一模一样就直接复用,只收一个很低的读取价。任何一个字节不同,从那个字节往后全部重算。没人会为这件事收到告警,账单只是慢慢变贵。

缓存在会计上是什么东西

几家主要厂商的定价结构不一样,形状却相同。写入缓存要付溢价,大约是标准输入价的一点二五到两倍;命中读取只要标准输入价的百分之五到十分之一。条目跟模型绑定,换一个模型就是另一份缓存;条目还有空闲过期,一段时间没人读就消失。

这三个参数决定了缓存不是一个可以随手打开的折扣开关,而是一条对排版有硬约束的工程契约:前缀要稳定,模型要一致,读取间隔要短于过期时间。三条里破任何一条,省下的钱会以写入溢价的形式还回去,有时候还回去的比省下的多。

FinOps 基金会的 GenAI 工作组把这个边界写得相当直接:如果缓存条目在被复用之前就过期,写入溢价会比省下的钱更多。这句话的意思是缓存是一项要核算的投资,不是一项默认开启的优化。核算的对象不是单价,是复用次数。

第一版通常会怎么排错

多数团队的第一版提示词,是照着一个阅读直觉排的:越重要的信息放越前面。于是用户画像放前面,检索到的文档放前面,当前时间放前面,请求编号也放前面。这个直觉在阅读上没问题,在缓存上是灾难,因为它把每一处按请求变化的内容都放在了最贵的位置。

更麻烦的是它不报错。命中率掉下去,模型照样回答,延迟略高,账单略贵,没有一行日志告诉你哪里出了问题。等到月底看见成本曲线抬头,已经查不出是哪一次改动造成的,因为过去三周里五个团队都动过提示词,而改动本身没有署名。

一个够用的规则是把所有会变的东西集中到末尾:本轮用户输入、检索结果、时间戳、请求编号。前面留固定的系统提示词和工具定义,中途不插入任何按请求变化的内容。这条规则很土,但它把命中率从偶然变成了结构:只要排版不变,命中率就可预期。

还有一层是工具定义。它们通常很长,而且几乎不变,是缓存最理想的载荷。很多团队把它们放在提示词之后,被一段动态内容切开,等于白送。工具定义应该紧贴系统提示词,中间不夹任何按请求变化的东西。

把差额算出来

假设前缀八千个 token,每天五万次调用,输入价按每百万 token 两美元,命中读取按十分之一价,即每百万 0.2 美元。这两个价格取自公开定价页,不同厂商会有差异,形状不变。

命中率九成的情况:四万五千次走读取,三百六十百万 token,七十二美元;五千次未命中按全价,四十百万 token,八十美元;合计一百五十二美元一天。

命中率四成的情况:两万次读取,一百六十百万 token,三十二美元;三万次未命中,二百四十百万 token,四百八十美元;合计五百一十二美元一天。两边的差额是三百六十美元一天,一个月一万零八百美元。

这个规模听起来不值得开会。把同一个比例放到每天八十万次调用上,差额是每月十七万美元,已经是一个中型团队的工资。关键在于这笔钱不来自模型选择,也不来自输出长度,它只来自前缀里那几行会变的内容放在了哪。

还没算写入溢价。每一次未命中都会触发一次缓存写入,按一点二五倍算,未命中部分的成本再涨四分之一。命中率越低,写入次数越多,这个乘数就追着人跑,所以低命中率不是线性变贵,是双重变贵。

前缀变成了共享可变状态

一旦命中率进了成本报表,前缀就不再是一个工程师的草稿,它变成多人共写的一份状态。产品经理要加一句人设,合规要加一条免责声明,检索团队要换文档模板,安全团队要加一段行为约束。每一次都是善意的,每一次都在改别人缓存的钱。

这是数据库领域讨论了几十年的问题,叫共享可变状态。解决它的办法不是提醒大家小心,是三件事:版本化、权限、观测。

版本化意味着提示词作为发布物存在,有编号,有变更记录,有回滚。权限意味着改动要经过一个入口,而不是六个人各自在仓库里改字符串。观测意味着命中率按版本、按模型分别统计,掉下去能指到具体哪一版。三件事缺一件,另外两件就会失效:没有版本号,观测数据无法归因;没有权限,版本号会被绕过。

没有这套机制的团队会看到一种很典型的现象:命中率一周掉了一半,没人知道原因,因为五个团队都在上周改过东西。这不是能力问题,是缺了一个让改动留下署名的机制。在共享状态上,署名比规范重要,因为规范靠自觉,署名靠系统。

单价比较为什么骗人

采购时最常见的那张表,是把各家模型的每百万 token 价格排成一列,挑最便宜的一行。这张表漏掉了两件事:缓存边界和路由。

如果系统用一个 router 按任务把请求分给不同模型,换模型的那一刻缓存就换了命名空间。前缀要在新模型上重新算一遍,省下的单价被重算吃掉一部分,有时候吃掉全部。两个优化互相抵消,而两边各自的报表都是漂亮的,因为一边在报单价节省,另一边没有把重算记成成本。

FinOps 的结论值得直接引:每个 token 最便宜的模型,不一定是每完成一个任务最便宜的模型。原因就在这里,单价只描述一个单位,而任务成功率和缓存命中率决定了这个单位要被用多少次。三个量乘起来才是账单,前两个量单独看都可能给出反向的结论。

我们自己的账

我们统计过自己五个半月的调用:十八万九千四百一十七次,输入一百三十三点七亿个 token,模型自己写出来的部分只占百分之五。这个比例不是某一次的异常值,它来自我们把大量上下文喂进去、让模型做判断的用法。

输入占九成五,意思是账单的结构由输入侧决定。输入侧只有两个杠杆,长度和复用。缓存只管复用,不管长度,把检索结果塞满上下文的做法在缓存友好之前先输在长度上。这两个杠杆要一起动,先减长度再提复用,顺序反了会看到命中率上升而账单不动。

我们也没有把缓存用到极致。按任务在几个模型之间选,每次换模型缓存归零,这部分成本在我们的账单上没有单独一行,只能从单价的差异里反推。这是一个具体的缺口:我们知道自己损失了多少单价差,不知道自己损失了多少命中率,而后者通常是更大的那个数。

说清这些数字的性质。上面是机制推演加自己的调用构成,不是一次对照实验。我们没有跑过同一负载下命中率九成对四成的 A/B,那个实验要同时控制模型版本、提示词版本和流量结构,成本不低。所以文中的金额是模型算出来的,不是实测账单,读的人应该把它当成量级判断,不是精确结论。

这几个数在什么时候不成立

小工具上这套账算不过来。每天几百次调用、前缀只有一两千个 token,命中省下的钱抵不上一次写入溢价,缓存开着反而更贵。判断标准是调用密度,不是前缀长度:同一个前缀在一小时内被读十次以上才值得写进去。

流量有明显尖峰的时候,日平均数会骗人。缓存按空闲过期,凌晨没人用,早高峰第一批请求全部未命中,白天密集之后命中率才上来。用日均算出来的节省,在早九点到十点这段最贵的时段可能一点也没兑现,所以看命中率要看分时曲线,不看月报。

按任务在多个模型之间分配请求的架构,缓存收益要除以路由的分散度。每个模型都要单独预热,同一条前缀在三个模型上等于三份缓存,命中率却按整体算。这类架构下,先在主模型上把排版做对,再考虑横向铺开。

测量本身不难,前提是用对字段。多数厂商在响应里返回缓存命中的 token 数,用它除以输入 token 总数就是当日命中率,比从账单反推准得多。账单里混着输出、写入、未命中三部分,反推出来的数会被口径差吃掉一大截。

三个可以今天就做的动作

第一,把一次请求的前缀拆开,标出哪些字节是每次都不一样的,把它们全部移到末尾。这件事一天能做完,收益会体现在下一次账单上,不需要任何人批准。

第二,给提示词加版本号,把命中率按版本上报。上报粒度至少要能回答一个问题:上周命中率的变化是哪一版造成的。答不出这个问题,报表就只是数字。

第三,把换模型的动作记进成本报表。路由不是免费的,它在缓存上有一笔明确的代价,只是这笔代价现在记在别人那一栏里,谁也看不见。

我们的判断

提示词工程正在从写得好不好,变成发布得对不对。这不是修辞。一个团队的提示词如果没有版本、没有归属、没有命中率观测,它就还停留在个人手艺的阶段,规模一上来必然失控,因为共享可变状态的失控从来不是渐变,是一次改动之后全崩。

这个判断有一个可以检验的推论:如果一家企业的 AI 成本每月波动超过三成,而请求量基本稳定,先去查前缀,不要先查模型。模型换了会留下调用记录,前缀被改动通常不会留下任何东西,只能靠版本号。

反过来说,缓存也不是越早开越好。前缀还在快速迭代的时候,缓存几乎全是写入溢价,省不下钱。合适的时机是提示词结构稳定、变更开始走流程之后。这个顺序做反了,团队会得出缓存没用的结论,然后把它关掉,之后再也不会打开。

还有一层是组织上的。把前缀当发布物,意味着有人要对它负责,这个人通常是平台团队而不是产品团队。这不是把权力收上来,是给共享状态找一个看得见的作者。没有作者的状态,最后谁都在改,谁都不认。

留给管成本的人一个问题:你上一季度的 AI 支出里,有多少是模型选的,有多少是排版选的。前者有仪表盘,后者通常只有一张账单,而账单不会告诉你原因。

来源

外部资料来自下列公开页面;内部数字来自我们自己的调用统计。

FinOps Foundation,GenAI FinOps: How Token Pricing Really Works(2026 年 10 月 28 日更新;缓存写入溢价、条目过期与「缓存可能比不缓存更贵」、最便宜模型不等于最便宜任务)

Economize,AI Token Economics 2026(厂商博客;Sonnet 5.5 每百万输入 2 美元、输出 10 美元与缓存读取 0.05 倍的定价示例,本文按 0.1 倍做保守估算)

常见问题

为什么把当前时间放在前面会让缓存失效+

前缀缓存逐字节匹配。时间戳插在第 N 个字节处,N 之后的内容每次都被视为新内容重新计算,只有前 N 个字节享受折扣。

缓存在什么情况下比不缓存更贵+

条目在被复用之前就过期时,写入溢价超过省下的读取折扣。前缀还在快速迭代的阶段最容易出现这种情况。

命中率从九成掉到四成要多少钱+

按八千 token 前缀、每天五万次调用、输入每百万两美元、读取十分之一价计算,差额约三百六十美元一天,一个月一万零八百美元。规模放大十六倍约每月十七万美元。

为什么换模型会重置缓存+

缓存条目跟模型绑定,换模型等于换一份缓存,前缀要在新模型上重新计算。路由节省的单价会被这次重算部分或全部吃掉。

提示词版本号有什么用+

让命中率变化可以归因到具体版本,让改动有署名。没有版本号时,多个团队同时修改会让命中率下降找不到原因。

应该先优化长度还是先开缓存+

先减长度再提复用。前缀还在快速变化时开缓存几乎全是写入溢价,结构稳定、变更走流程之后才是合适的时机。

拿你自己的执行日志跑一遍

交一份脱敏的近 30 天 agent 执行日志,48 小时内拿到八行表:八项技术项每项一行,每格带分子、分母和判据,缺口按是否要改 schema 排序。前三单 ¥8,000。

看八项字段检查 →