Deep Agents 中的提示词缓存

在大规模、低成本运行 agent 时,一个很有力的杠杆是提示词缓存(Prompt Caching)。这是模型提供商提供的一项功能,可以把推理的 token 成本降低 41–80%。正如 Manus AI 所说

“如果只能选一个指标,我会说 KV-cache 命中率是生产阶段 AI agent 最重要的单一指标。”

不过,不同模型提供商支持的缓存控制策略各不相同,所以要做出一套不绑定具体提供商的缓存方案,会更棘手一些。

Deep Agents 是我们通用的、模型无关的 agent 运行框架,支持所有主要提供商的提示词缓存功能。我们接下来会深入看看 Deep Agents 如何用提示词缓存来降低 API 成本;但在此之前,先看看提示词缓存如何降低聊天模型对话里的 token 成本。

TL;DR:提示词缓存

聊天模型对话的 token 成本增长得很快。每出现一条新消息,模型都必须重新处理对话中此前的所有 token,包括:

  • 系统提示词
  • 工具描述
  • 已加载的技能
  • 消息历史
  • 新消息

当我们选择启用提示词缓存时,提供商会在处理完一段提示词后,把模型状态保存成一个快照:

下一次请求时,模型会从这个快照继续,只处理新文本。

不过,加载新的技能或工具,可能会修改对话中更靠前位置的提示词,从而让缓存失效。有些模型提供商允许我们在提示词的较早位置显式添加缓存断点,这样即使不能命中完整提示词,也能命中其中一部分,而不是整个缓存都失效。不过,并不是所有模型提供商都支持显式缓存断点:

Anthropic OpenAI Gemini Fireworks Baseten
显式断点

显式缓存也只是提示词缓存功能中的一种,而且不同提供商的支持情况差异很大:

Anthropic OpenAI Gemini Baseten Fireworks
显式断点
可配置 TTL 取决于模型
缓存预热
路由键

提示词缓存功能的支持情况变化很快。关于功能支持,请务必查看模型提供商的文档。

由于各家提供商的提示词缓存实现和功能支持不同,要在多个提供商之间实现最大的成本节省,并不容易。

我们在 Deep Agents 里是怎么解决的

Deep Agents 运行框架会尽力利用提示词缓存功能,自动完成以下几件事:

  1. 在提供商支持时设置显式缓存断点
  2. 在不支持显式断点时,选择启用提供商侧的隐式缓存
  3. 组织你的提示词,让缓存读取最大化

这些策略支持所有主要提供商,所以你可以随时切换提供商,同时仍然尽可能多地节省 token。为了利用特定提供商的功能,这个框架会检测当前模型提供商,并把缓存交给提供商专用中间件处理。你也可以在自己的 createAgent() 中使用这些中间件,获得提示词缓存带来的节省:

// In Deep Agents you get prompt caching for free!
const agent = createDeepAgent({
	model: "gpt-5.5",
});

// In LangChain, opt in via our middleware:
const agent = createAgent({
  model: "claude-haiku-4-5-20251001",
  middleware: [anthropicPromptCachingMiddleware()],
});

Deep Agents 运行框架也会组织你的提示词和显式缓存点,尽量减少缓存退化。理想情况下,一次模型调用里的静态前缀(你的工具描述、技能、系统提示词)应保持不变。但在更新记忆或压缩对话等情况下,它确实可能发生变化,导致缓存失效。Deep Agents 会通过组织提示词和显式缓存点来缩小影响范围:例如,当一段记忆被更新时,你仍然可以命中提示词中某个子集的缓存。

提示词缓存真正能省多少

功能表告诉我们哪些事情是可能的。为了看看提示词缓存到底能省多少,我们让 Deep Agents 的 eval suite 分别跑在三家提供商的一款中档模型上:claude-haiku-4-5gpt-5.4-minigemini-3.5-flash。结果见下图。在真实 agent 轨迹上,提示词缓存把 token 成本降低了 49–80%。

  • claude-haiku-4-5-77%。借助 Anthropic 的显式断点,我们可以让提示词中的很大一部分保持缓存状态。这显著降低了每次请求的 token 成本。
  • gpt-5.4-mini-80%。OpenAI 的自动最长前缀缓存带来了可观的 80% 成本下降。
  • gemini-3.5-flash-49%。Gemini 的隐式缓存不对节省幅度做显式保证,但我们仍然看到了相当大的节省。

还有一点值得注意:对话越长,缓存的收益越高。缓存前缀会在每一轮中复用,所以长周期任务受益最大。

用 LangSmith 做可观测性

提示词缓存带来的成本节省,只有在你能衡量它时才真正有意义。LangSmith 可以在单次调用和整条轨迹两个层级上,让你看到 API 成本、缓存读取和 token 用量:

对每次调用,你都能看到首 token 时间、总输入 token、缓存读取 token 和总输出 token,并汇总到每条轨迹上。因为缓存读取会单独列项,所以你可以准确看到每段提示词里有多少内容是从缓存返回的,而不是重新处理出来的。

这也是我们在这篇文章里得到这些数字的方法:

  1. 针对每个 agent 配置运行 Deep Agents eval suite
  2. 在 LangSmith 仪表盘里检查 trace 数据,验证运行结果
  3. 通过 LangSmith Client SDK 拉取运行数据
  4. 把数据放进 Jupyter notebook 里计算各提供商的成本差异(或者让 agent 使用 LangSmith Skills 来帮忙)

LangSmith 让我们能够拆分缓存、轨迹长度和更便宜的轮次分别带来的节省,这可以指导我们如何优化自己的 agent。关于如何在 LangSmith 中读取并使用这些数据,这里有更多说明。

提示词缓存的下一步

模型提供商还没有在提示词缓存上收敛到一套共同的功能集。上面的结果里,显式断点带来了一些节省,但这只是开始。还有少数其他功能——缓存预热、路由键、可配置 TTL——有望进一步释放成本节省和延迟收益。

你现在就可以通过使用 createDeepAgent 来利用目前已支持的功能,不需要额外配置。随着模型提供商增加更多功能支持,我们会继续把它们整合进现有框架里。