prompt-prefix-cache-cost-tracking · ZH · 2026-10-22

一把 key 上六个后端的缓存命中怎么查:哪些前缀真的省下了 USDC

讲清楚如何用一把聚合 key 分辨不同后端的缓存命中,判断哪些重复前缀真的省了钱、哪些在重复计费。

为什么一只 key 后面的缓存要单独看

聚合站把一次请求路由到 Claude、GPT、DeepSeek、Qwen、GLM、Kimi 等不同后端,各家的上下文缓存机制并不相同:有的自动命中、有的需要显式声明、有的按前缀长度门槛收费或打折。所以你看到的“总 token 数”无法直接说明省钱与否,必须按后端拆开看。

先分清三种“缓存”

  • 服务端上下文缓存:命中后输入 token 按折扣价或缓存价计费,未命中按全价。
  • 网络/网关缓存:只影响延迟,不影响计费。
  • 客户端复用:你自己在本地拼 prompt,本质上仍然是新请求。

只有第一种会改变 USDC 扣费。判断省钱,只看第一种。

从响应里找哪些字段

不同后端返回的字段名不一样,但通常有这几类信息可看:

  • 输入 token 中命中的部分与未命中的部分(有的拆成 cached / uncached,有的只给一个 cache_read 数)。
  • 是否有“创建缓存”的额外计费(部分后端写入缓存本身收费)。
  • 请求是否被标记为缓存未命中(例如返回结构与预期不符)。

聚合站在转发时一般保留上游原始 usage 字段,建议直接读原始部分,而不是只看聚合后的总数。

用前缀分组做对照实验

单次请求的数字噪声大,可靠做法是按前缀分组统计:

  1. 固定一段系统提示词或长文档作为“前缀”,放在请求最前面。
  2. 同一前缀连续发多次,记录每次的命中 token 数。
  3. 换一个前缀再发一组,作为对照。
  4. 比较两组“命中 token ÷ 总输入 token”的比值。

如果某后端第一发未命中、后续命中,说明缓存生效;如果每次都接近零命中,说明该前缀没有被复用,或者该后端不支持你这种调用方式。

判断“真省”还是“被重新计费”

可用一个粗略的口径:

  • 命中部分按折扣价、未命中按全价,再乘聚合站的 ×1.3 系数,得到实际扣费。
  • 与“全部未命中”的基线相比,差额就是省下的部分。
  • 若某后端对缓存写入单独收费,要把这笔费用也计入,否则会把“看起来命中”误判成省钱。

常见误区:前缀太短、被中间插入的动态内容打断、或者每次请求在开头放了时间戳/用户 ID,都会让缓存永远不命中——这时你以为在复用,其实每次都在全价重算。

跨后端对比时注意口径一致

六个后端的 token 计数方式和缓存门槛不同,直接比命中率会失真。建议:

  • 用同一段前缀文本、同一顺序、同一长度做测试。
  • 分别记录各后端的命中 token、未命中 token、以及是否有写入费用。
  • 只比“同后端内部命中 vs 未命中”的差额,再横向比较差额大小,而不是比命中率绝对值。

把结论落到成本上

  • 高频复用、前缀稳定的任务(长系统提示、固定知识库、固定格式模板),在多后端上都值得做缓存验证。
  • 前缀经常变化、或动态内容靠前的任务,缓存收益通常有限。
  • 贡献 key 的一方按官方价 ×1.1(优质 ×1.2)返 USDC,用户按 ×1.3 扣费;缓存节省发生在输入侧,理解这一点有助于判断哪些调用模式更划算。

一个可复用的检查清单

  • 请求前缀是否稳定且足够长?
  • 动态内容是否被放在前缀之前?
  • 响应里的命中字段是否逐次上升?
  • 是否存在缓存写入费用?
  • 换算成 USDC 后,是否真的低于全未命中基线?

按这套方法逐后端核对,你就能知道一把 key 背后,哪些前缀真的省下了钱。