什么是 KV Cache?大模型为什么聊天越长越占显存
KV Cache 是什么?它如何让大模型避免重复计算、为何长上下文会占显存、和上下文窗口及提示词缓存有什么区别,一文讲清。
你和大模型聊天时,模型生成下一个词需要回看前面的内容。如果每输出一个词,都从头把整段对话重新计算一遍,速度会越来越慢。KV Cache 就是为避免这种重复计算准备的“草稿纸”。
它能让生成变快,却也解释了另一个现象:为什么聊天越长、并发越多,服务越容易吃光显存。
一句话理解:把已经读过的内容做成索引卡
Transformer 在处理一句话时,会用注意力机制判断“当前这个词应该关注前面哪些词”。其中会产生两类中间结果:Key(键) 和 Value(值)。
生成到下一个 token 时,前面文字对应的 Key 和 Value 大多不需要改变。KV Cache 就把它们保存下来;新 token 只需要计算自己的部分,再去查询已有缓存。
可以把它想成读书时做的索引卡:读到下一页时,不必重新把前几百页读一遍,翻索引卡就能找到相关内容。
它让生成快在哪里
大模型推理通常分为两段:
- 预填充(prefill):第一次读入用户的完整提示词,建立前文的 KV Cache
- 生成(decode):一个 token 一个 token 往后写,每次复用已缓存的前文,只计算新 token
没有缓存时,生成第 100 个 token 需要反复计算前面 99 个;有缓存后,前面部分直接复用。这是聊天机器人能以较流畅速度逐字输出的基础优化之一。
为什么它会占显存
缓存不是免费午餐。每一层网络、每一个 token 都要存一份 Key 和 Value;模型层数越多、隐藏维度越大、上下文越长,KV Cache 就越大。
因此显存的压力不只来自模型参数,还来自:
- 输入和历史对话有多长
- 一次同时服务多少用户
- 每个用户生成的回答有多长
- 模型本身的层数和结构
这也是很多服务会限制上下文长度、长对话会更慢、超长上下文档位更贵的工程原因。理解上下文窗口后,就更容易理解这层成本:窗口定义了“最多能放多少纸”,KV Cache 则是“这些纸在运行时要占多少抽屉”。
它和提示词缓存不是一回事
名称很像,但层次不同:
| 概念 | 主要目的 | 谁在用 |
|---|---|---|
| KV Cache | 复用当前生成过程的注意力中间结果 | 推理引擎 |
| 提示词缓存 | 复用重复输入的前缀,减少 API 计费或预填充 | 服务提供商与调用者 |
| 浏览器缓存 | 复用网页资源 | 客户端 |
KV Cache 往往只与当前请求或会话生命周期有关;提示词缓存可能跨请求复用相同的系统提示词、文档前缀或工具定义。它们都在避免重复工作,但不是同一项技术。
可以怎么优化
工程团队常用的办法包括:
- 缩短无用上下文:不把整段聊天历史永远塞回模型,而是总结、筛选或按需检索。
- 共享相同前缀:多个请求有相同系统提示词或文档开头时,尽量复用。
- 分页与淘汰:像操作系统管理内存一样,把暂时不常用的缓存移出显存或删除。
- 压缩缓存精度:类似量化,用更少的位数保存缓存以省空间,但要控制质量损失。
- 用 RAG 代替“全都塞进提示词”:先检索相关片段,再放进上下文,见什么是 RAG。
对普通用户意味着什么
如果你在用 API 或搭建 Agent,最直接的建议是:不要无限累积聊天记录。把稳定偏好保存成简短的AI 记忆,把外部知识放进检索系统,把当前任务真正需要的信息留在上下文里。
这样不仅减少成本和延迟,也能降低模型被旧信息干扰的概率。上下文更长不等于回答必然更好;相关、干净、结构清楚的上下文通常更有价值。
总结
KV Cache 保存了模型已经读过内容的 Key 和 Value,让它在逐 token 生成时不用反复计算前文,是大模型流畅输出的关键。代价是它会随上下文长度、模型规模和并发数不断占用显存。
理解它,就能看懂一个看似矛盾的事实:让模型“记得更多”可以更连贯,但也会更慢、更贵。好的 AI 系统不是无限堆历史,而是让每一段进入上下文的信息都值得占用那份缓存。