Spring AI 中對 AWS Bedrock 提示快取的支援

工程 | Soby Chacko | 2025 年 10 月 30 日 | ...

在我們之前關於 Anthropic 提示快取的博文中,我們探討了提示快取如何透過重用先前處理過的提示內容,顯著降低 API 成本和延遲。我們介紹了 Spring AI 針對 Anthropic Claude 模型的五種策略性快取模式,並展示了它們如何在尊重 4 個斷點限制的同時自動處理快取斷點位置。

AWS Bedrock 將提示快取引入更廣泛的生態系統——同時支援 Claude 模型(透過 Bedrock 訪問)和亞馬遜自己的 Nova 系列。如果您正在考慮使用 Bedrock 或已經在使用它,您會發現 Spring AI 的相同快取策略也適用,但有一些關鍵區別。

在這篇博文中,我們將解釋 AWS Bedrock 中的提示快取與 Anthropic 直接 API 相比有哪些不同,以及 Spring AI 如何在兩個提供商之間保持一致的模式。

AWS Bedrock 增加了什麼

AWS Bedrock 將提示快取擴充套件到 Claude 之外,包括 Amazon Nova 模型

Claude 模型(透過 Bedrock)

  • Claude 3 Opus 4.1, Opus 4, Sonnet 4.5, Sonnet 4, Haiku 4.5
  • Claude 3.7 Sonnet, 3.5 Haiku
  • 完整的快取支援,包括工具定義

Amazon Nova 模型:

  • Nova Micro, Lite, Pro, Premier
  • 僅支援系統和對話快取

有關完整的模型詳細資訊,請參閱AWS Bedrock 支援的模型

與 Anthropic 直接 API 的主要區別

雖然核心快取概念保持不變(如我們之前的博文所述),但 AWS Bedrock 有幾個值得理解的區別。

固定的 5 分鐘快取 TTL

AWS Bedrock 使用固定的 5 分鐘 TTL,沒有配置選項,而 Anthropic 的直接 API 提供可選的 1 小時快取。

// Anthropic direct API: optional TTL configuration
AnthropicCacheOptions.builder()
    .strategy(AnthropicCacheStrategy.SYSTEM_ONLY)
    .messageTypeTtl(MessageType.SYSTEM, AnthropicCacheTtl.ONE_HOUR)
    .build()

// AWS Bedrock: always 5 minutes
BedrockCacheOptions.builder()
    .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
    .build()

對於高頻工作負載(每隔幾秒或幾分鐘請求一次),5 分鐘 TTL 可以保持快取的“熱度”。對於請求間隔 5-30 分鐘的應用程式,快取條目可能會在請求之間過期。

Nova 不支援工具快取

Amazon Nova 模型不支援工具快取。嘗試在 Nova 上使用 TOOLS_ONLYSYSTEM_AND_TOOLS 策略會丟擲異常。

// Works with Claude models
BedrockChatOptions.builder()
    .model("anthropic.claude-sonnet-4-5-20250929-v1:0")
    .cacheOptions(BedrockCacheOptions.builder()
        .strategy(BedrockCacheStrategy.SYSTEM_AND_TOOLS)
        .build())
		.toolCallbacks(tools)
    .build()

// Throws exception with Nova models
BedrockChatOptions.builder()
    .model("us.amazon.nova-pro-v1:0")
    .cacheOptions(BedrockCacheOptions.builder()
        .strategy(BedrockCacheStrategy.TOOLS_ONLY)
        .build())
		.toolCallbacks(tools)
    .build()

// Use SYSTEM_ONLY for Nova
BedrockChatOptions.builder()
    .model("us.amazon.nova-pro-v1:0")
    .cacheOptions(BedrockCacheOptions.builder()
        .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
        .build())
		.build()

模型特定的令牌閾值

模型 每個檢查點的最小令牌數
Claude 3.7 Sonnet, 3.5 Sonnet v2, Opus 4, Sonnet 4, Sonnet 4.5 1,024
Claude 3.5 Haiku 2,048
Claude Haiku 4.5 4,096
Amazon Nova (所有變體) 1,000

有關詳細資訊,請參閱Bedrock 令牌限制文件

快取指標命名

