缓存命中率高低区别

成本与用量

讲清缓存命中率高低在费用和速度上的差别,给出一套判断命中率好坏、排查偏低原因、把命中率做上去的可执行顺序。

很多人第一次看账单会懵:同样的调用量,这个月比上个月贵了一截,翻用量记录才发现缓存命中那一栏掉下去了。也有人反过来,命中率数字挺好看,实际省下的钱却没多少。这篇不重复缓存怎么生效,只回答一件事:命中率高低到底差在哪、怎么判断自己现在这个数算不算正常、偏低时按什么顺序去查。

很多人第一次看账单会懵:同样的调用量,这个月比上个月贵了一截,翻用量记录才发现缓存命中那一栏掉下去了。也有人反过来,命中率数字挺好看,实际省下的钱却没多少。这篇不重复缓存怎么生效,只回答一件事:命中率高低到底差在哪、怎么判断自己现在这个数算不算正常、偏低时按什么顺序去查。

先把结论摆前面:命中率不是一个单独看就有意义的数,它得跟「输入里有多少是可缓存的固定前缀」绑在一起看。脱离结构谈命中率,容易把该省的钱漏掉,也容易在根本不该优化的场景上白费功夫。下面按「差在哪、怎么判、怎么查、怎么验证」四步走一遍。

命中率高低,到底改变了什么

命中率最直接改的是输入侧的计价。命中那部分输入走的是更低的计价档,没命中就按全价算,账单差异几乎全出在输入这一侧,输出侧基本不受影响。所以你会看到一种情况:输出没变、调用次数没变,账单却涨了,问题就出在命中率掉了。想确认当前各家输入与缓存读写的分档写法,到 /official-api 看当时的数字,别凭印象估。

速度上的差别来自少了一次完整的前缀计算。长系统提示、长文档这类场景,首字延迟的差距最明显;短提示几乎感觉不到,因为本来就算得快。另一个容易忽略的点是:命中率只对「前缀稳定」的请求有意义,每轮对话都把历史改一遍的写法,命中率天然接近零,这时候你盯着的那个数字本身就没有优化空间。

观察到的现象大概率的原因先看哪里
账单涨、调用量没变命中率掉,输入走了全价用量记录里命中与未命中两栏占比
命中率好看但没省钱可缓存内容本来就很短输入结构里固定前缀占多少
首字延迟忽高忽低前缀里藏着变动字段请求头部字段是否每轮在变
改了写法却没变化同一批任务间隔太久,缓存过期任务是否集中在一个时间段跑

怎么判断自己这个数算高还是算低

别看绝对值,看结构。系统提示加固定文档占输入的比重越大,命中率就应该越高;纯自由对话占比大,命中率低是正常的。拿一个闲聊型应用去对标一个编程 agent,得到的结论一定是错的,因为两者的可缓存前缀长度根本不在一个量级。

更靠谱的做法是拿两个指标对齐看:命中率乘以命中部分省下的单价差,才是真实省钱幅度。命中率很高,但可缓存内容本来就很短,省下来可能只是一点点。想横向对照同类任务的常规区间,到 /usage 看真实用量榜里相近场景的分布,比拍脑袋强。

  • 固定前缀占比大、命中率却不高:说明前缀里有变动字段,属于可优化,值得查
  • 固定前缀占比小、命中率低:属于结构决定,优化空间有限,别硬做
  • 每轮强制重拼上下文、内容带实时数据:命中率做不上去也不该硬做,硬做会增加出错概率
  • 连续几天命中率忽高忽低:不是水平问题,是前缀稳定性问题,先查字段

命中率偏低,按这个顺序排查

  1. 查前缀是否稳定把请求头部的系统提示、工具定义、示例先固定下来,凡是每秒变一次的东西(时间戳、随机 id、用户昵称)都往后挪。验证方式:同一段请求连发两次,看命中栏是否都亮。
  2. 查过期策略缓存通常有存活窗口,间隔太久再发同样的前缀会重新写一遍。把同一批任务集中在一个时间段跑完,验证方式:同一批任务拆到上下午各跑一次,对比命中率。
  3. 查请求形态把大段固定内容放最前面、变动内容放最后。顺序颠倒等于白搭,验证方式:把一段固定文档从尾部挪到头部,重测一次看是否有变化。
  4. 量延迟基线改完不要只看账单,到 /tools/speed-test 前后各测一次首字延迟,确认速度真的降了。只看账单容易把波动当成优化成果。

把命中率做上去之后怎么验证没白干

验证的核心是隔离变量:拉出改动前后同样任务量的用量记录,只看输入侧命中与未命中两栏的占比变化,别把总量变化混进来。总量涨了,占比可能反而更健康,混着看会得出错误结论。同时看稳定性,连续几天命中率稳定在一个区间才算真的做上去了,忽高忽低往往说明前缀里还藏着变动字段。

再换算成单次任务成本:到 /tools/model-cost-calculator 用当期单价把命中与未命中两部分分别算一遍,得出每任务实际差了多少。这一步能把「命中率涨了但没省钱」的情况直接暴露出来——只要可缓存部分太短,这个换算结果会很明显。

下一步想先知道自己这类场景的常态区间,去用量榜对照相近场景的分布,再决定要不要动手优化。

常见问题

缓存命中率高,账单就一定会明显下降吗?

不一定。省下的钱等于「命中部分的 token 量 × 输入与缓存读的单价差」。如果可缓存的前缀本身很短,或者输入总量中大头是每轮都在变的内容,命中率再漂亮,落到账单上也只是一小截。判断方法是用当期单价把命中与未命中两部分分别算一遍,看差额再决定要不要继续投入优化。

为什么我改了提示词,命中率反而掉了?

最常见的原因是改动落在前缀里。缓存认的是从头开始的一段固定内容,只要开头几句变了,后面再长也全部作废。系统提示、工具定义、少样本示例这些应该尽量冻结;需要调的内容放到消息末尾,或者另起一轮请求去调,别动头部。

命中率高但响应速度没变化,是哪出了问题?

大概率是瓶颈不在输入侧。长输入确实能省下前缀计算的时间,但如果任务卡在排队、限速、或者输出生成本身就很长,首字延迟和总耗时都不会有明显改善。先用站内测速页量出延迟基线,分清是网络、排队还是生成阶段在拖,再决定要不要继续优化命中率。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。