Skip to content
🔗 分享本题
查看我的学习进度 →

记忆点:命中率再高不等于省钱,还要看写入费用、TTL 和复用次数。

💡 答案要点

Prompt Caching 的收益取决于三个关键变量的乘积:

Total Savings = Cache_Hit_Rate × Dynamic_Tokens_Saved × Frequency × ΔCost_Per_Token
                              │                            │
                   (改写后不变的 prefix          (同一前缀
                    被命中节省的量)                 被重复使用的次数)

各家定价差异直接影响收益:

Provider缓存写入价缓存读取价最小长度典型 TTL
OpenAI略低于常规输入低很多动态~15min
Anthropiccache_control 标记的块仅计费读取部分无硬性下限会话内
Bedrock取决于底层模型取决于模型因模型而异不确定

ROI 计算公式:

prompt_size = 3000 tokens(System Prompt + Tools)
daily_requests = 10000(日均调用)
hit_rate = 0.80(预估命中率)
openai_input_price = $3.00/M tokens
openai_cache_read_price = $0.30/M tokens  (约 10% 的输入价格)
savings_per_day = hit_rate × daily_requests × prompt_size × (input_price - read_price)
                = 0.80 × 10000 × 3000 × ($3.00 - $0.30) / 1e6
                = $64.80/天
annual_savings ≈ $23,652/年

实操优化技巧:

python
# 1. 最大化静态前缀长度
messages = [
    {"role": "system", "content": SYSTEM_PROMPT},       # 最长不变部分
    {"role": "system", "content": TOOL_DEFINITIONS},     # 工具定义
    *conversation_history[-3:],  # 尽可能少地放进历史
    {"role": "user", "content": user_message},           # 唯一变化的部分
]

# 2. 同租户共享同一个 conversation
# 同一个用户的多次请求天然命中缓存

# 3. 避免在每个请求中引入随机内容
# ❌ 不要在消息里加 timestamp / request_id / random seed
# ✅ 这些放到请求头或元数据里,不进 messages

常见陷阱:

  • 缓存写入比正常输入还贵 → 短文本频繁写缓存反而亏本
  • 不同模型的 System Prompt 不一样 → 换模型 = 缓存全部失效
  • TTL 过期后写入竞争 → 大量并发同时写入导致缓存不稳定
  • 只看命中率不看整体 → 命中率 90% 但写入费极高 = 净亏损

面试话术:

"我做过的一个项目在 Prompt Caching 上每月省了大约 30% 的 API 费用。关键不是命中率——很多人以为命中率 90% 就一定省钱,但如果写入价格很高或者复用次数太低,缓存可能适得其反。我的做法是先统计现有 API 账单:写入 token 多少、读取 token 多少、总调用量多少,算出 breakeven point,再决定要不要开启显式缓存。"