玩转大模型01 大模型也能命中缓存?从KV Cache 到 Prompt Cache
在使用大模型的时候,除了看模型的性能表现,价格(成本)也是一个很重要的参数,不知道你有没有留意过,在大模型 API 价格中,输入价格会分为两种,缓存命中和缓存未命中,缓存命中的时候,价格会更便宜。不仅如此,命中缓存也能减少整体的耗时。这是如何工作的呢?
简介
在使用大模型的时候,除了看模型的性能表现,价格(成本)也是一个很重要的参数,不知道你有没有留意过,在大模型 API 价格中,输入价格会分为两种,缓存命中和缓存未命中,缓存命中的时候,价格会更便宜。不仅如此,命中缓存也能减少整体的耗时。
如何命中缓存?
以下以 OpenAI 的机制为例,不同厂商实现机制可能不同,但大体上不会相差很多。
缓存命中是按提示词精确前缀匹配,因此想要命中缓存,需要将静态内容,比如指令、示例放在提示词的开头。
对于缓存也有一些条件和限制,对于 prompt 必须超过 1024 个 token,并且增长间隔是 128。在高峰期缓存仅会生效 5 - 10 分钟,但是在非高峰期可以达到 1 个小时
利用 Prompt Cache 这一特性,在编写 prompt 时应该遵循:将静态的内容放在前面(比如角色指定、固定的输出格式、指令等等),动态的内容放在后面(如用户的问题)。同时作为应用系统可以监控缓存命中率等指标,来优化提示词。
提示缓存是如何工作的?
注意这一部分需要对注意力机制有一定了解
提示缓存最早在 2023 年这篇论文中提过:Prompt Cache: Modular Attention Reuse for Low-Latency Inference,本质上就是空间换时间的思路,在不损失推理效果的前提下,做到尽可能的提高推理速度、降低延迟。
概括来说,提示缓存就是在推理阶段,以文本片段为单位,把频繁出现的文本段对应的注意力状态存储下来,在下一次推理的时候,遇到相同文本段可以直接使用上一次存储的注意力状态。
众所周知,LLM 的工作方式就是在推理阶段,把生成的 token 跟输入拼在一起,然后继续生成下一个 token,直到结束。在自回归模型最初的版本,每生成一个新的 token 需要重复计算注意力状态,那能不能把这些注意力状态存储起来,在生成下一个 token 时直接复用呢?可以,这就是 KV Cache 的思想。
但 KV Cache 的局限在于它只能在同一条序列中使用,Prompt Cache 更进一步,把注意力状态从单条序列中解放出来,并用到其他序列中。
也正是因为 LLM 这一工作机制,只有满足提示词的精确前缀匹配,才能实现提示缓存。