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来实现所有聊天对话功能。 虽然现有的 InvokeModel API 支持对话应用,但我们强烈建议为所有聊天对话模型采用Converse API。 Converse API不支持嵌入操作,因此这些操作将保留在当前API中,现有`InvokeModel API`中的嵌入模型功能将保持不变。 |
前提条件
参考 开始使用Amazon Bedrock 来设置API访问
-
获取AWS凭证:如果您还没有AWS账户和AWS CLI配置,这个视频指南可以帮助您配置:AWS CLI & SDK Setup in Less Than 4 Minutes!。您应该能够获取您的访问密钥和安全密钥。
-
启用要使用的模型:访问 Amazon Bedrock,从左侧的 Model Access 菜单配置您将要使用的模型的访问权限。
自动配置
Spring AI的自动配置、starter模块的构件名称发生了重大变化。 请参考 升级说明 获取更多信息。 |
在项目的Maven `pom.xml`或Gradle `build.gradle`构建文件中添加`spring-ai-starter-model-bedrock-converse`依赖:
-
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超时。 |
5m |
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`的顶级属性进行配置。 要启用,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 |
采样时考虑的最大累积概率。 |
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("获取位置的天气。返回36°F或36°C格式的温度。如果需要,使用多轮对话。")
.inputType(WeatherService.Request.class)
.build()))
.build();
String response = ChatClient.create(this.chatModel)
.prompt("阿姆斯特丹现在的天气如何?")
.options(options)
.call()
.content();
工具调用
Bedrock Converse API支持工具调用功能,允许模型在对话过程中使用工具。 以下是如何定义和使用基于@Tool的工具的示例:
public class WeatherService {
@Tool(description = "获取位置的天气")
public String weatherByLocation(@ToolParam(description= "城市或州名") String location) {
...
}
}
String response = ChatClient.create(this.chatModel)
.prompt("波士顿的天气如何?")
.tools(new WeatherService())
.call()
.content();
您也可以使用java.util.function beans作为工具:
@Bean
@Description("获取位置的天气。返回36°F或36°C格式的温度。")
public Function<Request, Response> weatherFunction() {
return new MockWeatherService();
}
String response = ChatClient.create(this.chatModel)
.prompt("波士顿的天气如何?")
.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允许您在有效载荷中包含多个图像。这些模型可以分析传递的图像并回答问题、对图像进行分类,以及根据提供的指令总结图像。
目前,Bedrock Converse支持`base64`编码的`image/jpeg`、image/png
、`image/gif`和`image/webp`mime类型的图像。
Spring AI的`Message`接口通过引入`Media`类型支持多模态AI模型。 它包含消息中媒体附件的数据和信息,使用Spring的`org.springframework.util.MimeType`和`java.lang.Object`作为原始媒体数据。
下面是一个简单的代码示例,演示了用户文本与图像的组合:
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text("解释你在这张图片上看到了什么?")
.media(Media.Format.IMAGE_PNG, new ClassPathResource("/test.png")))
.call()
.content();
logger.info(response);
它接收`test.png`图像作为输入:

以及文本消息"解释你在这张图片上看到了什么?",并生成类似这样的响应:
图片显示了一个装有几块水果的金属丝水果篮的特写视图。 ...
视频
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("解释你在这个视频中看到了什么?")
.media(Media.Format.VIDEO_MP4, new ClassPathResource("/test.video.mp4")))
.call()
.content();
logger.info(response);
它接收`test.video.mp4`视频作为输入:

以及文本消息"解释你在这个视频中看到了什么?",并生成类似这样的响应:
视频显示了一群小鸡,也称为雏鸡,聚集在一个表面上 ...
文档
对于某些模型,Bedrock允许您通过Converse API文档支持在有效载荷中包含文档,可以通过字节提供。 文档支持有两种不同的变体,如下所述:
-
文本文档类型(txt、csv、html、md等),重点是文本理解。这些用例包括基于文档的文本元素回答问题。
-
媒体文档类型(pdf、docx、xlsx),重点是基于视觉的理解来回答问题。这些用例包括基于图表、图形等回答问题。
目前,Anthropic PDF支持(测试版)和Amazon Bedrock Nova模型支持文档多模态性。
下面是一个简单的代码示例,演示了用户文本与媒体文档的组合:
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text(
"你是一个非常专业的文档摘要专家。请总结给定的文档。")
.media(Media.Format.DOC_PDF, new ClassPathResource("/spring-ai-reference-overview.pdf")))
.call()
.content();
logger.info(response);
它接收`spring-ai-reference-overview.pdf`文档作为输入:

以及文本消息"你是一个非常专业的文档摘要专家。请总结给定的文档。",并生成类似这样的响应:
**简介:** - Spring AI旨在简化具有人工智能(AI)功能的应用程序开发,旨在避免不必要的复杂性。 ...
示例控制器
创建一个新的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}
# 会话令牌仅对临时凭证是必需的
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 = "给我讲个笑话") String message) {
return Map.of("generation", this.chatClient.prompt(message).call().content());
}
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "给我讲个笑话") String message) {
return this.chatClient.prompt(message).stream().content();
}
}