SH

Soloharness

概念 · 辨析 · Agent

← 返回概念辨析

Concept Contrast Fable

提示缓存和前缀缓存:一个存整张单,一个复用公用的头

调用大模型时,提示缓存和前缀缓存都在帮你省钱。但提示缓存是把一整段提示的结果存下来,下次原样命中时直接复用;前缀缓存是把所有请求共同的前缀部分单独提取出来缓存,只要开头一样就能命中。两个机制覆盖的场景重叠但不重合,选错了缓存策略,省钱的幅度差好几倍。

寓言

面馆的两种备餐

老街口有两家面馆,都宣称自己能快速出餐。左边的面馆做法是把一份完整的面上桌之后,把剩余的汤和浇头留起来,下一位客人点完全一样的面时直接端上。右边的面馆做法不同:每天开张前先熬一大锅底汤,不管客人点的是牛肉面、三鲜面还是素面,底汤是一样的,面条煮好浇上底汤再按点的口味放浇头。

午饭高峰期来了一群团建的公司员工。十二个人里有十个人点了招牌牛肉面套餐——面和浇头完全一样。左边面馆乐坏了,存起来的十份现成面直接端上去,出餐速度破了记录。右边面馆虽然也要一碗一碗煮面,但底汤是现成的,浇头配菜可以并行准备,速度也不算太慢。

下午茶时段画风变了。进来的客人每人点了不同的面——牛肉、三鲜、排骨、酸菜、海鲜,没有两份重复的。左边面馆的存货一份都用不上,只能从零开始做,出餐时间翻了三倍。右边面馆不受影响:底汤照用,不同的浇头本来就分开备,出餐速度和午饭高峰期几乎没有差别。

两家面馆在月度考核里发现了一个奇怪的排名:在套餐占比高的月份,左边面馆总分碾压右边;在散客多的月份,右边面馆反而遥遥领先。谁都没赢,谁也没输——只是面对不同点单结构时,两种备餐策略的效率分布完全不同。

后来有人给老街的餐饮协会提了个方案:高峰期先按右边的做法搭好底汤系统,覆盖所有订单的公共部分;同时按左边的做法给高频套餐建快捷档,命中条件严格限定在“面和浇头完全一致”。两套系统并行,互不干扰。

并行之后,出餐数据里出现了一个有趣的现象:底汤覆盖了当天的百分之百订单,但命中完整套餐缓存的只占订单量的百分之十五。这意味着右边策略贡献了基础效率,左边策略只在特定场景下提供了额外加速。分开统计之后,两种策略各自的真实价值才看得清。

年底总结里写了一句:不要用套餐缓存去覆盖底汤能做的事,也不要用底汤去对标套餐缓存的速度。两笔账分开记,两条规则分开设命中条件。

提示缓存

将整个提示的计算结果缓存。只有当下一次请求的提示与缓存内容完全一致时才能命中复用。适合高频重复的固定提示模板。

前缀缓存

将提示的共同前缀部分独立缓存。只要多个请求的开头相同,不管后面内容如何不同,前缀部分都可以复用。适合共享系统提示或长上下文的场景。

故事对应

  • 存完整套餐直接上桌:提示缓存,整个提示原样命中才复用
  • 每天熬一锅底汤覆盖所有订单:前缀缓存,公共前缀对所有请求生效
  • 团建套餐时段左边碾压:高频重复场景下提示缓存命中率极高
  • 散客时段右边不受影响:前缀缓存不依赖内容完全相同,覆盖面更广

落到 API 成本优化里

做 API 调用成本优化时,把系统提示和共享上下文设成前缀缓存——这部分所有请求一样,命中率接近百分百。业务模板中真正高频且内容完全不变的固定提示才单独设提示缓存。两条缓存各有一条命中率监控曲线,不要用同一个“缓存命中率”指标来评价两种机制,否则前缀的稳定贡献会掩盖提示缓存的场景依赖。