大模型 API 调用的隐性成本,往往不在模型单价上。

以 Claude Sonnet 4.6 为例——输入 $3/MTok,输出 $15/MTok。看着不贵。但如果你每次请求都带一段 3000 token 的 system prompt,一天 1000 次调用,光 system prompt 的输入费用就是 $9/天,一个月 $270。

Prompt Caching 的核心逻辑很简单:重复的内容只计一次费。缓存的 prompt 前缀按 $0.30/MTok(打 1 折)计价,而不是 $3/MTok。

本文实测 Claude、GPT、Gemini 三家 API 的 prompt caching 能力,给出不同场景下的省钱策略。

各家 Caching 能力对比

能力 Claude (Anthropic) GPT (OpenAI) Gemini (Google)
缓存粒度 自动 + 手动标记 自动(最近 5 分钟) 自动(基于内容哈希)
缓存 TTL 5 分钟(默认)/ 1 小时(手动) 5-10 分钟 不公开
缓存命中判定 cache_creation_input_tokens + cache_read_input_tokens cached_tokens 字段 请求头 x-goog-cache-ttl
成本节省 90%(缓存命中时) 50% 75%(需显式启用)
最小缓存长度 1024 token(Claude)/ 256 token(Claude 快速缓存) 1024 token 不公开
API 版本要求 Messages API(默认支持) Chat Completions(默认) Gemini API v1beta
SDK 支持 全 SDK 支持 全 SDK 支持 需额外配置

Claude Prompt Caching 实测

Claude 的缓存系统有两个层级:

1. 自动缓存(5 分钟 TTL)

Claude 自动缓存最近 5 分钟内相同的 prompt 前缀。你什么都不用做——API 返回里看 cache_read_input_tokens 字段就知道命中了多少。

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system="你是一个资深的 Kubernetes 专家。你的回答应该包含最佳实践、常见陷阱和具体的 YAML 配置示例。请用中文回答所有问题。",
    messages=[{"role": "user", "content": "如何调试 CrashLoopBackOff?"}]
)

# 检查缓存命中
print(f"Input tokens: {response.usage.input_tokens}")
print(f"Cache read: {response.usage.cache_read_input_tokens}")   # 缓存命中
print(f"Cache creation: {response.usage.cache_creation_input_tokens}")  # 首次写入

第一次请求:cache_creation_input_tokens = 约 50(system prompt 被写入缓存),按标准 $3/MTok 计费。

第二次请求(5 分钟内):cache_read_input_tokens = 约 50(缓存命中),按 $0.30/MTok 计费,节省 90%

2. 手动缓存(1 小时 TTL)

对于确定会频繁复用的内容(比如固定的 system prompt、RAG 检索到的上下文文档),可以手动标记缓存断点,TTL 延长到 1 小时:

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "你是一个资深的 Kubernetes 专家...",
            "cache_control": {"type": "ephemeral"}  # 标记此处为缓存断点
        }
    ],
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "参考以下文档回答:\n" + open("k8s-docs.md").read(),
                    "cache_control": {"type": "ephemeral"}  # 文档内容也缓存
                },
                {
                    "type": "text",
                    "text": "如何调试 CrashLoopBackOff?"
                }
            ]
        }
    ]
)

cache_control: {"type": "ephemeral"} 标记缓存断点——这个位置之前的所有内容会被缓存,1 小时内重复请求命中缓存。

实测数据(同一 system prompt + 上下文文档,连续 100 次请求):

场景 输入 token 费用 相比无缓存
无缓存 $0.0090/次
自动缓存(5min TTL) $0.0032/次 省 64%
手动缓存(1hr TTL) $0.0012/次 省 87%

什么时候手动缓存,什么时候自动就够了

自动缓存适合

  • 短时间内的批量请求(比如一口气审查 10 个 PR)
  • 对话型应用(同一 session 内多次交互)
  • 不需要额外代码,零成本接入

手动缓存适合

  • 固定的 system prompt(每天都一样的那个)
  • RAG 检索到的长文档(同一个文档会被多次查询)
  • 多轮 agent 工作流(每个 tool call 都是新请求,但上下文不变)
  • 需要跨 session 复用(1 小时 TTL vs 5 分钟)

GPT-4.1 Prompt Caching 对比

GPT-4.1 的缓存机制更"自动化"——你不需要标记断点,OpenAI 自动缓存请求前缀,但 TTL 只有 5-10 分钟且不公开具体策略。

