Bedrock Converse API
Amazon Bedrock Converse API 为对话式 AI 模型提供了一个统一的接口,具有增强的功能,包括函数/工具调用、多模态输入和流式响应。
Bedrock Converse API 具有以下高级功能
-
工具/函数调用:支持在对话中定义函数和使用工具
-
多模态输入:能够在对话中处理文本和图像输入
-
流式支持:实时流式传输模型响应
-
系统消息:支持系统级指令和上下文设置
Bedrock Converse API 提供了一个跨多个模型提供商的统一接口,同时处理 AWS 特定的认证和基础设施问题。目前,Converse API 支持的模型 包括:Amazon Titan , Amazon Nova , AI21 Labs , Anthropic Claude , Cohere Command , Meta Llama , Mistral AI 。 |
遵循 Bedrock 的建议,Spring AI 正在过渡到使用 Amazon Bedrock 的 Converse API 来实现 Spring AI 中的所有聊天对话。虽然现有的 InvokeModel API 支持对话应用,但我们强烈建议所有聊天对话模型采用 Converse API。 Converse API 不支持 embedding 操作,因此这些操作将保留在当前 API 中,并且现有 |
先决条件
参考 Amazon Bedrock 入门 以设置 API 访问。
-
获取 AWS 凭据:如果您还没有配置 AWS 账户和 AWS CLI,此视频指南可以帮助您配置:AWS CLI & SDK 设置,不到 4 分钟!。您应该能够获取您的访问密钥和安全密钥。
-
启用要使用的模型:前往 Amazon Bedrock,在左侧的 模型访问 菜单中,配置您将要使用的模型的访问权限。
自动配置
Spring AI 自动配置、starter 模块的 Artifact 名称发生了重大变化。更多信息请参考升级说明。 |
将 spring-ai-starter-model-bedrock-converse
依赖项添加到项目的 Maven pom.xml
或 Gradle build.gradle
构建文件中。
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-bedrock-converse</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-bedrock-converse'
}
参考 依赖管理 部分,将 Spring AI BOM 添加到您的构建文件中。 |
聊天属性
前缀 spring.ai.bedrock.aws
是用于配置与 AWS Bedrock 连接的属性前缀。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.bedrock.aws.region |
要使用的 AWS 区域。 |
us-east-1 |
spring.ai.bedrock.aws.timeout |
要使用的 AWS 超时。 |
5 分钟 |
spring.ai.bedrock.aws.access-key |
AWS 访问密钥。 |
- |
spring.ai.bedrock.aws.secret-key |
AWS 安全密钥。 |
- |
spring.ai.bedrock.aws.session-token |
用于临时凭据的 AWS 会话令牌。 |
- |
聊天自动配置的启用和禁用现在通过带有前缀 要启用,设置 spring.ai.model.chat=bedrock-converse (默认启用) 要禁用,设置 spring.ai.model.chat=none (或任何不匹配 bedrock-converse 的值) 此更改是为了允许配置多个模型。 |
前缀 spring.ai.bedrock.converse.chat
是用于配置 Converse API 聊天模型实现的属性前缀。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.bedrock.converse.chat.enabled (已移除且不再有效) |
启用 Bedrock Converse 聊天模型。 |
true |
spring.ai.model.chat |
启用 Bedrock Converse 聊天模型。 |
bedrock-converse |
spring.ai.bedrock.converse.chat.options.model |
要使用的模型 ID。您可以使用 支持的模型和模型功能 |
无。从 AWS Bedrock 控制台选择您的 modelId。 |
spring.ai.bedrock.converse.chat.options.temperature |
控制输出的随机性。取值范围为 [0.0, 1.0] |
0.8 |
spring.ai.bedrock.converse.chat.options.top-p |
采样时考虑的最大累积 token 概率。 |
AWS Bedrock 默认值 |
spring.ai.bedrock.converse.chat.options.top-k |
生成下一个 token 时考虑的 token 选择数量。 |
AWS Bedrock 默认值 |
spring.ai.bedrock.converse.chat.options.max-tokens |
生成响应中的最大 token 数量。 |
500 |
运行时选项
使用可移植的 ChatOptions
或 ToolCallingChatOptions
构建器创建模型配置,例如 temperature, maxToken, topP 等。
启动时,可以使用 BedrockConverseProxyChatModel(api, options)
构造函数或 spring.ai.bedrock.converse.chat.options.*
属性配置默认选项。
运行时,您可以通过在 Prompt
调用中添加新的、请求特定的选项来覆盖默认选项。
var options = ToolCallingChatOptions.builder()
.model("anthropic.claude-3-5-sonnet-20240620-v1:0")
.temperature(0.6)
.maxTokens(300)
.toolCallbacks(List.of(FunctionToolCallback.builder("getCurrentWeather", new WeatherService())
.description("Get the weather in location. Return temperature in 36°F or 36°C format. Use multi-turn if needed.")
.inputType(WeatherService.Request.class)
.build()))
.build();
String response = ChatClient.create(this.chatModel)
.prompt("What is current weather in Amsterdam?")
.options(options)
.call()
.content();
工具调用
Bedrock Converse API 支持工具调用功能,允许模型在对话中使用工具。以下是定义和使用基于 @Tool 的工具的示例
public class WeatherService {
@Tool(description = "Get the weather in location")
public String weatherByLocation(@ToolParam(description= "City or state name") String location) {
...
}
}
String response = ChatClient.create(this.chatModel)
.prompt("What's the weather like in Boston?")
.tools(new WeatherService())
.call()
.content();
您也可以将 java.util.function beans 用作工具。
@Bean
@Description("Get the weather in location. Return temperature in 36°F or 36°C format.")
public Function<Request, Response> weatherFunction() {
return new MockWeatherService();
}
String response = ChatClient.create(this.chatModel)
.prompt("What's the weather like in Boston?")
.tools("weatherFunction")
.inputType(Request.class)
.call()
.content();
更多内容请参阅工具文档。
多模态
多模态指的是模型同时理解和处理来自各种来源信息的能力,包括文本、图像、视频、pdf、doc、html、md 和更多数据格式。
Bedrock Converse API 支持多模态输入,包括文本和图像输入,并可根据组合输入生成文本响应。
您需要一个支持多模态输入的模型,例如 Anthropic Claude 或 Amazon Nova 模型。
图像
对于支持视觉多模态的 模型,例如 Amazon Nova、Anthropic Claude、Llama 3.2,Bedrock Converse API Amazon 允许您在有效载荷中包含多个图像。这些模型可以分析传递的图像并回答问题、对图像进行分类,以及根据提供的指令总结图像。
目前,Bedrock Converse 支持 image/jpeg
、image/png
、image/gif
和 image/webp
MIME 类型的 base64
编码图像。
Spring AI 的 Message
接口通过引入 Media
类型来支持多模态 AI 模型。它包含消息中媒体附件的数据和信息,使用 Spring 的 org.springframework.util.MimeType
和一个 java.lang.Object
来表示原始媒体数据。
下面是一个简单的代码示例,演示了用户文本与图像的结合。
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text("Explain what do you see on this picture?")
.media(Media.Format.IMAGE_PNG, new ClassPathResource("/test.png")))
.call()
.content();
logger.info(response);
它以 test.png
图像作为输入

