第一句很快,第五句开始等

店里的语音问答、导购屏、自助查询机,刚装上的时候演示效果都很好。用一阵子会遇到一种典型情况:第一句问「有没有无糖的」,秒答;问到第五句,回答开始一顿一顿的;同时有别人也在用,就更明显。

这个现象通常跟网速无关,跟模型大小关系也不大。它来自逐字生成这件事本身。

每回答一个字,都要回看前面所有字

大模型说话是一个字一个字往外蹦的。每蹦一个字,都要把前面已经出现的内容重新「看」一遍,这是注意力机制的基本动作。如果每生成一个字都真的从头重算,生成第一百个字时的计算量就是第一个字的一百倍。

工程上不会这么干,做法是把前面每个字算好的中间结果存下来,下次直接用。这份存下来的东西叫 KV 缓存——它把重复计算换成了重复读取。

代价是它边跑边长大:对话越长、同时问的人越多,这份缓存占的内存就越大。

内存是被谁吃掉的

一台门店设备的内存池子就那么大,里面住着收银软件、打印、界面渲染、后台同步,还有这个问答服务。

  • 第一轮问答,缓存很小,几乎感觉不到。
  • 问到第五轮、第十轮,缓存已经积累成可观的一块。
  • 同时有两三个人在用(比如一台查询屏被两组顾客先后操作),这块占用还要乘上几路。

占用上去之后,表现不是「报错」,而是变慢:内存紧的时候系统开始腾挪、换进换出,每次生成的间隔被拉长。顾客的感觉是「它卡住了」,店员的感觉是「这设备不行」。

省内存的方向:缓存也用低位存

既然瓶颈在内存,一个自然的做法是让缓存也不按高精度存,改成低位整数,也就是 KV 缓存量化。

它跟压权重不是一回事,难点也不一样:

  • 权重训练完就固定,范围可以提前统计;缓存是运行时现场生成的,只能现算。
  • 缓存里同样会出现离群值,一个很大的数能把整段的取值范围撑开,把其他数值挤进很粗的格子。
  • 缓存会被反复读取,早期存下来的误差会随着回答变长往后传。

第三点意味着:这种做法的效果要在长对话里才测得出来,问一两句看不出区别。最近有厂商把「缓存里哪一段用几位」从人工设定改成自动决策——NVIDIA 的 Model Optimizer 在 2026 年 10 月公布的 AutoQuant KV 走的就是这条路线,目标是既省内存,又不用工程团队逐层去调。

门店和采购该问的三件事

  1. 能同时服务几路。 不是问「支持多少种问法」,而是问「同时三个人问,响应会慢成什么样」。这个数字才决定店里够不够用。
  2. 对话多长开始退化。 让演示方当场连续问十轮,比较第十轮和第一轮的响应间隔。只演示第一句快,说明不了问题。
  3. 缓存占多少内存,留给收银软件的还剩多少。 端侧设备上这部分内存是共享的,占多了代价会转移到收银软件上(这一层的细节可以看 把模型放进店里的代价)。

现场能做的粗略判断

  • 让设备连续问同一个话题十轮,中间不停,记录每轮从说完到开始出声的间隔。
  • 同时开两三个会话,再测一遍。
  • 断网测一次:本地推理的方案,断网不应该变慢;如果变慢,说明它其实在等云端。
  • 重启后第一轮明显很快、越问越慢,基本就是内存压力,不是网络问题。

适用范围

单轮功能用不上 KV 缓存,比如识别一张图、查一个价格、做一次检索——这些场景没有「前面说过的话」,也就没有这份不断长大的开销。缓存量化要解决的问题,只出现在多轮、长对话、并发同时成立的场合。门店里符合这个条件的,是语音问答、导购助手、客服终端这一类常驻服务。


火眼识别提供端侧视觉引擎与设备管理平台,相关方案见 火眼识别官网。