KV 缓存:为什么聊得越久越慢

一、为什么聊得越久越慢

长对话变慢,通常不是因为模型"累了",而是历史越长,每轮要重算的 token 越多。

KV 缓存就是为了避免重复计算:把已经算过的键值存起来,下一轮直接复用。

聊得越久越慢,原因在缓存。每轮对话,模型都要重新读一遍前面的所有内容。

为了不重复计算,系统会把前面内容的中间结果存起来,这就是 KV 缓存。

缓存让速度变快,代价是显存。对话越长,缓存越大,显存越紧。

二、缓存占的是显存

每个 token 的缓存大小与层数、注意力头数、精度有关。

粗算一下:七 B 模型,上下文到三万 token,缓存可能占掉几个 G。加上模型本身,显存很快就满。

所以"能聊多长"经常被显存卡住,不是被窗口卡住。

三档尺寸:16、24、32。三档覆盖九成场景,多了反而管不住。

16 用在小按钮和表格,24 用在导航和卡片,32 用在空状态和功能入口。

每档都按像素对齐做,别做矢量再缩。缩出来的图标,边缘会糊。

三、三个省缓存的常见手段

一、量化缓存。把缓存从十六位降到八位,显存减半,质量损失通常很小。

二、分页管理。像操作系统管内存一样按页分配,减少碎片。

三、共享前缀。多轮对话里系统提示相同,前缀部分可以共享,不重复存。

第三点对客服类应用最有效,因为系统提示很长且固定。

三个省缓存的常见手段,各有代价。

一是分组查询注意力,把缓存的头数减少,效果损失不大,这是目前最普及的做法。

二是量化缓存,把缓存压到 8 位甚至 4 位,显存立省一半以上,长对话的精度会掉一点。

三是滑动窗口,只保留最近若干轮的缓存,超出部分丢弃或摘要。这个最省,也最容易丢信息。

四、什么时候该清空重来

三个信号:

一、对话开始跑题,且纠正两次没回来;

二、上下文接近窗口上限,回答开始丢细节;

三、任务阶段切换,之前的内容已无用。

清空重来的成本,通常比在长历史里硬撑低。

线宽统一是图标整洁的关键。同一套图标,线宽要么都是两像素,要么都是一点五。

混着用,放在一起就会显得有的重有的轻,非常明显。

还有一个细节:圆角半径也要统一。方角混圆角,风格就散了。

五、部署时的实际配置

按场景定三个数:最大上下文、缓存精度、并发数。

三者互相挤占显存。并发高就要压上下文,上下文长就要减并发。

先用真实并发压测,再定这三个数,别按宣传参数配。

部署时的实际配置,我一般这么算:先定并发数,再定单会话长度,两个乘起来就是缓存上限。

比如十并发、每个会话两千 token,缓存就要按两万 token 的量预留显存。

预留不够的表现是:单聊很快,一多人就排队。很多人以为是算力不够,其实是显存被缓存占满了。

六、一句提醒

KV 缓存是性能优化,不是免费的。它把计算换成了显存。

一句提醒:长对话不是免费的。

如果你的场景是客服、助手这类长会话,缓存管理比模型选型更影响体验。

同一台机器,缓存策略调对了,能撑的并发可能翻倍。这件事值得花时间。

命名用「类别_名称_尺寸」,别用序号。

序号过两周就没人认得了,名称永远认得。

这套命名还能直接支撑批量导出。脚本按类别分目录,交付时省一半时间。

最后提醒:图标不要做太满。留白不够,缩小之后会糊成一团。

四比一的视觉密度,是比较稳的比例。

再补一句:图标要多做一版「小尺寸简化版」。16 像素下,细节全丢,只留轮廓。

两版一起交付,比一版缩放可靠。

再补一句:图标最好做一版「单色版」。很多场景下彩色不可用,单色才是通用形态。

单色版还能当水印、当遮罩用,复用率很高。

做一套图标,其实是在做一套系统。

再补一句:图标别用渐变。小尺寸下渐变会糊。

纯色最稳。

克制是图标的第一美学。

延伸参考

推理和模型相关的名词,前端 Wiki 里的解释短而准。

前端 Wiki

留一句:判断一个推理服务做得好不好,看它在长对话下的显存曲线。