Bedrock Converse API

Amazon Bedrock Converse API 為對話式 AI 模型提供統一介面,並具有增強功能,包括函數/工具呼叫、多模態輸入和串流回應。

Bedrock Converse API 具有以下高階功能

  • 工具/函數呼叫:支援對話期間的函數定義和工具使用

  • 多模態輸入:能夠在對話中處理文字和影像輸入

  • 串流支援:模型回應的即時串流

  • 系統訊息:支援系統級指令和情境設定

Bedrock Converse API 在處理 AWS 特定的身份驗證和基礎設施問題的同時,為多個模型提供者提供統一的介面。

根據 Bedrock 的建議,Spring AI 正在轉型為在 Spring AI 中的所有聊天對話實作中使用 Amazon Bedrock 的 Converse API。雖然現有的 InvokeModel API 支援對話應用程式,但我們強烈建議採用 Converse API,因為它具有以下幾個主要優勢

  • 統一介面:編寫一次程式碼,即可與任何支援的 Amazon Bedrock 模型搭配使用

  • 模型彈性:在不同的對話模型之間無縫切換,無需修改程式碼

  • 擴展功能:透過專用結構支援模型特定的參數

  • 工具支援:與函數呼叫和工具使用功能原生整合

  • 多模態功能:內建支援視覺和其他多模態功能

  • 面向未來:與 Amazon Bedrock 建議的最佳實務做法一致

Converse API 不支援嵌入操作,因此這些操作將保留在目前的 API 中,並且現有 InvokeModel API 中的嵌入模型功能將繼續維護

先決條件

請參閱Amazon Bedrock 入門指南以設定 API 存取權限

自動設定

spring-ai-bedrock-converse-spring-boot-starter 相依性新增至專案的 Maven pom.xml 或 Gradle build.gradle 建置檔案

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-bedrock-converse-spring-boot-starter</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-bedrock-converse-spring-boot-starter'
}
請參閱相依性管理章節,將 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 存取金鑰。

-

spring.ai.bedrock.aws.secret-key

AWS 秘密金鑰。

-

spring.ai.bedrock.aws.session-token

用於暫時憑證的 AWS 會話令牌。

-

字首 spring.ai.bedrock.converse.chat 是用於設定 Converse API 的聊天模型實作的屬性字首。

屬性 描述 預設值

spring.ai.bedrock.converse.chat.enabled

啟用 Bedrock Converse 聊天模型。

true

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

執行階段選項

使用可攜式 ChatOptionsFunctionCallingOptions 可攜式建構器來建立模型配置,例如 temperature、maxToken、topP 等。

在啟動時,可以使用 BedrockConverseProxyChatModel(api, options) 建構函式或 spring.ai.bedrock.converse.chat.options.* 屬性來配置預設選項。

在執行階段,您可以透過將新的、請求特定的選項新增至 Prompt 呼叫來覆寫預設選項

var options = FunctionCallingOptions.builder()
        .withModel("anthropic.claude-3-5-sonnet-20240620-v1:0")
        .withTemperature(0.6)
        .withMaxTokens(300)
        .withFunctionCallbacks(List.of(FunctionCallback.builder()
            .description("Get the weather in location. Return temperature in 36°F or 36°C format. Use multi-turn if needed.")
            .function("getCurrentWeather", new WeatherService())
            .inputType(WeatherService.Request.class)
            .build()))
        .build();

ChatResponse response = chatModel.call(new Prompt("What is current weather in Amsterdam?", options));

工具/函數呼叫

Bedrock Converse API 支援函數呼叫功能,允許模型在對話期間使用工具。以下是如何定義和使用函數的範例

@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?")
        .function("weatherFunction")
        .call()
        .content();

範例控制器

建立一個新的 Spring Boot 專案,並將 spring-ai-bedrock-converse-spring-boot-starter 新增至您的相依性。

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