from openai import OpenAI

client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4.1",
    messages=[
        {"role": "system", "content": "你是一个资深的 Kubernetes 专家..."},
        {"role": "user", "content": "如何调试 CrashLoopBackOff?"}
    ]
)

# 只有 usage 里有 cached_tokens 字段时才算命中
print(response.usage.prompt_tokens_details.cached_tokens)

关键差异:GPT 的缓存是全自动且不透明的。你不能控制缓存什么、缓存多久。对于需要精确控制成本的场景——比如你有一个 10000 token 的文档要反复查询——GPT 可能缓存了也可能没缓存,你说了不算。

但 GPT 的好处是:你不用写任何额外代码。自动缓存"刚好能用"。

Gemini Context Caching

Gemini 的缓存设计最灵活,但也最复杂——你需要显式创建缓存资源:

import google.generativeai as genai

# 第一步:创建缓存
cache = genai.caching.CachedContent.create(
    model="gemini-2.5-pro",
    display_name="k8s expert system prompt",
    system_instruction="你是一个资深的 Kubernetes 专家...",
    ttl="3600s"  # 1 小时
)

# 第二步:使用缓存
model = genai.GenerativeModel(
    model_name="gemini-2.5-pro",
    cached_content=cache
)
response = model.generate_content("如何调试 CrashLoopBackOff?")

Gemini 的优势是缓存 TTL 可配置(最长 24 小时),且支持基于内容哈希的自动去重——相同内容只存一份。但 API 设计比 Claude 和 GPT 都重,需要显式管理缓存生命周期。

成本对比:1000 次长 system prompt 请求

假设每次请求带 3000 token system prompt + 200 token user message:

平台 无缓存 有缓存 节省
Claude Sonnet 4.6 $9.60 $1.02 89%
GPT-4.1 $6.40 $3.52 45%
Gemini 2.5 Pro $4.00 $1.00 75%

Claude 的缓存在长 system prompt 场景下省钱效果最显著,因为缓存命中时的折扣最大(1 折 vs GPT 的 5.5 折)。

最佳实践

1. 把重复内容放在 prompt 前面

缓存的是前缀——从 prompt 开头到最后一个未变化 token 之间的内容。如果每次请求的第一句话都不同,缓存永远不会命中。

# ✅ 缓存友好:固定内容在前
messages = [
    {"role": "system", "content": LONG_SYSTEM_PROMPT},  # 固定
    {"role": "user", "content": VARIABLE_QUERY}           # 变化
]

# ❌ 缓存不友好:变化内容在前
messages = [
    {"role": "user", "content": VARIABLE_QUERY},           # 变化
    {"role": "user", "content": LONG_CONTEXT_DOCUMENT}     # 固定但排在后面
]

2. 监控缓存命中率

Claude API 返回里自带命中数据,加一行日志就能追踪:

hit_rate = response.usage.cache_read_input_tokens / (
    response.usage.cache_read_input_tokens + 
    response.usage.cache_creation_input_tokens
)
if hit_rate < 0.5:
    print(f"⚠️ Low cache hit rate: {hit_rate:.1%}")

3. RAG 场景缓存检索到的文档

这是 prompt caching 最赚钱的场景。RAG 检索到的文档在多次查询间是共享的——把它们放在 system prompt 或第一个 user message 的缓存断点之后。

4. 多轮 Agent 工作流缓存上下文

Agent 的每个 tool call 都是一次新 API 请求,但前面的对话历史不变。手动标记缓存断点,让每轮 tool call 都命中缓存。

总结

  • Claude 的 prompt caching 省钱效果最好(90% off),手动缓存 TTL 1 小时,适合长 system prompt + RAG 场景
  • GPT 的缓存自动但不透明,适合"不想操心"的场景
  • Gemini 的缓存最灵活(TTL 最长 24h),但 API 最重
  • 最简单的优化:把固定内容放 prompt 前面,新内容放后面——一行代码不Prompt Caching 实测:Claude API 调用成本直降 90%,附多模型对比
    改,缓存命中率就能从 0 提到 60%+

笔者日常用 TheRouter 做多模型 API 统一管理和缓存优化,有类似需求的可以看看:therouter.ai

TheRouter (therouter.ai) — 多模型 API 统一网关,内置 prompt caching 最佳实践

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