长会话的模型选型:缓存命中率如何决定真实成本

0 阅读1分钟

一句话结论:长会话省钱的开关不在「模型单价」,在「缓存命中单价」。 我按单价挑了个更便宜的模型,结果账单是另一条路线的 2.15 倍。

一、先说结果:为了省钱,我多付了 72%

账单出来那天我盯着屏幕看了半天。用量一个字没变,只是换了个"更便宜"的模型,钱却变多了。

半年前我干了件自以为聪明的事:在高峰时段把默认模型切换成一个「输入便宜 25%、输出便宜 35%」的型号,想着一天里最贵的那几个小时总能省下三成。

实际账单,三条路线的花费指数摆在一起(以最省的方案为 1.00):

我怎么花的花费指数说人话
换成"更便宜"的模型2.15我以为会最省的这个
同样的 token,原方案按峰时价2.00什么都不改,也比这个省
同样的 token,原方案按谷时价1.00什么都不改,只要这个价

同一批 4.94 亿 token,我多花了 115%,是谷时方案的 2.15 倍。

最讽刺的是:我之所以要"省钱",就是为了避开高峰的贵价时段。结果我换过去的那个模型,连原方案的峰时价都没打过。

为什么会这样?一句话:我比的是不重要的那两列价格,而真正决定账单的那一列,我根本没看。

图1

下面三件事值得说清:我当初为什么这么选、钱到底花在哪、以及下次用什么数字一秒判断该不该换——最后那个数字,你现在就可以算出来。

二、我是怎么"省钱"的

我的使用场景很典型:跑 Agent,一个会话动辄几千万 token,上下文不断累加。高峰时段(9–12 点、14–18 点)我写了个定时任务,把默认模型切到另一家的 flash 版本。

选它的理由就三条:

  • 输入单价比原方案便宜 25%
  • 输出单价比原方案便宜 35%
  • 名字里带 flash,官方定位就是"轻量高性价比"

按这个算法,高峰时段应该省下约三成的钱。两个月后我去拉了账单。

三、账单摊开:它不是免费的

我一直以为它在高峰时段是免费的——因为这个模型名字里带 "flash",很多平台的 flash 档都有免费额度。直到我把明细表拉下来,才知道自己错了两个月。

按用量结构还原,9 月到 10 月 22 日的总消耗 4.94 亿 token,其中主力模型贡献 98.8%,这部分是实打实计费的。

这里有个细节值得单说:我这套调度工具本地没有这家 provider 的定价表,所以它记的费用恒为 0。我在控制台里看了两周的"花费 ¥0",真以为它是免费的。直到我去平台后台拉了明细表。

四、钱到底花在哪:三个价格列,只有一行重要

图2

类型模型 B(我换的)模型 A(原方案)谁便宜
缓存命中贵便宜 10.7 倍原方案
输入(未命中缓存)便宜 25%贵我换的
输出便宜 35%贵我换的

我在选型时比对的那两行,确实更便宜。但它们在真实用量里只占 8.6%,而贵 10.7 倍的那一行占了 91.4%。

图3

类型token 占比费用占比
缓存命中91.4%73.6%
输入8.2%22.3%
输出0.5%4.1%

长会话的成本结构不是「问答钱」,是「重读上下文的钱」。

五、换成一个可判定的公式

上面的结论不用背,把它画成曲线就行——两条线交叉的那个点,就是「该不该换」的分界线。

图4

设缓存命中率 h,输出/输入比 r,某模型的三档单价为 c_cache / c_in / c_out,则每个「输入类 token」的综合成本:

cost(h) = (1 - h) × c_in + h × c_cache + r × c_out

我这次的实测参数:r = 0.055,h = 0.914。两个方案的综合单价,以原方案为 1.00 归一:

缓存命中率 h模型 B(我换的)模型 A(原方案)谁便宜
0%0.731.00B 便宜 27%
40%0.821.00B 便宜 18%
60%0.901.00B 便宜 10%
73.6%1.001.00打平(临界点)
91.4%(我的实测)1.251.00A 便宜 20%
100%1.491.00A 便宜 33%

临界命中率 73.6%。 只要缓存命中率高过它,"输入便宜 25%"这个优势就会被"缓存贵 10.7 倍"完全吃掉。我实测 91.4%,越过临界点 17.8 个百分点。

六、决策表:什么时候换模型真能省钱

先看流程图,四个问题就能定结局:

图5

你的场景缓存命中率典型值结论
单轮问答、客服、批量生成0–20%按输入/输出单价选,便宜的那家真能省
多轮对话(3–10 轮)40–70%看具体单价,接近临界点,必须实测
Agent / 长上下文 / 代码库问答85–97%只看缓存单价,输入输出便宜没用
完全相同的长 system prompt 反复调用~100%缓存单价低的那家压倒性赢

一句话:短任务看 token 单价,长任务看缓存单价。

七、两个工程教训

1. 成本监控必须能对到账单

自建监控的 estimated_cost 在两种情况下会变成假数字:

  • 本地定价表里没有这个 provider → 恒记 0,看着像免费
  • 不同计费档位没拆分(比如按量价 vs 资源包抵扣 vs 分长度区间)→ 记出来的数只是标价复算

验法:每周拿一张平台明细表,按「模型 × 价格类型(缓存/输入/输出)」交叉核对。对不上就说明你的定价表过期了。我给自己的断言是:标价复算值与账单金额相差超过 10% 就要查。

2. 缓存命中率是新的关键性能指标

以前我会盯 QPS、首字延迟、上下文长度。现在第一个看的是 缓存命中率:

  • 命中率高 → 省钱,但一旦切换模型,缓存全部作废(跨 provider 缓存不通用)
  • 频繁切模型 = 频繁丢掉缓存 = 每次都要付全价输入

所以"按时间段切模型省钱"这个策略,在长会话场景下天然是负收益——它不仅换了单价,还换了缓存池。我这次的账单就是这条规律的实证:省下的输入输出钱抵不过缓存损失 + 重新预热的钱。

八、我最后怎么处理的

  1. 把四个切模型的定时任务全停掉,只留一家
  2. 把配置里的"故障自动转备用 provider"也清空——否则主 provider 抖动时会静默切到计费未知的那家
  3. 定价表补齐之前不做选型对比,先看账单再谈性价比
  4. 留一条基线:现在只跑单一 provider,30 天花费固定在一个基数上,之后任何"优化"都对着这条线量,不要再凭单价表下结论

最后一句:模型选型最容易犯的错不是选贵了或选便宜了,而是拿错的那一列做比较。价格表上有三列,你用来做决策的那一列,最好是真实用量占比最高的那一列。