指標 Anthropic Direct AWS Bedrock
建立快取條目 cacheCreationInputTokens cacheWriteInputTokens
從快取讀取 cacheReadInputTokens cacheReadInputTokens

跨提供商的相同 Spring AI 模式

Spring AI 在兩個提供商之間使用相同的快取策略

BedrockCacheStrategy.SYSTEM_ONLY           ←→ AnthropicCacheStrategy.SYSTEM_ONLY
BedrockCacheStrategy.TOOLS_ONLY            ←→ AnthropicCacheStrategy.TOOLS_ONLY
BedrockCacheStrategy.SYSTEM_AND_TOOLS      ←→ AnthropicCacheStrategy.SYSTEM_AND_TOOLS
BedrockCacheStrategy.CONVERSATION_HISTORY  ←→ AnthropicCacheStrategy.CONVERSATION_HISTORY

讓我們看看程式碼是多麼相似

// Anthropic direct API
ChatResponse response = anthropicChatModel.call(
				new Prompt(
						List.of(new SystemMessage(systemPrompt), new UserMessage(userQuery)),
						AnthropicChatOptions.builder()
								.model(AnthropicApi.ChatModel.CLAUDE_4_5_SONNET)
								.cacheOptions(AnthropicCacheOptions.builder()
										.strategy(AnthropicCacheStrategy.SYSTEM_ONLY)
										.build())
								.maxTokens(500)
								.build()
				)
		);

// AWS Bedrock (nearly identical)
ChatResponse response = bedrockChatModel.call(
		new Prompt(
				List.of(new SystemMessage(systemPrompt), new UserMessage(userQuery)),
				BedrockChatOptions.builder()
						.model("anthropic.claude-sonnet-4-5-20250929-v1:0")
						.cacheOptions(BedrockCacheOptions.builder()
								.strategy(BedrockCacheStrategy.SYSTEM_ONLY)
								.build())
						.maxTokens(500)
						.build()
		)
);

唯一的區別:聊天模型例項、選項類和模型識別符號格式。

提供商特性一覽

特性 AWS Bedrock Anthropic Direct
快取 TTL 5 分鐘(固定) 5 分鐘(預設),1 小時(可選)
模型 Claude + Nova 僅 Claude
工具快取 僅 Claude 所有 Claude 模型
令牌指標 cacheWriteInputTokens, cacheReadInputTokens cacheCreationInputTokens, cacheReadInputTokens
定價 因區域/模型而異 按模型釋出
成本模式 ~25% 寫入溢價,~90% 讀取節省 25% 寫入溢價,90% 讀取節省

示例:帶快取的文件分析

這是一個展示快取有效性的實際示例

@Service
public class ContractAnalyzer {

	private final BedrockProxyChatModel chatModel;
	private final DocumentExtractor documentExtractor;

	public AnalysisReport analyzeContract(String contractId) {
		String contractText = documentExtractor.extract(contractId);

		String systemPrompt = """
				You are an expert legal analyst specializing in commercial contracts.
				Analyze the following contract and provide precise insights about
				terms, obligations, risks, and opportunities:
				
				CONTRACT:
				%s
				""".formatted(contractText);

		String[] questions = {
				"What are the key legal clauses and penalties?",
				"Summarize the payment terms and financial obligations.",
				"What intellectual property rights are defined?",
				"Identify potential compliance risks.",
				"What are the performance milestones?"
		};

		AnalysisReport report = new AnalysisReport();

		BedrockChatOptions options = BedrockChatOptions.builder()
				.model("anthropic.claude-sonnet-4-5-20250929-v1:0")
				.cacheOptions(BedrockCacheOptions.builder()
						.strategy(BedrockCacheStrategy.SYSTEM_ONLY)
						.build())
				.maxTokens(1000)
				.build();

		for (int i = 0; i < questions.length; i++) {
			ChatResponse response = chatModel.call(
					new Prompt(
							List.of(new SystemMessage(systemPrompt), new UserMessage(questions[i])),
							options
					)
			);

			report.addSection(questions[i], response.getResult().getOutput().getText());
			logCacheMetrics(response, i);
		}

		return report;
	}

