一、为什么聊得越久越慢
长对话变慢,通常不是因为模型"累了",而是历史越长,每轮要重算的 token 越多。
KV 缓存就是为了避免重复计算:把已经算过的键值存起来,下一轮直接复用。
聊得越久越慢,原因在缓存。每轮对话,模型都要重新读一遍前面的所有内容。
为了不重复计算,系统会把前面内容的中间结果存起来,这就是 KV 缓存。
缓存让速度变快,代价是显存。对话越长,缓存越大,显存越紧。
二、缓存占的是显存
每个 token 的缓存大小与层数、注意力头数、精度有关。
粗算一下:七 B 模型,上下文到三万 token,缓存可能占掉几个 G。加上模型本身,显存很快就满。
所以"能聊多长"经常被显存卡住,不是被窗口卡住。
三档尺寸:16、24、32。三档覆盖九成场景,多了反而管不住。
16 用在小按钮和表格,24 用在导航和卡片,32 用在空状态和功能入口。
每档都按像素对齐做,别做矢量再缩。缩出来的图标,边缘会糊。
三、三个省缓存的常见手段
一、量化缓存。把缓存从十六位降到八位,显存减半,质量损失通常很小。
二、分页管理。像操作系统管内存一样按页分配,减少碎片。
三、共享前缀。多轮对话里系统提示相同,前缀部分可以共享,不重复存。
第三点对客服类应用最有效,因为系统提示很长且固定。
三个省缓存的常见手段,各有代价。
一是分组查询注意力,把缓存的头数减少,效果损失不大,这是目前最普及的做法。
二是量化缓存,把缓存压到 8 位甚至 4 位,显存立省一半以上,长对话的精度会掉一点。
三是滑动窗口,只保留最近若干轮的缓存,超出部分丢弃或摘要。这个最省,也最容易丢信息。
四、什么时候该清空重来
三个信号:
一、对话开始跑题,且纠正两次没回来;
二、上下文接近窗口上限,回答开始丢细节;
三、任务阶段切换,之前的内容已无用。
清空重来的成本,通常比在长历史里硬撑低。
线宽统一是图标整洁的关键。同一套图标,线宽要么都是两像素,要么都是一点五。
混着用,放在一起就会显得有的重有的轻,非常明显。
还有一个细节:圆角半径也要统一。方角混圆角,风格就散了。
五、部署时的实际配置
按场景定三个数:最大上下文、缓存精度、并发数。
三者互相挤占显存。并发高就要压上下文,上下文长就要减并发。
先用真实并发压测,再定这三个数,别按宣传参数配。
部署时的实际配置,我一般这么算:先定并发数,再定单会话长度,两个乘起来就是缓存上限。
比如十并发、每个会话两千 token,缓存就要按两万 token 的量预留显存。
预留不够的表现是:单聊很快,一多人就排队。很多人以为是算力不够,其实是显存被缓存占满了。
六、一句提醒
KV 缓存是性能优化,不是免费的。它把计算换成了显存。
一句提醒:长对话不是免费的。
如果你的场景是客服、助手这类长会话,缓存管理比模型选型更影响体验。
同一台机器,缓存策略调对了,能撑的并发可能翻倍。这件事值得花时间。
命名用「类别_名称_尺寸」,别用序号。
序号过两周就没人认得了,名称永远认得。
这套命名还能直接支撑批量导出。脚本按类别分目录,交付时省一半时间。
最后提醒:图标不要做太满。留白不够,缩小之后会糊成一团。
四比一的视觉密度,是比较稳的比例。
再补一句:图标要多做一版「小尺寸简化版」。16 像素下,细节全丢,只留轮廓。
两版一起交付,比一版缩放可靠。
再补一句:图标最好做一版「单色版」。很多场景下彩色不可用,单色才是通用形态。
单色版还能当水印、当遮罩用,复用率很高。
做一套图标,其实是在做一套系统。
再补一句:图标别用渐变。小尺寸下渐变会糊。
纯色最稳。
克制是图标的第一美学。
延伸参考
推理和模型相关的名词,前端 Wiki 里的解释短而准。
留一句:判断一个推理服务做得好不好,看它在长对话下的显存曲线。