提示缓存是一项强大的优化功能,当您反复向Claude发送相同内容时,它能让请求变得更便宜、更快速。初始请求会写入缓存,而后续请求则可以从中读取。缓存的存活时间为5分钟,这非常有用,因为许多应用程序会反复发送相同的工具模式、系统提示或消息历史记录。

提示缓存的工作原理
当您将内容标记为需要缓存时,Claude会处理一次并存储结果。包含完全相同内容的后续请求可以跳过处理步骤,直接从缓存中读取。这只有在缓存内容完全相同的情况下才有效——哪怕是一个字符的改动也会使缓存失效。
您可以在单个请求中设置多个缓存断点。缓存遵循以下顺序:
- 工具模式(tool schemas)
- 系统提示
- 消息历史记录
设置工具模式缓存
要缓存工具模式,您需要在工具列表中的最后一个工具上添加一个cache_control字段。以下是在不修改原始工具模式的情况下正确实现这一操作的方法:
if tools:
tools_clone = tools.copy()
last_tool = tools_clone[-1].copy()
last_tool["cache_control"] = {"type": "ephemeral"}
tools_clone[-1] = last_tool
params["tools"] = tools_clone这种方法会在添加缓存控制字段之前,创建工具列表和最后一个工具模式的副本。这可以防止意外修改您的原始工具定义,否则在您之后重新排序工具时可能会出现问题。
系统提示缓存
对于系统提示,您需要将system参数构造为一个列表,其中包含一个带有缓存控制字段的文本块:
if system:
params["system"] = [
{
"type": "text",
"text": system,
"cache_control": {"type": "ephemeral"}
}
]理解缓存行为
当您首次发出包含可缓存内容的请求时,您会在usage字段中看到cache_creation_input_tokens。这表明Claude向缓存写入了多少令牌。在包含相同内容的后续请求中,您将看到cache_read_input_tokens。
如果同一请求中既有缓存内容又有新内容,您可能会同时看到缓存读取和缓存写入。例如,如果您保持相同的工具模式但更改了系统提示,您将从缓存中读取工具,同时将新的系统提示写入缓存。只有当工具单独的长度达到最小长度时,您才会获得这种部分读取,因为如果某个缓存断点截至该点的内容低于最小长度,则不会写入任何内容。
缓存失效
缓存对变化极为敏感。即使只在工具模式描述、系统提示或任何缓存内容中修改一个字符,也会使该缓存条目失效。当这种情况发生时,Claude会将其视为全新内容,并创建一个新的缓存条目。
这种敏感性意味着您应该谨慎考虑要缓存的内容。在多次请求中保持稳定的工具模式和系统提示是理想的缓存对象。频繁变化的动态内容则无法从缓存中受益。
实际实施
在实践中,您会希望默认在您的聊天函数中内置缓存功能。大多数应用程序会在多次请求中使用相同的工具模式和系统提示,这使它们非常适合进行缓存。当您使用相似内容发出大量请求时,性能和成本方面的收益将非常显著。
请记住,当您反复发送相同内容时,缓存才最具价值。由于这种情况在实际应用中发生得极为频繁——尤其是在工具模式和系统提示方面——在开发过程早期就实施缓存,将会随着应用程序的规模扩大而带来丰厚回报。