Skip to main content
专为托管在 AWS Bedrock 上的模型设计的中间件。了解更多关于中间件的信息。
中间件描述
提示词缓存通过缓存重复的提示词前缀来降低成本

提示词缓存

通过在 Amazon Bedrock 上缓存频繁重用的提示词前缀,降低推理延迟和输入 Token 成本。该中间件会自动在系统提示词、工具定义和最新消息之后放置缓存检查点,以便模型在后续请求中跳过对已见内容的重新计算。 提示词缓存适用于以下场景:
  • 具有长且一致的系统提示词的多轮对话
  • 拥有大量跨调用保持不变的工具体定义的智能体(Agent)
  • 基于文档的问答,用户在同一上传上下文上提出多个问题
  • 包含重复静态内容的批处理工作负载
支持的模型:
  • Anthropic Claude
  • Amazon Nova
了解更多关于AWS Bedrock 提示词缓存策略和限制的信息。缓存内容必须超过 1,024 个 Token,缓存检查点才会生效,具体阈值可能因模型而异。请参阅支持的模型、区域和限制
API 参考: BedrockPromptCachingMiddleware
ChatBedrockConverse
from langchain_aws import ChatBedrockConverse
from langchain_aws.middleware.prompt_caching import BedrockPromptCachingMiddleware
from langchain.agents import create_agent

agent = create_agent(
    model=ChatBedrockConverse(model="us.anthropic.claude-sonnet-4-5-20250929-v1:0"),
    system_prompt="<在此处输入您的长系统提示词>",
    middleware=[BedrockPromptCachingMiddleware(ttl="1h")],
)
ChatBedrock
from langchain_aws import ChatBedrock
from langchain_aws.middleware.prompt_caching import BedrockPromptCachingMiddleware
from langchain.agents import create_agent

agent = create_agent(
    model=ChatBedrock(model="us.anthropic.claude-sonnet-4-5-20250929-v1:0"),
    system_prompt="<在此处输入您的长系统提示词>",
    middleware=[BedrockPromptCachingMiddleware(ttl="5m")],
)
type
string
default:"ephemeral"
缓存类型。对于 ChatBedrock,目前仅支持 'ephemeral'。对于 ChatBedrockConverse,此值将被忽略,因为 Converse API 始终使用 "default" 缓存类型。
ttl
string
default:"5m"
缓存内容的存活时间(TTL)。有效值:'5m''1h'。请注意,Amazon Nova 模型仅支持 '5m'
min_messages_to_cache
number
default:"0"
开始缓存前的最小消息数量。
unsupported_model_behavior
string
default:"warn"
使用不受支持的模型时的行为。选项:'ignore''warn''raise'
该中间件会缓存每个请求中直到并包括最新消息的内容。在 TTL 窗口内(5 分钟或 1 小时)的后续请求中,之前见过的内容将从缓存中检索,而不是重新处理,从而降低成本和延迟。工作原理:
  1. 首次请求:系统提示词、工具和用户消息被发送到 API 并进行缓存
  2. 第二次请求:从缓存中检索缓存内容。只需处理新消息即可
  3. 此模式在每个回合中持续进行,每次请求都会重用缓存的对话历史
提示词缓存通过缓存 Token 来降低 API 成本,但提供对话记忆功能。若要在多次调用之间持久化对话历史,请使用类似 MemorySaver检查点器
from langchain_aws import ChatBedrockConverse
from langchain_aws.middleware.prompt_caching import BedrockPromptCachingMiddleware
from langchain.agents import create_agent
from langchain_core.runnables import RunnableConfig
from langchain.messages import HumanMessage
from langchain.tools import tool
from langgraph.checkpoint.memory import MemorySaver


@tool
def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    return f"The weather in {city} is sunny and 72F."


# 系统提示词必须超过 1,024 个 Token 才能生效缓存
LONG_PROMPT = (
    "You are a helpful weather assistant with deep expertise in meteorology, "
    "climate science, and atmospheric phenomena. When answering questions about "
    "weather, provide accurate and up-to-date information. "
    + "You should always strive to give the most helpful response possible. " * 85
)

agent = create_agent(
    model=ChatBedrockConverse(model="us.anthropic.claude-sonnet-4-5-20250929-v1:0"),
    system_prompt=LONG_PROMPT,
    tools=[get_weather],
    middleware=[BedrockPromptCachingMiddleware(ttl="5m")],
    checkpointer=MemorySaver(),  # 持久化对话历史
)

# 使用 thread_id 来维护对话状态
config: RunnableConfig = {"configurable": {"thread_id": "user-123"}}

# 首次调用:创建包含系统提示词、工具和用户消息的缓存
response = agent.invoke(
    {"messages": [HumanMessage("What is the weather in Miami?")]}, config=config
)

last_msg = response["messages"][-1]
print(last_msg.content)

# 检查缓存 Token 使用情况
um = last_msg.usage_metadata
if um:
    details = um.get("input_token_details", {})
    cache_read = details.get("cache_read", 0) or 0
    cache_write = details.get("cache_creation", 0) or 0
    print(f"Cache read: {cache_read}, Cache write: {cache_write}")

# 第二次调用:重用缓存的系统提示词、工具和之前的消息
response = agent.invoke(
    {"messages": [HumanMessage("How about Seattle?")]}, config=config
)
print(response["messages"][-1].content)

模型特定行为

该中间件会自动处理不同 API 和模型系列之间的差异:
功能ChatBedrockConverse (Anthropic)ChatBedrockConverse (Nova)ChatBedrock (Anthropic)
系统提示词缓存
工具体定义缓存
消息缓存✅(排除工具结果消息)
扩展 TTL(1h