以及文本消息“Explain what do you see on this picture?”,并生成类似如下的响应
The image shows a close-up view of a wire fruit basket containing several pieces of fruit. ...
视频
Amazon Nova 模型 允许您在有效载荷中包含单个视频,该视频可以 base64 格式提供,也可以通过 Amazon S3 URI 提供。
目前,Bedrock Nova 支持 video/x-matros
、video/quicktime
、video/mp4
、video/video/webm
、video/x-flv
、video/mpeg
、video/x-ms-wmv
和 image/3gpp
MIME 类型的图像。
Spring AI 的 Message
接口通过引入 Media`
类型来支持多模态 AI 模型。它包含消息中媒体附件的数据和信息,使用 Spring 的 org.springframework.util.MimeType
和一个 java.lang.Object
来表示原始媒体数据。
下面是一个简单的代码示例,演示了用户文本与视频的结合。
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text("Explain what do you see in this video?")
.media(Media.Format.VIDEO_MP4, new ClassPathResource("/test.video.mp4")))
.call()
.content();
logger.info(response);
它以 test.video.mp4
图像作为输入

以及文本消息“Explain what do you see in this video?”,并生成类似如下的响应
The video shows a group of baby chickens, also known as chicks, huddled together on a surface ...
文档
对于某些模型,Bedrock 允许您通过 Converse API 文档支持将文档包含在有效载荷中,文档可以以字节形式提供。文档支持有两种不同的变体,如下所述
-
文本文档类型 (txt, csv, html, md 等),重点在于文本理解。这些用例包括基于文档的文本元素进行回答。
-
媒体文档类型 (pdf, docx, xlsx),重点在于基于视觉的理解来回答问题。这些用例包括基于图表等内容进行回答。
目前,Anthropic 的 PDF 支持 (beta) 和 Amazon Bedrock Nova 模型支持文档多模态。
下面是一个简单的代码示例,演示了用户文本与媒体文档的结合。
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text(
"You are a very professional document summarization specialist. Please summarize the given document.")
.media(Media.Format.DOC_PDF, new ClassPathResource("/spring-ai-reference-overview.pdf")))
.call()
.content();
logger.info(response);
它以 spring-ai-reference-overview.pdf
文档作为输入

以及文本消息“You are a very professional document summarization specialist. Please summarize the given document.”,并生成类似如下的响应
**Introduction:** - Spring AI is designed to simplify the development of applications with artificial intelligence (AI) capabilities, aiming to avoid unnecessary complexity. ...
示例控制器
创建一个新的 Spring Boot 项目,并将 spring-ai-starter-model-bedrock-converse
添加到您的依赖项中。
在 src/main/resources
下添加一个 application.properties
文件
spring.ai.bedrock.aws.region=eu-central-1
spring.ai.bedrock.aws.timeout=10m
spring.ai.bedrock.aws.access-key=${AWS_ACCESS_KEY_ID}
spring.ai.bedrock.aws.secret-key=${AWS_SECRET_ACCESS_KEY}
# session token is only required for temporary credentials
spring.ai.bedrock.aws.session-token=${AWS_SESSION_TOKEN}
spring.ai.bedrock.converse.chat.options.temperature=0.8
spring.ai.bedrock.converse.chat.options.top-k=15
以下是使用聊天模型的示例控制器
@RestController
public class ChatController {
private final ChatClient chatClient;
@Autowired
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", this.chatClient.prompt(message).call().content());
}
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return this.chatClient.prompt(message).stream().content();
}
}