解释提示缓存如何在大型语言模型(LLM)中工作,以Claude为案例,详细说明Transformer的KV缓存机制以及在代理工作流中缓存静态前缀的成本效益。
摘要
解释提示缓存如何在大型语言模型(LLM)中工作,以Claude为案例,详细说明Transformer的KV缓存机制以及在代理工作流中缓存静态前缀的成本效益。
查看缓存全文
缓存时间: 2026/06/23 14:35
提示缓存,清晰解析
克劳德如何实现92%缓存命中率的案例研究
每当你使用AI智能体执行一步操作,你都要支付一笔“税收“。
它会从头重新读取所有内容。
系统指令。工具定义。它三回合前已经加载过的项目上下文。全部内容。每一回合都是如此。
这就是“上下文税“。对于运行时间较长的智能体工作流,这往往是你整个AI基础设施中最昂贵的开销项。
以下是计算:一个包含20,000个token的系统提示,运行50个回合,意味着100万个token的冗余计算,按全价收费,却没有产生任何新价值。
解决方案是提示缓存。但要有效使用它,你需要了解底层实际发生的情况。
从什么改变、什么不变开始
在优化任何东西之前,你需要清晰地思考智能体提示(上下文)的结构。
每个智能体发送的请求都包含两个截然不同的部分:
静态前缀: 包括系统指令、工具定义、项目上下文、行为指南。这部分内容在整个会话的每一回合中都完全相同。
动态尾部: 用户消息、工具输出、终端观察。这部分每个请求都是独特的,并且随着对话的进行而增长。
这个区别至关重要。静态前缀是你毫无理由重复计算的高昂部分。动态尾部才是唯一真正需要全新计算的部分。
提示缓存的原理是存储静态前缀的数学状态,使得未来的请求可以完全跳过重新计算。你为处理该前缀付费一次。后续每一回合都从内存中读取。
为什么这有效:Transformer实际做了什么
要真正理解缓存为何如此有效,你需要了解模型读取提示时内部发生的情况。
每个LLM推理请求都有两个阶段:
阶段1:预填充 (Prefill)
模型处理你的完整输入提示。这个阶段是计算密集型的,意味着它在上下文中的每个token上运行密集的矩阵乘法。模型读取所有内容并建立起它的表示。这是缓慢且昂贵的阶段。
阶段2:解码 (Decode)
模型逐个生成输出token。这个阶段是内存密集型的,而不是计算密集型的,因为模型大部分时间用于读取之前计算好的状态,而不是运行繁重的计算。
在预填充阶段,transformer为每个token构建三个向量:查询 (Query)、键 (Key) 和值 (Value)。注意力机制利用这些向量来计算每个token与序列中其他所有token之间的关系。
关键在于:键和值向量仅依赖于它们之前的token。 一旦为给定前缀计算完成,它们就永远不需要改变。
下面的插图直观地解释了刚才讨论的内容:
没有缓存时,这些键值张量在请求完成的那一刻就被丢弃了。下一个请求从头开始,再次为所有20,000个token重新计算。
KV缓存的解决方案就是存储这些张量。 基础设施将它们保留在推理服务器上,并通过输入文本的加密哈希值进行索引。当一个新的请求到来时,如果包含相同的前缀,哈希匹配,张量立即被检索,模型跳过所有这些计算。
这将每次生成token的计算复杂度从O(n²)降低到O(n)。对于在50个回合中重复使用的20,000 token前缀,这是一个巨大的减少。
经济学
理解定价结构是使这一架构决策如此重要的原因。
以下是Anthropic在其模型系列中为缓存定价的方式:
需要牢记的三个数字:
-
缓存读取成本为基础输入价格的10%,从缓存中读取的每个token享受90%折扣
-
缓存写入成本比基础输入价格高出25%,这是存储KV张量的小额溢价
-
延长至1小时的缓存成本为基础价格的两倍
只有你的缓存命中率保持高位,这个算数才成立。这就引出了实践中最好的例子。
Claude Code:一次30分钟会话的试走
Claude Code完全围绕一个目标构建:保持缓存“热“。
要具体理解这意味着什么,我们来追踪一次典型的30分钟编码会话,并精确记录哪些被收费、哪些没有。
第0分钟:会话开始
Claude Code加载其系统提示和工具定义。它还读取项目根目录下的CLAUDE.md文件,该文件描述了代码库和约定。这个负载通常超过20,000个token。
这是整个会话中最昂贵的时刻。每个token都是新的。但你在整个会话中只需支付这一次成本。
第1至5分钟:首批命令
你输入第一条指令,比如“查看认证模块并提出改进建议“。
Claude Code分派一个探索子智能体。它遍历代码库,打开文件,运行grep命令,并构建相关代码的概览。所有这些都会被附加到动态尾部。
那20,000 token的静态基础?已经在缓存中。以0.30/百万token的价格读取,而不是3.00/百万token。你只需为新的工具输出和你的消息付费。
第6至15分钟:深度工作
规划子智能体接收来自探索子智能体的发现。而不是逐字传递原始结果(这会使动态尾部不必要地膨胀),Claude Code传递一个简洁的摘要。这保持了后缀的可管理性和缓存的高效性。
规划器生成一个结构化的实现计划。你审查它、批准它,然后Claude Code开始进行修改。这个循环中的每一回合都从缓存中读取20,000 token的前缀。每次缓存命中重置TTL(生存时间),使缓存为后续回合保持“温暖“。
第16至25分钟:迭代
你要求调整。Claude Code修改其方法。更多的工具调用,更多的终端输出。动态尾部在增长,但它只代表本次会话中新的、独特的内容。
此时,会话已处理了总计数十万个token。但20,000 token的基础每回合都从缓存中读取。
第28分钟:运行/cost
没有缓存,这样一次会话很容易超过200万个token。按Sonnet 4.5的费率,大约6.00美元。
而缓存高效运行时:
-
绝大多数token以$0.30/百万token从缓存读取
-
只有新的动态尾部token是全新计算的
实际上,单一任务上预计可实现80%以上的成本降低。再乘以每个用户、每一天。
总结一下,随着会话的进行,系统提示布局如下所示(图表略):
打破一切的规则
以下是关于提示缓存最反直觉的一点。
1 + 2 = 3。但2 + 1是缓存未命中。
基础设施对提示进行哈希。哈希是一种加密标识符。如果顺序中任何内容发生变化(即使两个元素的顺序互换),哈希就会改变。缓存为空。整个前缀以全价重新计算。
由此得出的三条规则:
-
不要在会话中添加或删除工具。缓存的前缀包含工具。更改工具会使之后的所有内容无效。
-
不要在会话中间切换到其他模型。缓存是模型特定的。在对话中途切换到更便宜的模型需要重建整个缓存。
-
不要通过更改前缀来改变状态。相反,Claude Code会在下一条用户消息中添加一个标签来提醒系统。前缀永远不会改变。
这对你意味着什么
以上解释了Claude Code如何处理缓存。如果你自己构建智能体,同样的规则也适用。
以下是如何构造你的提示:
-
顶部是系统指令和规则。不要在中间更改。
-
提前加载你需要的所有工具。不要添加或删除它们。
-
之后是检索到的上下文和文档。在这段持续时间内保持静态。
-
底部是对话历史和工具输出。
启用自动缓存后,随着对话的进行,断点会自动前移。
Claude Code管理自己的缓存。Anthropic刚刚在其API中添加了自动缓存,因此你也可以为自己的智能体做同样的事情。
没有自动缓存时,你必须记住token边界在哪里。错误的边界意味着无法命中缓存。
使用缓存安全的分叉来压缩以适应上下文限制。使用相同的系统提示、工具和对话,然后将压缩指令作为新消息添加。
压缩调用看起来几乎与上一次一样。缓存的前缀再次被使用。唯一作为新内容计费的是压缩指令。
要检查API是否正常工作,请密切关注每个响应中的这三个字段:
-
cache_creation_input_tokens:被存入内存的token数量
-
cache_read_input_tokens:从内存读取的token数量
-
input_tokens:照常处理的token数量
你的缓存效率分数是比较读取token与创建token的数量。像监控正常运行时间一样密切关注它。
关键要点
提示缓存不是一个你需要开启的功能。它是一种你需要围绕其构建的架构纪律。
Claude Code是该领域大规模实践的最佳示例。
缓存命中率92%。成本降低81%。
如果你正在构建智能体,这就是蓝图。你无法忽视“上下文税“;它确实存在。唯一重要的是你是在为它付费,还是在消除它。
参考资料:
-
https://www.dailydoseofds.com/p/kv-caching-in-llms-explained-visually/
-
https://x.com/trq212/status/2024574133011673516?s=20
-
https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus
相似文章
@pallavishekhar_: 大语言模型中的 KV Cache,阅读链接:https://outcomeschool.com/blog/kv-cache-in-llms…
本文解释了大语言模型中 KV Cache 的概念,详细阐述了其通过存储和复用键值对以避免推理过程中的冗余计算,从而优化文本生成的原理。
@nateherk: https://x.com/nateherk/status/2057450555212013627
一份实用指南,解释Claude Code中的提示缓存工作原理,如何将Token成本降低90%,以及常见的破坏缓存的习惯,帮助开发者延长会话时长并降低成本。
探究提示KV缓存:何处变得可舍弃
本文系统性地探究了在LLM解码过程中,何时以及提示KV缓存的哪些部分变得可舍弃,表明冗余主要涉及聊天模板脚手架而非任务内容,并且用中性填充内容进行替换可保持准确性。
@che_shr_cat: 1/ 多年来我们一直通过头部共享(GQA/MQA)来优化KV缓存,但我们忽略了一个基本假设:为什么……
这条推文挑战了关于Transformer需要独立的Q、K和V投影的基本假设,提出合并它们可以为KV缓存带来巨大的内存节省。
@TheTuringPost: 为什么 KV cache 是 LLM 速度快的主要原因之一?KV cache 将注意力机制与生成阶段连接起来……
KV cache 在自回归生成过程中存储先前计算的键向量和值向量,使模型能够避免在每一步重新计算整个序列,从而显著加速推理,但代价是内存使用增加。