【LLM】OpenRouter调用Anthropic Claude上下文缓存处理

背景

在使用OpenRouter调用Anthropic Claude大模型时,部分模型支持上下文缓存功能。当缓存命中时,调用成本会显著降低。虽然像DeepSeek这类模型自带上下文缓存机制,但本文主要针对构建Agent场景下,需要多次调用Anthropic Claude时的缓存设置策略。

缓存机制的价值

根据官方定价策略:

  • 缓存设置:需要支付额外费用
  • 缓存命中:可大幅降低调用成本
  • 成本效益:在大量调用场景下,缓存命中能带来显著的成本节约

提示:可以通过OpenRouter账单中的调用历史费用来验证是否成功命中缓存。

官方缓存设置方法

根据官方文档的说明:

标准的缓存设置通过在消息中添加以下结构实现:

json 复制代码
{
  "cache_control": {
      "type": "ephemeral"
  }
}

缓存机制原理:这是一个前缀缓存机制,即设置缓存的消息之前的所有消息都会被缓存。

现有问题与限制

经过实际测试发现:

✅ 有效场景 :在role为user的消息中设置缓存控制有效

❌ 无效场景 :在role为tool的消息中设置缓存控制无效(尽管Claude官方API支持)

注意:这个问题在OpenRouter社区中已有反馈,但目前尚未得到修复。

解决方案

针对工具调用后无法在tool消息中设置缓存的问题,我们采用添加用户消息的方式来绕过限制。

原始消息结构

json 复制代码
[
  {
    "role": "system",
    "content": [ {"type": "text", "text": "..."} ]
  },
  {
    "role": "user",
    "content": [
      { "type": "text", "text": "...", "cache_control": {"type": "ephemeral"} }
    ]
  },
  {
    "role": "assistant",
    "content": [ {"type": "text", "text": "..."} ],
    "tool_calls": []
  },
  {
    "role": "tool", 
    "tool_call_id": "...", 
    "name": "...", 
    "content": "..."
  }, // 这里无法添加cache_control
  {
    "role": "assistant",
    "content": [ {"type": "text", "text": "..."} ],
    "tool_calls": []
  }
]

优化后的消息结构

json 复制代码
[
  {
    "role": "system",
    "content": [ {"type": "text", "text": "..."} ]
  },
  {
    "role": "user",
    "content": [
      { "type": "text", "text": "..."}
    ]
  },
  {
    "role": "assistant",
    "content": [ {"type": "text", "text": "..."} ],
    "tool_calls": []
  },
  {
    "role": "tool", 
    "tool_call_id": "...", 
    "name": "...", 
    "content": "..."
  },
  {
    "role": "user",
    "content": [
      { 
        "type": "text", 
        "text": "function called", 
        "cache_control": {"type": "ephemeral"} 
      }
    ]
  }, // 新增用户消息来设置缓存
  {
    "role": "assistant",
    "content": [ {"type": "text", "text": "..."} ],
    "tool_calls": []
  }
]

关键改进:

  • 在工具调用后添加一个用户消息
  • 消息内容使用"function called"等简单提示,避免改变对话语义
  • 在此消息中设置缓存控制

重要注意事项

  1. 缓存设置上限 :Claude的cache_control结构设置是有数量限制的
  2. 最佳实践:只需在最后一个用户消息中设置缓存即可,前面的消息会自动被缓存
  3. 成本优化:在高频调用场景下,合理使用缓存能显著降低API调用成本

总结

通过在工具调用后添加用户消息的方式,我们成功绕过了OpenRouter在tool消息中无法设置缓存的限制。这种方法在保持对话语义完整性的同时,实现了有效的缓存管理,为Agent应用的成本控制提供了实用的解决方案。

相关推荐
会飞锦鲤12 小时前
工业AI视觉检测项目完整实施方案
人工智能·深度学习·视觉检测·缺陷检测·模型训练·ai项目·工业应用
电科_银尘13 小时前
【深度学习项目实战·15】小样本图像分类:迁移学习识别蚂蚁与蜜蜂
深度学习·分类·迁移学习
陈嘿萌14 小时前
TIP 2026 | 不再混成一张! RealFusion从模态不变性重想图像融合
图像处理·人工智能·深度学习·计算机视觉·学术研究与理论基础
蜗牛一步步往上爬15 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
武天旭16 小时前
AI安全--AI大模型的对抗样本攻击与防御解析
人工智能·深度学习·安全·机器学习
FungLeo18 小时前
成为全栈·基础补充·缓存的层次与失效:浏览器、CDN、服务端、数据库
缓存·cdn·数据一致性·http缓存·成为全栈·flutter缓存
tellmewhoisi19 小时前
深度学习0:数学知识:正态分布4(坐标变换的缩放比例(面积微元变换))
人工智能·深度学习
布吉岛的石头19 小时前
Java 程序员第 50 阶段14:灾难性遗忘与回放
人工智能·深度学习·transformer
在所不辞兄21 小时前
为什么神经网络在训练集损失已接近零后继续训练,测试性能仍可能继续提升,而不是单纯地越来越过拟合?
人工智能·深度学习·神经网络·机器学习·智能仿真
Dawson Zhu1 天前
【LLM推理与Serving⑤】Prefix Cache前缀缓存:让重复prompt不再重复计算
人工智能·语言模型·架构·aigc·agi