LLM serving的四种缓存技术,清晰解释:
每个LLM请求都需要读取整个提示并计算每个token的注意力状态。
这一步叫做prefill,它既影响输入账单,也影响第一个token出现的时间。
在agent循环中,大部分提示由模型在上一轮已经处理过的文本组成。
有四种缓存层可以防止为已处理的token重复付费。
↳ KV缓存:为每个活跃请求保存每个层每个token的键值张量。
↳ 前缀缓存:在服务器上保存这些张量。vLLM将它们存储在16个token的块中,并通过链接前一个块的哈希来标识每个块,因此只有当块之前的所有内容都匹配时,块才会匹配。调度器在第一次未命中时停止,并从那里预填充后缀。
↳ 提示缓存:在提供商硬件上运行的相同重用,附带价格表。Anthropic收取1.25倍的基础输入费率来写入条目,0.1倍来读取它。
↳ 语义缓存:工作方式不同。它嵌入传入的提示,对存储的提示运行相似性搜索,当分数超过阈值时直接返回存储的答案。
这就是为什么它节省输出token以及输入token。这也是为什么每个请求都支付嵌入往返费用,包括每次未命中。
前三个在精确token上匹配,不会改变模型的产生。
这种技术在相似性上匹配,这意味着它很容易生成错误的响应,因为嵌入可能匹配到错误的提示。
要使用这些技术,你不需要构建自定义服务堆栈。
transformers库已经将缓存实现为可以保留的KV向量对象,因此你可以预填充一次语料库,保留返回的张量,并在大约十行代码中跨查询重用它们。
这个KV缓存只是LLM堆栈中四个独立缓存层中的一个。
其他三个是服务器上的前缀缓存、提供商计费的提示缓存,以及跳过模型本身的语义缓存。
我写了LLM serving中所有四种缓存的完整细分,作为AI工程师你应该知道的,每种都有代码。
这个思路很有意思。我们平时用各种 Skill,感觉它们各有各的用处,但本质上都是在做同一件事:给 AI 划定一个明确的工作范围,让它在这个范围内发挥最大效能。
就像 Harness 一样,它不是限制 AI 的能力,而是引导 AI 的能力。一个好的 Skill 会告诉你:这个任务该怎么做、不该怎么做、边界在哪里、输出格式是什么。
这种边界约束的设计思路,其实和软件工程里的模块化设计很像。每个模块都有明确的输入输出接口,内部实现可以灵活变化,但对外的契约是固定的。
对于想要提升AI开发效率的开发者来说,这个设计思路值得关注。即使你现在用的是其他AI方案,也可以通过这个思路来对比一下效果。在AI开发这个领域,多了解一种方案总是好的。
话题来源 @_avichawla
55.8K阅读 ❤️472 x.com/…↗ 已改写,非原文转载
17 浏览 0 评论
0 反应












