缓存字节数正在取代单价
一、比价的那一列,可能选错了
挑模型的时候,大家看的都是同一列数字:每一百万 token 多少钱。这列数字好比较,好填进表格,也好向上解释。
它默认了一件事:每次调用付的钱差不多。这个默认在短问答上成立:问一句、答一句,输入几百字,输出几百字,价格表上的数字就是账单上的数字。放到长任务上就不成立了。一个跑整周跟踪的流程,一次任务里可能有几十到几百次调用,每次都要把同一段历史重新发一遍。这段历史如果命中了缓存,按折扣价计;没命中,按全价计。同一段内容,两种价格,差了大半个数量级。
于是一张按「每百万 token 单价」排序的评估表,对这类负载几乎没有解释力。真正决定账单的是另外两样东西:这段历史驻留一次占多少字节,以及它到底有没有被命中。
二、调用量掉到三分之一,账单涨了一倍多
这件事是账单先告诉我的,价格表上看不出来。
我们在请求送进模型之前加了一层改写规则,作用是把文本里的敏感值换成占位符,再转发出去。有一段时间,同一类任务,调用次数掉到不足原来的三分之一,账单反而涨了一倍多。数字是反着的,第一反应是哪里漏了、是不是有重复调用。查了一圈,调用量没有虚增,单价没变,模型也没换。
问题出在那层改写上。占位符的编号当时是按出现顺序自增的:同一个敏感值,第一轮出现叫一号,第二轮再出现就叫二号。看上去只差几个字符。
三、命中量钉在一个常数上
把每天的费用拆开看,形状就出来了。
健康的账长这样:命中的 token 量随着输入量一起涨,命中率稳定在九成五上下。出问题的那几天,命中量钉在一个常数上,一动不动,大约两万出头,而输入量还在照常增长,命中率从九成五掉到三成四。
这个形状是有名字的。上游的缓存按前缀匹配:从第一个字节开始对,对到哪算哪,一旦有一处不一样,从那个位置往后的全部内容都算没命中。占位符编号一变,那段历史就从变的地方断开,它后面九成以上的上下文全部按全价重算。而敏感值往往出现在很早的位置,第一次提到通常在开头几屏。所以被击穿的范围远大于那几个字符,代价落在它们后面的全部上下文上。
命中量钉在常数上,正是这个机理的指纹:只剩下「所有对话都完全一样的那一小段」还能命中,后面全废。这一小段的内容量与输入量无关,所以它不涨。
改法不复杂,把编号从「第几次出现」换成「由原值本身算出来」。同一个值,无论出现多少次、在第几轮出现,编号都相同。改完第二天,命中率回到九成六。
四、一个字节的位置,比它的长度重要
复盘时我意识到,那几个字符本身短得可以忽略,编号从一位涨到两位,多出来的字节数小到看不见。代价来自它们出现的位置。出现在历史的前面,代价是后面全部内容重算一遍;出现在末尾,代价就是那几个字节本身。同样是几个字节,位置不同,代价差两个数量级。
这里有个反直觉的推论:优化长任务的成本,先看前缀稳不稳,再看单价便不便宜。一份把前缀打散的重写规则,可以轻易吃掉换到更便宜模型省下来的全部差额,而且不留痕迹:它不报错、不中断,只是每天多花一笔钱。
五、另一端:模型厂在压字节
上面讲的是命中率,另一半是字节数。这两个因子乘在一起,才是账单。
最近有个例子说明字节数这一侧也在快速变化。一家模型厂发布新版本时,公布了一个平时不太被拿出来讲的指标:每 token 的缓存占用从初代的 389120 字节压到 890 字节,累计 437 倍。同一周,另一个团队公布自研注意力方案在 25.6 万 token 上下文下把缓存占用降到约六分之一。两个互不相干的团队在推同一条曲线。
这两件事的意义不在跑分,在成本结构。缓存体积小一个数量级,等于同样长度的历史,驻留成本与重算成本一起降一个数量级。它也让长任务第一次在成本上变得可行。一份年报反复提问、一次跨文件核对、一轮多轮回测迭代,过去贵在每次都要重读历史,现在这部分正在变便宜。
六、端点被静默替换,是同一个风险的镜像
字节数这一侧的好消息里,也埋着一件事。同一家模型厂宣布,旧款旗舰从某天中午起全部路由到新模型,按新模型的单价计费。
对调用方来说,这件事几乎没有感知:接口名没变,请求照发,返回照收。但行为变了:模型换了,计费口径换了,缓存占用也换了。原来跑得顺的工作流,可能因为这次替换而表现不同,而它的失败方式是输出悄悄变化,没有任何报错。
这和前缀击穿是同一类风险的两个方向:一个是我们自己改动了送出去的东西,一个是别人改动了接住的东西。两者的共同点是都不报错,都只在账上或者结论上显形。
七、评估表上要补哪几列
回到开头那张表。对跑长任务的团队,比价的列至少该补三个:每 token 缓存字节数、缓存命中单价、闲时折扣。前两个乘起来才是历史重读的真实成本,第三个决定批量任务能不能靠排期省下一半。
比补列更要紧的,是把监测放到机器上。前缀有没有被击穿,人眼看不出来:账是月底结的,破坏在第一天就发生了。可查的指标有两个:命中率,以及命中量是不是跟着输入一起涨。第二条比第一条更硬,它不依赖任何口径,命中的绝对量钉住不动,就是前缀断了。
最后一条是纪律:任何会改动送出去文本的机制,无论是脱敏、注入、压缩、裁剪还是路由重写,都必须做到同一份输入两次调用逐字节一致。这条规则的位置在机制本身,不在写规则的人的记性里。
文中观点仅为个人实践观察,不构成任何投资建议。