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