2026 年 9 月 · 5 分钟阅读
前缀缓存降的是单价,不是每轮重发的历史

关键定义
前缀缓存 模型侧对重复出现的提示前缀复用计算结果的机制,命中部分按折扣价计费,未命中部分按完整输入价计费。
缓存漏出量 缓存流中没有命中的那部分输入 token,它按未命中价计费,是长会话成本的主要变量。
每 6 小时醒一次的那些定时任务,做的第一件事都一样:把上一轮的对话从开场重新发一遍。系统提示、工具说明、上一轮的结论、中途失败的尝试,全部原样再进一次模型。我把过去 30 天的调用记录打开,一行一行翻下来。账面上不是一条流,是两条。这意味着账单的形状,从一开始就和我们以为的不一样。
一、缓存的优惠落在单价上
模型的输入价格表上是两档。一档是这次真正新增的内容,供应商按未命中缓存计价;另一档是被缓存住的旧前缀,模型不必重新计算,但要照价记账。两档之间的单价差是 10 倍到 50 倍,体积差可以到一个量级。
DeepSeek 的价目表里,命中缓存的输入是每百万 token 0.003 美元,未命中是 0.15 美元,相差 50 倍。OpenAI 的文档写缓存读取按输入价的 0.1 倍计费,写入按 1.25 倍。Anthropic 写读取 0.1 倍,其中部分模型是 0.025 与 0.05 倍,写入同为 1.25 倍。
这组价格解释了一个常被忽略的事实:优惠打在单价上,不打在体积上。你每轮发出去的历史一个字都没少,只是其中大部分打了折。换句话说,缓存省的是价格,不是工作量。真正决定账单的是两个量,一是每轮要带上多少历史,二是一个任务要往返几次。
二、我们 30 天的读数
从 2026 年 8 月 30 日到 9 月 29 日,这套系统发起了 3,159 次模型调用,新输入 3.89 亿 token,命中缓存的输入 36.97 亿 token,输出 6,042 万 token。
把这个配比按 DeepSeek 的非高峰价目表换算:新输入 58.4 美元,缓存命中 11.1 美元,输出 36.3 美元,合计约 105.7 美元。缓存流的体积是新输入的 9.5 倍,花的钱是新输入的 19%。
这个换算有两个缺口。我们自己记录的缓存写入字段是空的,所以写入侧那 1.25 倍的溢价没有进上面的数字;另一部分流量走订阅通道,它们计入了体积,但没有进入单价换算。两个缺口指向同一个方向。这意味着真实成本高于上面的估算,不会低于它。
三、体积比由会话长度算出来
缓存流之所以能比新输入大一个量级,原因是累加。假设每次任务都把完整历史重发,每轮新增内容的长度又大致相等。那么一个跑 n 轮的会话里,新输入是 n 段;累计的缓存读取是 0 加 1 加 2 一直到 n 减 1,约等于 n 平方的一半。两者相除,体积比约等于 n 减 1 再除以 2。
把我们的读数代进去,9.5 倍对应平均会话长度约 20 轮。反过来算,如果想把体积比压到 4 倍,平均会话长度要降到 9 轮左右。同一个任务拆成两段各 10 轮的会话,两边累计读取合计约 90 段;而一条 20 轮的会话是 190 段。新输入量没变,缓存体积接近减半。
这个换算的前提要说清楚:等长假设在真实数据里不成立,长会话的早期轮次通常更长。所以上面的数字是量级估算,用来判断方向,不用来定价。它的用处在于把“成本高”这个感觉换成一个可以动手的变量:会话长度。也就是说,一件听上去只能抱怨的事,变成了一条可以调的值。
四、缓存的时效只到分钟级
缓存有保留期,而且比多数人以为的短。供应商文档里默认的保留时间是 5 分钟,写入侧付输入价的 1.25 倍,换来的是这段时间里的复用。更长的保留期在部分供应商那里是可选项,价格也不同,值得逐家核对。
我们的定时任务每 6 小时醒一次,两次执行之间隔着 6 小时,远大于 5 分钟。这意味着跨任务基本不可能命中,能命中的只有同一次会话内部的多轮请求。体积比这么高的原因也就清楚了:会话内每一轮都要把从开场到现在的全部历史重发一次。轮数越多,累计读取越长。
对架构的含义很直接:省钱的边界不在任务之间,而在会话内部。把一次任务拆成更短的会话,比指望两次任务之间共享缓存更现实。
五、命中率不是成本指标
命中率是比例,成本是绝对量,两者的分母不一样。用比例去管绝对量,就会出现一种很常见的错觉:命中率 99%,看起来已经很好了。
把缓存流漏出的部分单独算一遍。如果 36.97 亿 token 里有 10% 没有命中,那是 3.7 亿 token 按未命中价计费,55.5 美元,和我们 30 天全部新输入的成本 58.4 美元几乎相等。命中率从 99% 掉到 98%,看起来只掉一个百分点,漏出的量却增加了 3,700 万 token。
换句话说,缓存流每漏 10%,等于把新输入流再付费一遍。这意味着缓存流越大,这个换算越贵。同样的道理,长会话的团队比短会话的团队更需要盯漏出量,而不是命中率。
六、缓存为什么会漏
命中判定是逐字节的。Anthropic 的文档写得很直接:前缀必须 100% 相同,包括被标记的那个块之前的全部文本与图像;写入只发生在断点上,断点之后的内容不参与缓存。
另有一条窗口限制。同一个文档里给的例子是,当对话增长把断点推到上次写入位置之后 20 个内容块以外,回看就找不到那条记录,整段重算。也就是说,缓存的命中范围不是无限的,它跟着断点的位置走。
最常见的自伤是另一种:把每轮都会变的东西埋进了前缀。文档里给的反例是一个时间戳,它让前缀哈希每轮都不同,回看再远也匹配不上,于是缓存形同没开。任何每轮变化的内容都有同样的效果,包括当前时间、本轮随机生成的编号、刚拿到的用户输入。
我们的判断是:随时会变的内容必须排在断点之后,稳定内容(系统提示、工具定义、不常改的参考文档)放在断点之前。这条规则不花钱,但很少有人一开始就写对。原因是时间戳最自然的安放位置,恰好就是系统提示的第一行。
七、输出是一笔反直觉的账
输出 6,042 万 token,体积只有缓存流的六十一分之一,却花掉三分之一的成本。按价目表看,输出单价是缓存命中价的 200 倍,每百万 token 0.6 美元对 0.003 美元。
这条换算对工程决策有直接含义:模型能不能少说,比它每 token 便宜多少,对账单的影响更直接。模型的单价你只能谈,输出的长度你能改。这意味着先写下输出上限的人,比在几家供应商之间比价的人更早拿到钱。
我们踩过的坑是把输出长度交给模型的自觉。任务描述里写“简明扼要”,得到的往往是一段带小标题、带总结、带下一步建议的答复,长度是必要内容的三倍。写成一个数字,例如“不超过 300 字,超出要说明理由”,效果立刻不同。
八、压缩历史也有成本
压缩不是免费的。压缩本身要发起一次模型调用,读一遍待压缩的历史,再写出一段摘要,而输出是最贵的计价档。假如一次压缩要读 10 万 token、写 2,000 token,按前面的价目表算,就是 0.015 美元加 0.0012 美元,合计约 0.016 美元。
这笔钱什么时候收得回来,取决于压缩之后还剩几轮。前缀变短带来的节省只发生在后续轮次里,如果任务只剩一轮,压缩比不压缩更贵。我们因此把阈值写成两条:历史超过多少 token 触发压缩,以及压缩后至少还要跑几轮才允许执行。第二条规则更少人写,但它挡住了最亏的情况,也就是为了最后一步压一遍历史。
把这三个量放进两种配置里对照,账会更清楚。同一个任务跑 20 轮而不压缩:新输入 20 段,累计缓存读取约 190 段。同样的任务拆成四段各 5 轮的会话:四边合计的缓存读取约 40 段,新输入仍是 20 段,代价是会话之间丢掉的那部分上下文。第三种做法是保留长会话、每 5 轮压一次历史,额外付出四次压缩调用的成本,约 0.065 美元。
三种配置的差别不在模型选型上。第一种的成本主要来自重发历史,第二种来自跨会话丢失的上下文,第三种来自压缩本身的调用次数。选哪一种取决于任务形态:步骤之间强依赖、每一步都要看前文的任务适合第三种;步骤之间弱依赖、可以各自独立验收的任务适合第二种。这个判断是架构决策,不是提示词技巧,而且它比换一个更便宜的模型对账单的影响更大。
九、单价降九成之后会发生什么
Gartner 在 2026 年 3 月的预测是,到 2030 年,同等规模模型的推理成本比 2025 年低 90% 以上,比 2022 年的早期模型效率高最多 100 倍。这个预测大概率会实现。
但它作用在单价上。缓存流与新输入流的体积比,由每轮重发多少历史决定,和价格没有关系。如果历史长度随任务数量一起增长,降价的部分会被体积吃掉一部分。我们的判断是:单价下降不改变账单的形状,只改变它的量级。也就是说,谁先把历史体积控住,谁就先拿到降价的全部收益。
十、三个旋钮和一个顺序
第一个旋钮是会话压缩阈值:历史涨到多少就必须压缩,压缩之后保留多少。它决定缓存流与新输入流的体积比。
第二个旋钮是断点的位置与稳定性:稳定内容在前,易变内容在后。断点数量有上限,OpenAI 的文档写一次请求最多四个写入,所以断点不能撒开用,两三个固定的就够。
第三个旋钮是输出长度契约:每个任务写一个输出上限,超出要说明理由。它管的是账单里最贵的那些 token。
顺序上,先量,再改体积,最后才谈单价。体积是除数,单价是乘数,所以除法先做。反过来先谈单价,等于把可以自行解决的变量交给供应商。
十一、不该开缓存的情况
缓存不是默认划算的。写入侧要付输入价的 1.25 倍,一段前缀至少要被读到第二次才回本,因为第二次读取只要 0.1 倍,两次合计 1.35 倍,而不用缓存是两次完整的 2 倍。这个断点很低,但它意味着一次往返就结束的短会话不该开缓存,那 25% 的溢价收不回来。
还有一条安全边界值得注意。OpenAI 的文档提到,为不同用户使用独立的缓存标识,可以避免跨用户的命中探测,也就是有人用试探性请求来判断别人的上下文有没有被缓存。多租户场景里,缓存键要跟着租户走,不要全局复用。
十二、四个字段与三个问题
要看清楚自己的账单,只需要四个字段,按调用记录:新输入 token、缓存命中 token、缓存写入 token、输出 token。再把每个任务的调用次数乘上去,就得到单位任务成本。这四个字段比“本月花了多少钱”有用得多,因为只有它们能指向具体动作。
采购或续约时值得问平台三个问题。缓存写入和读取分别是输入单价的几倍,一次请求允许几个写入断点?命中判定用的是什么粒度,回看窗口多大,跨会话能不能命中?账单能不能按任务拆分,而不是按密钥或按天给一个总数?
下一个月我们只改一件事:把会话压缩从凭感觉执行改成按阈值触发,并把断点固定在稳定前缀上。账单再打开一次,看缓存流 10% 的漏出量能不能降到 5% 以下。你手上那条缓存流,是新输入量的几倍?
参考来源
- DeepSeek 官方价目表(缓存命中 0.003 美元 / 未命中 0.15 美元 / 输出 0.6 美元,每百万 token,非高峰时段)
- OpenAI Prompt caching 文档(读取 0.1 倍、写入 1.25 倍、一次请求最多四个写入断点、独立缓存标识防命中探测)
- Anthropic Prompt caching 文档(逐字节匹配、5 分钟保留期、20 个内容块回看窗口、时间戳破坏前缀哈希的例子)
- Gartner 预测(2026-03-25,2030 年推理成本较 2025 年下降 90% 以上)
- Epoch AI(按基准成绩衡量的推理价格长期趋势)
文中 30 天的调用量、token 与配比数字来自我们自己的模型调用记录(2026-08-30 至 2026-09-29,3,159 次调用),未做外推;美元换算使用上述公开价目表的非高峰单价,属估算,不代表实际结算金额。
常见问题
缓存命中率多少才算健康?+
命中率本身不决定成本。我们 30 天的缓存流是新输入量的 9.5 倍,但只要漏出 10%,多付的钱就相当于全部新输入的成本。
前缀缓存会减少发送的 token 数量吗?+
不会。每轮请求仍然发送完整上下文,缓存只改变单价,不改变体积。
缓存流的体积为什么比新输入大一个量级?+
因为累加。跑 n 轮的会话里缓存读取约等于 n 平方的一半,新输入是 n 段,体积比约等于 n 减 1 除以 2。
缓存的保留期有多长?+
文档里默认是 5 分钟,写入侧付输入价的 1.25 倍。跨 6 小时的两次定时任务之间不可能命中。
压缩历史值得做吗?+
取决于压缩后还剩几轮。压缩要读一遍历史并写出摘要,若任务只剩一轮,压缩比不压缩更贵。
什么情况下不该开启前缀缓存?+
只往返一次的短会话。写入侧要付输入价的 1.25 倍,一段前缀至少要读到第二次才回本。
输出 token 在账单里占多少?+
在我们的读数里,输出体积是缓存流的六十一分之一,成本占三分之一。输出单价是缓存命中价的 200 倍。
看账单需要记录哪四个字段?+
新输入 token、缓存命中 token、缓存写入 token、输出 token,再乘以每个任务的调用次数。
相关文章
智能体平台按什么计费,就会长成什么架构
一周之内三家平台把 agent 的计费口径摆上台面:按对话轮次、按执行时间、按 trace 分析量。口径不是商务条款,它决定你的重试、空闲等待和多轮追问由谁付钱。签约前要问清三个问题。
AI Agent 监控:探针发 1 个 token,任务发 9000 个
套餐额度按 token 计,可用性探针却按请求计。同一把 key:1 个 token 返回 200,9000 个 token 返回 429。
长上下文能替代检索增强吗:先算缓存命中率
窗口大不等于更省事。决定长上下文是否比检索便宜的不是窗口大小,是每个缓存窗口里的复用次数,这个门槛约二十次。本文给出交叉点算法、可靠上下文的实测边界,以及三种架构各自的适用条件。
失败的工具调用:中位 1.6 秒,p90 顶到上限
我们的日志里 423 次失败的工具调用呈双峰分布:53% 在 2 秒内返回错误,16% 顶到 170 秒以上的超时上限,中间地带只有 31%。我们的判断:超时上限是故障分类器,不是性能参数。