【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应用的成本控制提供了实用的解决方案。

相关推荐
kkzhang13 分钟前
Concept Bottleneck Models-概念瓶颈模型用于可解释决策:进展、分类体系 与未来方向综述
深度学习
惊讶的猫1 小时前
Redis持久化介绍
数据库·redis·缓存
程序员打怪兽2 小时前
详解YOLOv8网络结构
人工智能·深度学习
AI资源库2 小时前
GLM-4.7-Flash模型深入解析
人工智能·语言模型
生产队队长2 小时前
Redis:Windows环境安装Redis,并将 Redis 进程注册为服务
数据库·redis·缓存
饭饭大王6663 小时前
CANN 生态中的轻量化部署利器:`lite-inference` 项目实战解析
深度学习
MSTcheng.4 小时前
CANN ops-math:AI 硬件端高效数学运算的算子设计与工程化落地方法
人工智能·深度学习·cann
Dev7z4 小时前
基于深度学习的肺部听诊音疾病智能诊断方法研究
人工智能·深度学习
像风一样的男人@5 小时前
python --读取psd文件
开发语言·python·深度学习
大江东去浪淘尽千古风流人物5 小时前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam