Amazon Bedrock Converse API 为对话式 AI 模型提供统一接口,具有增强功能,包括函数/工具调用、多模态输入和流式响应。

Bedrock Converse API 具有以下高级功能:

工具/函数调用

支持对话期间的函数定义和工具使用

多模态输入

能够在对话中处理文本和图像输入

流式支持

模型响应的实时流式传输

系统消息

支持系统级指令和上下文设置

Bedrock Converse API 在多个模型提供商之间提供统一接口,同时处理特定于 AWS 的身份验证和基础设施问题。 目前,Converse API 支持的模型包括: Amazon TitanAmazon NovaAI21 LabsAnthropic ClaudeCohere CommandMeta LlamaMistral AI

根据 Bedrock 的建议,Spring AI 正在过渡到使用 Amazon Bedrock 的 Converse API 来实现 Spring AI 中的所有聊天对话。 虽然现有的 InvokeModel API 支持对话应用程序,但我们强烈建议为所有聊天对话模型采用 Converse API。

Converse API 不支持嵌入操作,因此这些操作将保留在当前 API 中,并且现有 InvokeModel API 中的嵌入模型功能将得到维护。

前提条件

有关设置 API 访问权限,请参阅Amazon Bedrock 入门

1

获取 AWS 凭证

如果你还没有 AWS 账户和配置好的 AWS CLI,此视频指南可以帮助你进行配置:不到 4 分钟完成 AWS CLI 和 SDK 设置!。你应该能够获取你的访问密钥和安全密钥。

2

启用要使用的模型

转到 Amazon Bedrock 并从左侧的模型访问菜单中,配置对要使用的模型的访问权限。

自动配置

Spring AI 自动配置、启动器模块的构件名称发生了重大变化。 有关更多信息,请参阅升级说明

spring-ai-starter-model-bedrock-converse 依赖项添加到项目的 Maven pom.xml 或 Gradle build.gradle 构建文件中:

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

请参阅依赖管理部分,将 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-keyAWS 访问密钥。-
spring.ai.bedrock.aws.secret-keyAWS 秘密密钥。-
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用于生成下一个标记的标记选项数。AWS Bedrock 默认值
spring.ai.bedrock.converse.chat.options.max-tokens生成响应中的最大标记数。500

运行时选项

使用可移植的 ChatOptionsToolCallingChatOptions 可移植构建器来创建模型配置,例如温度、最大令牌数、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 bean 作为工具:

@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 Amazon 允许你在有效负载中包含多个图像。这些模型可以分析传递的图像并回答问题、对图像进行分类,以及根据提供的说明对图像进行总结。

目前,Bedrock Converse 支持 image/jpegimage/pngimage/gifimage/webp mime 类型的 base64 编码图像。

Spring AI 的 Message 接口通过引入 Media 类型来支持多模态 AI 模型。 它包含有关消息中媒体附件的数据和信息,使用 Spring 的 org.springframework.util.MimeTypejava.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-matrosvideo/quicktimevideo/mp4video/video/webmvideo/x-flvvideo/mpegvideo/x-ms-wmvimage/3gpp mime 类型的图像。

Spring AI 的 Message 接口通过引入 Media 类型来支持多模态 AI 模型。 它包含有关消息中媒体附件的数据和信息,使用 Spring 的 org.springframework.util.MimeTypejava.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 文档作为输入:

多模态测试 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();
    }
} 

<Card title="文档有误?请协助编辑" icon="pencil" href="https://github.com/javaai-pig4cloud-com/javaai-docs/edit/main/spring-ai/api/chat/bedrock-converse.mdx">
  发现文档问题?点击此处直接在 GitHub 上编辑并提交 PR,帮助我们改进文档!
</Card>