你的AI应用为什么这么贵?因为你不懂提示缓存

上周我一个做 AI 产品的朋友跟我抱怨,说他们公司的聊天机器人 API 费用每个月都要烧掉几十万,老板让他想办法降成本。

他说已经试过各种办法了,换便宜的模型、减少调用次数、优化提示词长度,但效果都不明显。

我问他有没有用提示缓存,他愣了一下说,缓存不就是把结果存起来吗,我们早就做了啊。

听到这里我就知道,他对提示缓存有个很大的误解。而这个误解,可能让他白白浪费了一半的成本。

提示缓存不是你想的那样

很多人一听到缓存这个词,第一反应就是把结果存起来。

就像数据库查询一样,你发一个 SQL 语句,数据库返回结果,然后把这个结果存到缓存里。下次有人再查同样的东西,直接从缓存里拿,不用再查数据库了。

这个逻辑用在 AI 上也一样对吧?用户问了一个问题,AI 给出答案,把答案存起来。下次有人问同样的问题,直接返回缓存的答案。

听起来很合理,但这不是提示缓存。

这叫输出缓存,是另一回事。输出缓存确实有用,但它解决不了大部分场景的问题。因为在真实应用中,用户很少会问完全一模一样的问题。

提示缓存缓存的不是结果,而是输入。

更准确地说,它缓存的是 AI 处理输入时产生的中间计算结果。

KV 键值对才是真正的秘密

要理解提示缓存,你得先知道 AI 在处理你的提示词时到底在干什么。

当你把一段提示词扔给大语言模型,它不是直接就开始生成回答的。它要先做一件很费劲的事情,叫做计算键值对,英文叫 KV pairs。

这些键值对是什么?你可以把它理解成 AI 对你输入内容的内部理解。每个词跟其他词是什么关系,哪些上下文是重要的,应该关注哪些信息。

而且这个计算不是做一次就完了,它要在每一层 Transformer 结构里,对每一个 token 都算一遍。如果你的提示词有几千个 token,模型有几十层,那就是几百万次的计算。

这个阶段叫预填充阶段,发生在 AI 生成第一个字之前。这个阶段很贵,很慢,但又必须做。

提示缓存就是把这些预计算好的 KV 键值对存起来。

一个 50 页的文档能省多少钱

对于简单的提示词,比如问巴黎的首都是哪里,缓存确实没什么用。处理几个 token 很快,不需要缓存。

但现实中的应用往往不是这样的。

假设你在做一个客服机器人,需要让 AI 熟悉你们公司 50 页的产品手册。你会把这个手册放到提示词里,然后让 AI 根据手册内容回答用户的问题。

第一个用户问,这个产品的保修条款是什么?

AI 要先处理这 50 页文档,计算几千个 token 的 KV 键值对,跨越几十层 Transformer,做几百万次运算,然后才能开始生成回答。

第二个用户问,这个产品的退货政策是什么?

如果没有提示缓存,AI 又要把那 50 页文档重新处理一遍,再做一次几百万次运算。

但如果用了提示缓存,系统会识别出那 50 页文档是一样的,直接从缓存里拿出之前计算好的 KV 键值对,只处理新的问题部分。

这能省多少时间和成本?至少一半以上。

什么东西适合放进缓存

最常见的缓存对象是系统提示词。

每个聊天机器人都有一段系统提示词,告诉它应该怎么表现。比如你是一个友好的客服助手,你应该礼貌专业,你不能讨论政治话题,等等。

这段系统提示词每次对话都要用,但内容从来不变。把它缓存起来,每次对话都能省一大笔计算。

除了系统提示词,还有很多东西适合缓存。

长文档,比如产品手册、法律合同、研究论文,任何你想让 AI 反复参考的材料。

少样本示例,就是你给 AI 看的几个例子,告诉它应该怎么回答问题。这些例子也是固定的,可以缓存。

工具和函数定义,如果你的 AI 需要调用外部工具,那些工具的说明文档也可以缓存。

甚至对话历史,如果你想让 AI 记住之前的对话内容,那些历史记录也可以部分缓存。

提示词结构决定缓存效果

但这里有个关键问题,AI 怎么知道哪些内容应该缓存?

答案是前缀匹配。

缓存系统会从你的提示词开头开始,一个 token 一个 token 地匹配。当它遇到第一个跟缓存里不一样的 token 时,缓存就停止了,剩下的部分正常处理。

所以提示词的结构非常重要。

假设你的提示词是这样组织的,先放系统指令,然后放那个 20 页的产品手册,再放几个示例,最后放用户的问题。

这个结构很好,因为所有静态内容都在前面。当下一个请求进来,只是问题不一样,缓存系统会匹配到前面所有的静态内容,只处理最后的新问题。

但如果你把问题放在最前面,那就完蛋了。因为每次问题一变,缓存立刻失效,后面所有内容都要重新处理。

缓存不是免费的午餐

虽然提示缓存很强大,但也不是随便用的。

首先,你的提示词得够长。一般来说至少要 1024 个 token 才值得缓存,因为太短的话,管理缓存的开销比节省的计算还多。

其次,缓存不会永久保存。大部分服务商会在 5 到 10 分钟后清理缓存,有些可以保留 24 小时。所以如果你的应用访问量很低,用户之间间隔太久,缓存可能早就失效了。

还有一点,不同的服务商对缓存的支持不一样。有些是自动缓存,你什么都不用做,系统会自动识别可以缓存的部分。但有些需要你在 API 调用时明确标记哪些内容应该缓存。

回到开头那个问题

我那个朋友听完之后,立刻回去重新设计了他们的提示词结构。

他把系统提示词和产品文档放到最前面,把用户问题放到最后。然后在 API 调用时启用了提示缓存。

一周后他给我发消息,说 API 费用直接降了 60%,响应速度还快了一倍。

老板以为他换了模型或者砍了功能,结果发现什么都没变,只是调整了一下提示词的顺序。

这就是提示缓存的威力。

写在最后

AI 技术发展得太快了,每隔几个月就有新概念冒出来。但很多时候,真正能帮你省钱提效的,不是那些最新最炫的技术,而是这些藏在底层的优化技巧。

提示缓存就是这样一个技巧。它不性感,不酷炫,但实实在在能帮你省一半的成本。

如果你也在做 AI 应用,不管是聊天机器人、文档总结、还是代码生成,都可以试试提示缓存。

记住三个要点就行了。

第一,提示缓存缓存的是输入的中间计算结果,不是输出。

第二,把静态内容放在提示词前面,动态内容放在后面。

第三,至少要 1024 个 token 才值得缓存。

做到这三点,你的 AI 应用就能又快又省钱。

如果你觉得这篇文章有用,欢迎转发给身边做 AI 的朋友。技术圈就是这样,一个小技巧能帮很多人省大钱。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