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 中,并且现有 InvokeModel API 中的 embedding 模型功能将得到维护。

先决条件

参考 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 的顶级属性进行配置。

要启用,设置 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

运行时选项

使用可移植的 ChatOptionsToolCallingChatOptions 构建器创建模型配置,例如 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/jpegimage/pngimage/gifimage/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 图像作为输入

Multimodal Test Image

以及文本消息“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-matrosvideo/quicktimevideo/mp4video/video/webmvideo/x-flvvideo/mpegvideo/x-ms-wmvimage/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 图像作为输入

Multimodal Test Video

以及文本消息“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 文档作为输入

Multimodal Test PNG

以及文本消息“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();
    }
}