	private void logCacheMetrics(ChatResponse response, int questionNum) {
		Integer cacheWrite = (Integer) response.getMetadata()
				.getMetadata().get("cacheWriteInputTokens");
		Integer cacheRead = (Integer) response.getMetadata()
				.getMetadata().get("cacheReadInputTokens");

		if (questionNum == 0 && cacheWrite != null) {
			logger.info("Cache created: {} tokens", cacheWrite);
		} else if (cacheRead != null && cacheRead > 0) {
			logger.info("Cache hit: {} tokens", cacheRead);
		}
	}
}

AWS Bedrock 透過響應元資料提供快取指標

第一個請求:cacheWriteInputTokens > 0, cacheReadInputTokens = 0

後續請求(在 TTL 內):cacheWriteInputTokens = 0, cacheReadInputTokens > 0

使用 3,500 令牌的系統提示,這使得快取內容的成本降低約 65%(第一個問題支付約 1.25 倍,後續問題支付約 0.10 倍)。

在 Bedrock 上使用不同的模型

@Service
public class MultiModelService {

	// Nova: System prompt caching
	public String analyzeWithNova(String document, String query) {
		return chatClient.prompt()
                .system("You are an expert analyst. Context: " + document)
				.user(query)
				.options(BedrockChatOptions.builder()
						.model("us.amazon.nova-pro-v1:0")
						.cacheOptions(BedrockCacheOptions.builder()
								.strategy(BedrockCacheStrategy.SYSTEM_ONLY)
								.build())
						.maxTokens(500)
						.build())
				.call()
				.content();
	}

	// Claude: System + tool caching
	public String analyzeWithTools(String document, String query,
			List<ToolCallback> tools) {
		return chatClient.prompt()
				.system("You are an expert analyst. Context: " + document)
				.user(query)
				.options(BedrockChatOptions.builder()
						.model("anthropic.claude-sonnet-4-5-20250929-v1:0")
						.cacheOptions(BedrockCacheOptions.builder()
								.strategy(BedrockCacheStrategy.SYSTEM_AND_TOOLS)
								.build())
						.toolCallbacks(tools)
						.maxTokens(500)
						.build())
				.call()
				.content();
	}
}

入門

新增 Spring AI Bedrock Converse starter

注意:AWS Bedrock 提示快取支援在 Spring AI 1.1.0 及更高版本中可用。請使用最新的 1.1.0-SNAPSHOT 版本嘗試。

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-starter-model-bedrock-converse</artifactId>
</dependency>

配置 AWS 憑據

spring.ai.bedrock.aws.region=us-east-1
spring.ai.bedrock.aws.access-key=${AWS_ACCESS_KEY_ID}
spring.ai.bedrock.aws.secret-key=${AWS_SECRET_ACCESS_KEY}

然後您可以像上面示例中所示的那樣,透過 AWS Bedrock 開始使用提示快取。

策略選擇參考

策略 使用場景 Claude Nova
SYSTEM_ONLY 大型穩定系統提示
TOOLS_ONLY 大型穩定工具,動態系統
SYSTEM_AND_TOOLS 兩者都大且穩定
CONVERSATION_HISTORY 多輪對話
NONE 顯式停用快取

有關詳細的策略解釋、快取層次結構和級聯失效模式,請參閱我們的Anthropic 提示快取博文。這些概念在 AWS Bedrock 的情況下仍然適用。

結論

AWS Bedrock 將提示快取擴充套件到 Amazon Nova 模型,同時保持對 Claude 模型的完全支援。與 Anthropic 直接 API 的主要區別是固定的 5 分鐘 TTL,Nova 缺乏工具快取支援,以及區域特定的定價。

Spring AI 在兩個提供商之間提供相同的策略性快取模式。無論您選擇透過 Anthropic 的 Claude、透過 Bedrock 的 Claude 還是 Amazon Nova 模型,這五種快取策略都能以最少的程式碼更改保持一致的工作。

提供商之間的選擇取決於模型可用性(Nova 僅在 Bedrock 上)、快取 TTL 要求和工具快取需求(Nova 不支援)。

有關 Spring AI 對 AWS Bedrock 提示快取支援的更多資訊,請參閱Spring AI Bedrock 文件AWS Bedrock 提示快取文件

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有