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

背景

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

缓存机制的价值

根据官方定价策略:

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

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

官方缓存设置方法

根据官方文档的说明:

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

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

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

现有问题与限制

经过实际测试发现:

有效场景 :在roleuser的消息中设置缓存控制有效

无效场景 :在roletool的消息中设置缓存控制无效(尽管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应用的成本控制提供了实用的解决方案。

相关推荐
reesn9 分钟前
模型转ONNX流程指南
人工智能·语言模型
indexsunny3 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Redis缓存场景解析
java·spring boot·redis·缓存·微服务·消息队列·电商
起名时在学Aiifox9 小时前
Vue 3 响应式缓存策略:从页面状态追踪到智能数据管理
前端·vue.js·缓存
小途软件10 小时前
用于机器人电池电量预测的Sarsa强化学习混合集成方法
java·人工智能·pytorch·python·深度学习·语言模型
哥布林学者10 小时前
吴恩达深度学习课程五:自然语言处理 第一周:循环神经网络 (五)门控循环单元 GRU
深度学习·ai
薛不痒11 小时前
深度学习之优化模型(数据预处理,数据增强,调整学习率)
深度学习·学习
ChineHe11 小时前
Redis数据类型篇002_详解Strings核心命令与存储结构
数据库·redis·缓存
且去填词13 小时前
DeepSeek API 深度解析:从流式输出、Function Calling 到构建拥有“手脚”的 AI 应用
人工智能·python·语言模型·llm·agent·deepseek
Java猿_13 小时前
使用Three.js创建交互式3D地球模型
人工智能·语言模型·自然语言处理
棒棒的皮皮13 小时前
【深度学习】YOLO模型速度优化Checklist
人工智能·深度学习·yolo·计算机视觉