Amazon Bedrock
Maven 依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bedrock</artifactId>
<version>1.3.0</version>
</dependency>
AWS 凭证
为了使用 Amazon Bedrock 模型,您需要配置 AWS 凭证。
其中一种选择是设置 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
环境变量。更多信息请参阅 这里。另外,也可以在本地设置 AWS_BEARER_TOKEN_BEDROCK
环境变量以进行 API 密钥认证。有关更多 API 密钥详细信息,请参阅 文档。
BedrockChatModel
注
当前实现不支持 Guardrails。
支持的模型及其功能可以在这里找到。
模型 ID 可以在这里找到。
配置
ChatModel model = BedrockChatModel.builder()
.client(BedrockRuntimeClient)
.region(...)
.modelId("us.amazon.nova-lite-v1:0")
.returnThinking(...)
.sendThinking(...)
.timeout(...)
.maxRetries(...)
.logRequests(...)
.logResponses(...)
.listeners(...)
.defaultRequestParameters(BedrockChatRequestParameters.builder()
.modelName(...)
.temperature(...)
.topP(...)
.maxOutputTokens(...)
.stopSequences(...)
.toolSpecifications(...)
.toolChoice(...)
.additionalModelRequestFields(...)
.additionalModelRequestField(...)
.enableReasoning(...)
.build())
.build();
示例
BedrockStreamingChatModel
注
当前实现不支持 Guardrails。
支持的模型及其功能可以在这里找到。
模型 ID 可以在这里找到。
配置
StreamingChatModel model = BedrockStreamingChatModel.builder()
.client(BedrockRuntimeAsyncClient)
.region(...)
.modelId("us.amazon.nova-lite-v1:0")
.returnThinking(...)
.sendThinking(...)
.timeout(...)
.logRequests(...)
.logResponses(...)
.listeners(...)
.defaultRequestParameters(BedrockChatRequestParameters.builder()
.modelName(...)
.temperature(...)
.topP(...)
.maxOutputTokens(...)
.stopSequences(...)
.toolSpecifications(...)
.toolChoice(...)
.additionalModelRequestFields(...)
.additionalModelRequestField(...)
.enableReasoning(...)
.build())
.build();
示例
附加模型请求字段
BedrockChatRequestParameters
中的 additionalModelRequestFields
字段是一个 Map<String, Object>
。
正如这里所解释的,它允许为特定模型添加不包含在通用 InferenceConfiguration
中的推理参数。
思维/推理
要启用 Claude 的思维过程,请在 BedrockChatRequestParameters
上调用 enableReasoning
并设置它,然后在构建模型时通过 defaultRequestParameters
进行设置:
BedrockChatRequestParameters parameters = BedrockChatRequestParameters.builder()
.enableReasoning(1024) // 令牌预算
.build();
ChatModel model = BedrockChatModel.builder()
.modelId("us.anthropic.claude-sonnet-4-20250514-v1:0")
.defaultRequestParameters(parameters)
.returnThinking(true)
.sendThinking(true)
.build();
以下参数也控制思维行为:
returnThinking
:控制是否在AiMessage.thinking()
内部返回思维(如果可用),以及在使用BedrockStreamingChatModel
时是否调用StreamingChatResponseHandler.onPartialThinking()
和TokenStream.onPartialThinking()
回调。- 默认禁用。如果启用,思维签名也将被存储并返回到
AiMessage.attributes()
内部。
- 默认禁用。如果启用,思维签名也将被存储并返回到
sendThinking
:控制是否在后续请求中将存储在AiMessage
中的思维和签名发送给 LLM。- 默认启用。
提示缓存
AWS Bedrock 支持提示缓存功能,以提高性能并降低在重复调用具有相似提示的 API 时的成本。此功能可以将延迟降低高达 85%,并将缓存内容的成本降低高达 90%。
工作原理
提示缓存允许您标记对话中的特定点以进行缓存。当您使用相同的缓存内容进行后续 API 调用时,Bedrock 可以重用缓存的部分,从而显著减少处理时间和成本。缓存的 TTL(生存时间)为 5 分钟,每次缓存命中时都会重置。
支持的模型
提示缓存支持以下模型:
- Claude 3.5 Sonnet
- Claude 3.5 Haiku
- Claude 3.7 Sonnet
- Amazon Nova 模型
配置
要启用提示缓存,请在 BedrockChatRequestParameters
中使用 promptCaching()
方法:
import dev.langchain4j.model.bedrock.BedrockChatRequestParameters;
import dev.langchain4j.model.bedrock.BedrockCachePointPlacement;
BedrockChatRequestParameters params = BedrockChatRequestParameters.builder()
.promptCaching(BedrockCachePointPlacement.AFTER_SYSTEM)
.temperature(0.7)
.maxOutputTokens(500)
.build();
ChatModel model = BedrockChatModel.builder()
.modelId("us.amazon.nova-micro-v1:0")
.region(Region.US_EAST_1)
.defaultRequestParameters(params)
.build();
缓存点放置选项
BedrockCachePointPlacement
枚举提供了三种选项,用于在对话中放置缓存点:
AFTER_SYSTEM
:在系统消息之后放置缓存点。这适用于希望在多个对话中重用一致的系统提示的场景。AFTER_USER_MESSAGE
:在用户消息之后放置缓存点。适用于用户提示或上下文保持不变的场景。AFTER_TOOLS
:在工具定义之后放置缓存点。适用于拥有一组一致的工具定义需要缓存的场景。
示例
基本用法:系统消息缓存
// 配置提示缓存,在系统消息后缓存
BedrockChatRequestParameters params = BedrockChatRequestParameters.builder()
.promptCaching(BedrockCachePointPlacement.AFTER_SYSTEM)
.build();
ChatModel model = BedrockChatModel.builder()
.modelId("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
.defaultRequestParameters(params)
.build();
// 第一次请求 - 建立缓存
ChatRequest request1 = ChatRequest.builder()
.messages(Arrays.asList(
SystemMessage.from("你是一个精通 Java 的助手。"),
UserMessage.from("什么是依赖注入?")
))
.build();
ChatResponse response1 = model.chat(request1);
// 第二次请求 - 受益于缓存的系统消息
ChatRequest request2 = ChatRequest.builder()
.messages(Arrays.asList(
SystemMessage.from("你是一个精通 Java 的助手。"),
UserMessage.from("什么是单例模式?")
))
.build();
ChatResponse response2 = model.chat(request2); // 由于缓存,响应更快
结合其他功能
提示缓存可以与 Bedrock 的其他功能(如推理)结合使用:
BedrockChatRequestParameters params = BedrockChatRequestParameters.builder()
.promptCaching(BedrockCachePointPlacement.AFTER_SYSTEM)
.enableReasoning(1000) // 启用推理,设置 1000 令牌预算
.temperature(0.3)
.maxOutputTokens(2000)
.build();
ChatModel model = BedrockChatModel.builder()
.modelId("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
.defaultRequestParameters(params)
.build();
最佳实践
- 缓存稳定内容:对不经常更改的内容使用缓存,例如系统提示、工具定义或常见上下文。
- 选择合适的放置点:
- 当系统提示在多个对话中保持一致时,使用
AFTER_SYSTEM
。 - 当有一组稳定的工具定义时,使用
AFTER_TOOLS
。 - 当用户上下文重复时,使用
AFTER_USER_MESSAGE
。
- 监控缓存命中:每次缓存命中时,5 分钟的 TTL 会重置,因此频繁使用相同缓存内容的请求将保持缓存。
- 成本优化:对于重复使用的长系统提示或工具定义,缓存尤其有益。