缓存统治一切:当AI开始"记住"你说过的每一句话
来源: easy-learn-ai commit
515b759灵感: Anthropic 工程师关于 Claude Code 提示词缓存设计的最佳实践分享
一、一个问题:为什么跟AI聊越久,它越"慢"?
想象一下这样的场景。
你跟一个聪明绝顶的朋友聊天,聊了一个下午,谈了二十几个回合。每次你说完,他都陷入沉思——然后你发现,他不是在思考你刚说的那句,而是在把你们下午聊过的所有内容,从第一句话开始,一字不差地重新在脑子里过了一遍。
你会觉得他疯了。
但这就是今天几乎所有大语言模型的工作方式。
每次你发一条新消息给AI,后台都要把你发过去的所有文本——系统指令、历史对话、工具定义、新消息——从头到尾重新编码一遍。这个过程叫 Prefill(预填充),是延迟和花钱的大头。
你跟它聊20轮,第20轮的请求里前19轮跟上次一模一样。但模型还得从第一个字重新算一遍,白白做了19轮重复劳动。
这不是优化问题。这是结构性的浪费。
二、提示词缓存:给AI装上"速记本"
提示词缓存(Prompt Cache)就是来解决这个的。
原理一句话:你在请求里标一个断点。后台就把从开头到这个断点之间的编码结果存下来。下次前缀完全一样,直接复用,跳过重复计算。
打个比方。你每次写论文都要重抄目录和前几章再接新内容。有了缓存,相当于抄过的部分直接快进,只写新的那一段。
但这不只是"省点时间"的小把戏。让我们看看真实的账本。
三、数字不会说谎:90%的成本可以省掉
Anthropic 公开了几组关键比例:
- 命中缓存的部分,价格打一折(读缓存 = 原价的10%)
- 首次写入多花25%(写缓存 = 原价的125%)
- 后续每次省90%
默认存5分钟。5分钟内有请求就自动续期,不额外收钱。也可以选1小时的付费版本。
不过有个门槛——内容太短缓存不上。一般至少要1024个token,新一点的模型要4096个。短prompt没缓存的份。
举个实在的例子。10万字的长对话。
不开缓存,Claude Sonnet 每轮要花 0.30美金。开了缓存,首次 0.375美金(多花25%),之后每轮只要 0.03美金。聊10轮,省下大约 90% 的输入成本。
而且不光省钱。延迟也降下来了——不用重算的部分越多,第一个字出来得越快(TTFT,Time To First Token)。
这还没完。Anthropic 内部把缓存命中率当基础设施级别的指标在看。地位跟服务器在线率差不多。命中率一掉,触发值班告警,工程师得当线上事故处理——原文用的词是"宣布分级事故"(declare SEVs)。
更关键的是,命中率高,不光省钱,还直接影响用户体验——它让 Anthropic 能给付费用户更宽松的使用额度。缓存命中率越高,你在同样的价格下,能用得越多。
所以缓存对 Claude Code 来说,不是锦上添花的优化。是整个系统能跑起来的前提。没有缓存,就没有 Claude Code。
四、核心原理:前缀匹配
理解提示词缓存,只需要记住四个字:前缀匹配。
下一次请求的前缀跟上次一样,就能复用之前的计算。但这也意味着——前缀里任何位置的变化,都会让其后所有内容的缓存失效。
就像一根链条。中间任何一个环改了,从那里往后的所有环都要重做。
既然缓存靠前缀匹配,那提示词里东西的排列顺序就至关重要了。Anthropic 的最佳实践是这样排的:
| 层级 | 内容 | 共享范围 |
|---|---|---|
| 第1层 | 系统指令 + 工具定义 | 所有会话共享 |
| 第2层 | 项目文档(CLAUDE.md) | 同一个项目内共享 |
| 第3层 | 当前会话的上下文 | 只在这一次对话里有效 |
| 第4层 | 聊天消息 | 逐轮增长,每轮只新增最后一条 |
一句话——越不容易变的东西,越往前放。
就好比收拾书桌。常年不动的参考书放最底层。这周要看的资料放中间。今天写的草稿放最上面。这样你每天坐下来才不用把整张桌子翻一遍。
五、七个坑:Anthropic 踩过的雷,你别再踩
坑①:在固定指令里嵌了当前时间
每秒都在变,缓存直接废掉。
解法:别去改系统指令,把更新塞进下一轮的消息里。在下一条用户消息里附上一段"系统提醒",把要更新的信息夹带进去。系统指令当地基,钉死不动;消息当流水,想怎么改怎么改。
坑②:工具定义用无序容器来装
每次发请求顺序都不一样,前缀对不上。
解法:工具定义必须保持固定的、确定性的顺序。
坑③:工具参数改了
哪怕只动一个字段,整条前缀的缓存全失效。
直觉陷阱:当前任务只需要3个工具,把另外30个移走,不更干净吗?
真相:工具定义是缓存前缀的一部分。加一个,减一个,缓存就断了。一断,就是整个对话的缓存全部重建。代价远远超过多放几个工具定义占的那点空间。看着像优化,结果是添乱。
坑④:换模型
你可能会想。简单问题切到小模型省点钱。难题再切回大模型。多合理啊。
但现实是。**缓存是跟模型绑定的。**换模型,等于之前积攒的所有缓存全部作废,从头重建。重建的成本,往往比让大模型直接回答那个简单问题还要高。
所以 Claude Code 的策略是——**主对话自始至终用同一个模型。**需要小模型干活的时候?派子任务。子任务有自己独立的上下文和缓存,不会污染主对话的缓存链。
具体做法是:让主模型先写个任务交接说明,把上下文浓缩好。然后传给子任务去执行,做完只把结果传回主对话。你不会为了省事让实习生坐到你工位上用你的电脑。而是给他分配一台独立的机器,把任务说明写清楚发过去,做完把结果发回来。
账号警告:缓存是按账号隔离的。有人想用账号池搞中转。账号池一混,命中率过低,钱没赚到反而把号搞没了。
坑⑤:规划模式的工具切换
Claude Code 有个"规划模式"。进入后模型只思考、只规划,不执行操作。
按直觉的做法:进规划模式就把执行类工具移走,退出来再加回来。
但 Anthropic 没这么干。他们的做法是保留所有工具不动。另外加了两个特殊工具——"进入规划"和"退出规划"。模型调用"进入规划"就切到思考模式。调用"退出规划"就回来。
那"规划模式下不能执行"这个约束怎么传达?通过在对话中插一条系统消息,告诉模型你现在在规划。
注意——是在对话流里插一条消息,不是去改系统指令。这两个东西要分清。系统指令是固定的,在缓存前缀里。对话消息是流动的,不影响前缀。这样工具集始终不变,缓存始终有效。
而且还带来一个额外好处:模型可以自己判断什么时候进规划模式——遇到复杂任务,它自己先想清楚再动手,不用你手动切换。
坑⑥:几十个工具全部塞进去
Claude Code 可能要接入几十个外部工具。全部完整定义塞进去?太占空间。按需加减?又破坏缓存。
Anthropic 找到的折中方案,叫延迟加载(Lazy Loading)。
一开始只放一个轻量的占位符。模型看到的只是工具名字,不含完整的参数定义。等模型真要用某个工具了,再通过"工具搜索"功能去拉取完整定义。
好处是。前缀始终只包含那些轻量占位符,不会因为加载了某个工具就变化。缓存稳稳的。
相当于图书馆的书目索引。你先翻目录,找到想看的书再去书架取,不用把所有书都搬到桌上。
值得一提的是,这个工具搜索功能已经通过接口对外开放了。开发者可以直接用,简化自己的工具管理。
坑⑦:上下文压缩另起炉灶
长对话跑久了,上下文窗口会被填满。这时候要把之前的对话压缩成摘要,腾出空间继续聊。
但问题来了。如果你另起一个请求做压缩,用了不同的系统指令,没带工具定义。那从第一个字开始,就跟主对话的缓存对不上。两条缓存链,互相不复用。
而且你要把整段对话发过去做摘要。这时候你付的是完整的、没有缓存折扣的费用。对话越长越贵。
Anthropic 的解决方案叫**"缓存安全分叉"(Cache-Safe Forking)**。
压缩请求必须用跟主对话完全一样的系统指令、用户上下文、工具定义,把主对话的消息作为历史带上。然后在末尾追加一条压缩指令,作为新的用户消息。
从后台视角看,这个请求和上一次几乎一模一样。相同的前缀,相同的工具,相同的历史,所以前缀缓存可以直接复用。新增成本,只有最后那条压缩指令本身。
同时还要预留一个压缩缓冲区,给摘要输出留够空间。不能等窗口填满才开始压缩,要提前留余量。
一个压缩操作,能复用主对话积攒的全部缓存。几乎不多花钱。
六、回头再看:所有经验都在说同一件事
回头看这7条经验,都在说同一件事——缓存就是前缀匹配。
- **前缀匹配决定一切。**前缀里任何位置的变化,都会让其后所有内容的缓存失效。
- **用消息代替指令修改。**要切换模式、要更新时间,把这些塞进对话消息,别去动系统指令。
- **不要在对话中途切换工具或模型。**用工具来表达状态转换,用延迟加载代替工具的增删。
- **像监控在线率一样监控缓存命中率。**Anthropic 对缓存中断发告警,当线上事故处理。
- **分叉操作必须共享主对话的前缀。**压缩、摘要、子任务,全部用相同的参数。
所有的设计,都要围绕这一个约束来展开。别改指令,别动工具——一碰,整条缓存链就断。换模型、切账号、另起炉灶,同一个道理。
这看着像缓存优化。但讲的也是一种思路——先认死那条绕不开的限制,再围着它把整个系统搭起来。
七、为什么这很重要?
提示词缓存不是什么边缘优化。它是AI Agent时代的基础设施。
没有它,每一个AI编程助手、每一个多轮对话系统、每一个工具调用密集的智能体,都会在成本和延迟的双重压力下窒息。10万字的长对话每轮0.30美金,聊100轮就是30美金——这还不包括输出token的费用。
有了它,同样的对话,成本可以降到原来的十分之一,响应速度快到用户感觉不到等待。
工程界有句老话,叫"缓存统治一切"。到了AI Agent时代,这话还是对的——只是这次的缓存,缓存的不是网页,不是图片,而是AI思考到一半的状态。
📌 这篇文章的内容源自 easy-learn-ai 项目的"轻松理解 Prompt Cache"互动教程,这是一个包含15个章节、音频旁白和舞台动画的沉浸式学习体验。如果你对技术细节感兴趣,不妨去亲身体验一下。
#easy-learn-ai #每日更新 #记忆 #小凯 #prompt-cache #AI基础设施
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。