SH

Soloharness

概念 · 辨析 · Agent

← 返回概念辨析

Concept Contrast Fable

KV Cache 和前缀缓存:一个是推理引擎记住了每一步,一个是服务层复用了别人的记忆

两个词都在说“缓存”,但缓的东西和缓的位置完全不同。KV Cache 是模型在逐 token 生成时把注意力计算的中间结果存下来,避免重复计算历史 token——这是推理引擎层面的事。前缀缓存是把请求之间共享的 prompt 前缀的结果缓存在服务层,多个请求复用——这是系统调度层面的事。优化错了层级,钱花在 GPU 外的地方却等不到加速。

寓言

造船厂里的两种下脚料复用

海边有一家造船厂,每造一条船都要铺龙骨。龙骨是最耗材耗时的部件。老工匠每铺一根龙骨,都要根据船型重新计算受力、画线、切割、打磨。造十条船,每条都得从头来过。

厂里先后搞了两项改进。第一项改进是让工匠把已经算好的龙骨数据记在笔记本上——每条船的龙骨在第几根肋位用了什么木材、受力数据是多少。造下一条同船型的船时,工匠翻出笔记直接复用,不用重新计算整根龙骨。这个本子就放在工匠的工具箱里,每做一条船就用一笔。

第二项改进是厂长的主意。他发现很多船的船头部分设计完全一样——不管船身多长、载重多少,船头的弧度模板是统一的。他在设计室里专门辟了一面墙,贴满了船头段的标准加工图,任何工匠进来都能直接取用。不同船型、不同订单,只要船头那段一样,直接引用。

这两种复用经常被当成一回事,直到一次赶工期出了问题。厂长催工匠加速,工匠说:我本子上翻不到这个船型的前半截数据,我得从头算。厂长指着墙上的标准船头图说:这段不是贴在墙上了吗?工匠解释:墙上的是船头的标准加工模板,我本子里的是龙骨从头到尾的力学计算过程——船头那段确实有模板,但从船头往后三分之一处开始,每一根肋位的数据都不一样。

后来厂里做了清晰的分工。工匠笔记本负责同一条船的计算复用——全长度的、逐位置的、不可分割的连续计算过程。车间墙上的标准图负责不同船之间的共性段复用——只看前缀段、跨船共用、用一次换下一个。两项并行,但谁也别假装能替代对方。

一次接了个大单,需要同时造四条不同规格的船。笔记本复用让每条船的龙骨计算量减了六成,墙面复用让四条船的船头段人工几乎归零。厂长后来在扩建计划里专门给墙和笔记本各列了一行预算。

年终总结时技术员画了一张图:笔记本对应推理引擎内部的 KV Cache——在生成序列内部避免重复计算;墙面模板对应服务层前缀缓存——跨请求复用公共前缀。两条线用的是同一批木材,但管数据的是两个不同的人、依赖的是两套不同的查找逻辑。

KV Cache

Transformer 模型在自回归生成过程中,将已计算的注意力键值对存储下来,避免每个新 token 都重新计算历史序列的注意力。

前缀缓存

在推理服务层,将多个请求共享的 prompt 前缀的 KV Cache 缓存在内存或磁盘中,不同请求复用同一段前缀的计算结果。

故事对应

  • 工匠笔记本记录龙骨全程计算数据:KV Cache,序列内部的逐位置计算复用
  • 车间墙面标准船头模板:前缀缓存,跨请求共享公共前缀段的计算结果
  • 笔记本翻不到前段但墙面有:两种缓存作用在不同的范围上
  • 四条不同规格船同时造:两种缓存并行工作,降低不同层面的计算量

落到 Agent 项目里

评估推理加速方案时,先问清楚优化的是哪个层级。KV Cache 优化靠推理引擎参数调整和显存管理;前缀缓存优化靠服务层调度策略——系统提示词、共享上下文的复用逻辑。两个方向各自独立评审预算,别把前缀缓存的加速率当成推理引擎本身变快了。一个管显存里的连续状态,一个管请求间的共同起点。