Bedrock Converse

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

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

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

  • 工具/函数调用:支持在对话过程中进行函数定义和工具使用

  • 多模态输入:能够在对话中处理文本和图像输入

  • 流式支持:模型响应的实时流式传输

  • 系统消息:支持系统级指令和上下文设置

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

根据 Bedrock 的建议,Spring AI 正在转向在所有 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!”。你应该能够获得你的 access key 和 security key。

  • 启用要使用的模型:前往 Amazon Bedrock,从左侧的 模型访问 菜单中配置对你要使用模型的访问权限。

自动配置

Spring AI 的自动配置和 Starter 模块的工件名称发生了重大变化。请参阅 升级说明 以获取更多信息。

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 超时时间

5m

spring.ai.bedrock.aws.access-key

AWS access key

-

spring.ai.bedrock.aws.secret-key

AWS secret key

-

spring.ai.bedrock.aws.session-token

用于临时凭证的 AWS Session Token

-

启用和禁用聊天自动配置现在通过以 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 default

spring.ai.bedrock.converse.chat.options.top-k

生成下一个 Token 时的候选 Token 数量

AWS Bedrock default

spring.ai.bedrock.converse.chat.options.max-tokens

生成响应中的最大 Token 数量

500

运行时选项

使用通用的 ChatOptionsToolCallingChatOptions Builder 来创建模型配置参数,例如温度值(temperature)、最大 Token 数(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 类型的 Bean 作为工具使用:

@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、文档、HTML、Markdown 以及其他数据格式。

Bedrock Converse API 支持多模态输入,包括文本和图像输入,并且能够基于组合输入生成文本响应。

你需要使用支持多模态输入的模型,例如 Anthropic Claude 或 Amazon Nova 模型。

图片

对于支持视觉多模态的 模型(例如 Amazon Nova、Anthropic Claude、Llama 3.2),Bedrock Converse API 允许你在请求体中包含多张图像。这些模型可以分析传入的图像,并根据提供的指令回答问题、对图像进行分类,以及生成图像的摘要。

目前,Bedrock Converse 支持以 base64 编码形式传递的 image/jpegimage/pngimage/gifimage/webp 类型的图像。

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 支持的视频 MIME 类型包括: video/x-matrosvideo/quicktimevideo/mp4video/webmvideo/x-flvvideo/mpegvideo/x-ms-wmvimage/3gpp

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 支持(测试版)和 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.
...

示例 Controller

创建一个新的 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

以下是一个使用聊天模型的 Controller 示例:

@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();
    }
}