Prompt Caching in LLMs: Intuition
缓存在基于注意力的模型中的工作原理的简要概述
Prompt caching最近成为减少计算开销、延迟和成本的一项重大进步,特别是对于经常重复使用prompt的应用程序。
当有一个很长的静态预提示 (上下文) 并不断向其添加新的用户问题。每次调用 API 模型时,它都需要完全重新处理整个 prompt。
什么是Prompt caching?
Prompt caching是一种存储提示部分(例如系统消息、文档或模板文本)以供有效重用的技术。这样可以避免重复重新处理相同的提示结构,从而提高效率。
有多种方法可以实现 Prompt Caching,因此技术可能因提供商而异,但我们将尝试从两种流行的方法中抽象出概念:
整个过程如下:
- 当接收到prompt时,它会经过标记化、矢量化和完整的模型推理(通常是 LLMs)。
- 系统将相关数据(标记及其嵌入)存储在模型外部的缓存层中。标记的数值向量表示形式存储在内存中。
- 在下一次调用时,系统会检查新提示的一部分是否已存储在缓存中(例如,基于嵌入相似性)。
- 在缓存命中时,将检索缓存的部分,跳过分词化和完整模型推理。
缓存到底是什么?
在最基本的形式中,可以根据方法应用不同级别的缓存,范围从简单到复杂。这可能包括存储tokens、token嵌入,甚至内部状态,以避免重新处理:
- Tokens:下一个级别涉及缓存 prompt 的标记化表示,避免需要重新标记重复的输入。
- Token Encodings:缓存这些允许模型跳过重新编码以前看到的输入,只处理提示的新部分。
- Internal States::在最复杂的级别上,缓存内部状态(如键值对)(见下文)会存储令牌之间的关系,因此模型只计算新的关系。
缓存键值状态
在 transformer 模型中,令牌成对处理:Keys 和 Values
- Key:帮助模型决定每个 Token 应该给予其他 Token 多少重要性或 “关注度”。
- Values:表示令牌在上下文中提供的实际内容或含义。
例如,在句子 “Harry Potter is a wizard, and his friend is Ron” 中,“Harry” 的 Key 是一个向量,它与句子中的每个其他单词都有关系:
["Harry", "Potter"], ["Harry"", "a"], ["Harry", "wizard"], etc...
KV 提示缓存的工作原理
- Precompute and Cache KV States(预计算和缓存 KV 状态):模型计算和存储常用提示的 KV 对,使其能够跳过重新计算并从缓存中检索这些对以提高效率。
- Merging Cached and New Context (合并缓存和更新上下文):在新提示中,模型检索以前使用的句子的缓存 KV 对,同时计算其他新句子的新 KV 对。
- Cross-Sentence KV Computation (句子间 KV 计算):模型计算新的 KV 对,这些 KV 对将缓存的标记从一个句子链接到另一个句子中的新标记,从而能够全面理解它们之间的关系。