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

相关推荐
xiao5kou4chang6kai42 天前
MATLAB机器学习、深度学习--从数据预处理到模型训练
深度学习·机器学习·matlab·数据预处理
renhongxia12 天前
世界模型作为AGI落地底层底座的作用
人工智能·深度学习·生成对抗网络·自然语言处理·知识图谱·agi
计算机科研狗@OUC2 天前
(cvpr26) AIMDepth: Asymmetric Image-Event Mamba for Monocular Depth Estimation
人工智能·深度学习·计算机视觉
大鱼>2 天前
大语言模型+物联网:LLM理解物理世界
物联网·struts·语言模型·多模态·aiot
ofoxcoding2 天前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai
AndrewHZ2 天前
【LLM技术全景】大模型能力探秘:In-Context Learning与思维链(CoT)
人工智能·语言模型·大模型·llm·cot·思维链·icl
生成论实验室2 天前
机器人:一个自主运动的系统
人工智能·算法·语言模型·机器人·自动驾驶·agi·安全架构
Data-Miner2 天前
大语言模型+智能体AI,122页PPT详解落地应用培训!
人工智能·microsoft·语言模型
β添砖java2 天前
深度学习(22)网络中的网络NiN
人工智能·深度学习
Kobebryant-Manba2 天前
深度学习时候d2l报错和使用问题
人工智能·深度学习