|
获取最新的快照版本,请使用 Spring AI 1.1.3! |
Bedrock converse API
亚马逊 Bedrock Converse API 提供了一个增强功能的统一界面,支持对话式 AI 模型,包括函数/工具调用、多模态输入和流式响应。
Bedrock Converse API 的高阶功能包括:
-
工具/函数调用:支持在对话中对函数进行定义和工具的使用
-
多模态输入:能够在对话中处理文本和图像输入
-
流支持:实时模型响应流支持
-
系统消息:支持系统级指令和上下文设置
bedsrock converse api 提供了一个多模型提供者之间的统一接口,同时处理了aws特定的认证和基础设施问题。
目前, converse api 支持的模型 包括:
Amazon Titan,Amazon Nova,AI21 Labs,Anthropic Claude,Cohere Command,Meta Llama,Mistral AI。 |
|
遵循 Bedrock 的推荐,Spring AI 正在采用亚马逊 Bedrock 的 converse API 作为所有 Spring AI 应用中的聊天会话实现的基础。 虽然现有的 InvokeModel API 支持聊天应用,但我们强烈推荐为所有 Chat 会话模型采用 converse API。 converse 平台不支持嵌入操作,因此这些功能将继续存在于现有版本中,并继续维护模型功能 |
前提条件
Refer to 如何开始使用亚马逊 Bedrock for setting up API access
-
获取AWS凭证:如果你还没有AWS账户或尚未配置AWS CLI和SDK,这部教学视频指南可以帮助你完成配置:AWS CLI和SDK快速配置指南!。你应该能够获得你的访问凭证和安全凭证。
-
启用的模型:前往亚马逊 Bedrock,并在左侧的“模型访问”菜单中从模型访问菜单中配置要使用的模型的访问权限。
自动配置
|
There has been a significant change in the Spring AI auto-configuration, starter modules' artifact names. Please refer to the 升级说明以获取更多信息。 |
Add the spring-ai-starter-model-bedrock-converse dependency to your project’s Maven pom.xml or Gradle build.gradle build files:
-
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 是配置到亚马逊 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 会话Tokens。 |
- |
|
启用和禁用聊天自动配置现在通过顶级属性使用前缀 要启用,spring.ai.model.chat=bedrock-converse(这是默认启用的) 要禁用,设置为 {none}(或者任何不匹配 bedrock-converse 的值) 这种修改是为了允许配置多个模型。 |
The prefix spring.ai.bedrock.converse.chat is the property prefix that configures the chat model implementation for the Converse API.
| 属性 | 描述 | 默认 |
|---|---|---|
Spring.ai Bedsrock Converse Chat Enabled (已移除,不再有效) |
启用 Bedrock 息聊模型。 |
true |
spring.ai.model.chat |
启用 Bedrock 息聊模型。 |
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 |
在采样时考虑的Tokens的最大累积概率。 |
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 便携构建器来创建模型配置,例如温度、maxToken、topP等。
On start-up, the default options can be configured with the BedrockConverseProxyChatModel(api, options) constructor or the spring.ai.bedrock.converse.chat.options.* properties.
在运行时,你可以通过在 Prompt 调用中添加新的、针对请求的特殊选项来 override 默认选项:
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?")
.toolNames("weatherFunction")
.inputType(Request.class)
.call()
.content();
在工具文档中查找更多信息。
多模态
多模态是指模型同时理解和处理来自多种来源的信息的能力,包括文本、图像、视频、PDF、DOC、HTML、MD 以及其他多种数据格式。
Bedrock Converse API 支持多模态输入,包括文本和图像输入,并可根据组合后的输入生成文本响应。
你需要一个支持多模态输入的模型,例如 Anthropic 的 Claude 或 Amazon 的 Nova 模型。
图片
对于支持视觉多模态的< a t="C0">模型,例如 Amazon Nova、Anthropic Claude、Llama 3.2 和 Bedrock Converse API,Amazon 允许您在有效载荷中包含多张图像。这些模型可以分析传入的图像并回答问题、对图像进行分类,以及根据提供的指令对图像进行总结。
目前,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("Explain what do you see on this picture?")
.media(Media.Format.IMAGE_PNG, new ClassPathResource("/test.png")))
.call()
.content();
logger.info(response);
它以 test.png 图像作为输入:

以及文本消息“解释一下你在这张图片上看到了什么?”,并生成类似如下的回复:
The image shows a close-up view of a wire fruit basket containing several pieces of fruit. ...
视频
The Amazon Nova models allow you to include a single video in the payload, which can be provided either in base64 format or through an Amazon S3 URI.
目前,Bedrock Nova 支持 video/x-matroska、video/quicktime、video/mp4、video/webm、video/x-flv、video/mpeg、video/x-ms-wmv 和 video/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 图像作为输入:

以及文本消息“解释一下你在这个视频中看到了什么?”,并生成类似如下的回复:
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 支持(测试版) 和 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 文档作为输入:

与文本消息“您是一位非常专业的文档摘要专家。请对给定的文档进行摘要。”一起,并生成类似如下的回复:
**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 添加到您的依赖项中。
添加一个 application.properties 文件到 src/main/resources:
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();
}
}