Bedrock Converse API

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 中的嵌入模型功能將得到維護

先決條件

請參閱 Amazon Bedrock 入門 以設定 API 訪問

  • 獲取 AWS 憑證:如果您還沒有 AWS 賬戶和 AWS CLI 配置,此影片指南可以幫助您進行配置:在不到 4 分鐘內設定 AWS CLI 和 SDK!您應該能夠獲取您的訪問金鑰和安全金鑰。

  • 啟用要使用的模型:轉到 Amazon Bedrock,然後從左側的模型訪問選單中,配置對您將要使用的模型的訪問許可權。

自動配置

Spring AI 自動配置、啟動模組的工件名稱發生了重大變化。請參閱 升級說明 以獲取更多資訊。

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

整個 API 呼叫的 AWS 最大持續時間

5m

spring.ai.bedrock.aws.connectionTimeout

建立連線時的最大等待持續時間

5秒

spring.ai.bedrock.aws.connectionAcquisitionTimeout

從連線池獲取新連線的最大等待持續時間

30s

spring.ai.bedrock.aws.asyncReadTimeout

讀取非同步響應的最大持續時間

30s

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 控制檯選擇您的 模型 ID

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

執行時選項

使用可移植的 ChatOptionsBedrockChatOptions 可移植構建器來建立模型配置,例如溫度、maxToken、topP 等。

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

在執行時,可以透過向 Prompt 呼叫新增新的、特定於請求的選項來覆蓋預設選項

var options = BedrockChatOptions.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();

提示快取

AWS Bedrock 的 提示快取功能 允許您快取常用提示,以降低成本並改善重複互動的響應時間。當您快取提示時,後續相同的請求可以重用快取內容,從而顯著減少處理的輸入令牌數量。

支援的模型

Claude 3.x、Claude 4.x 和透過 AWS Bedrock 提供的 Amazon Nova 模型支援提示快取。

令牌要求

不同的模型對快取效率有不同的最低令牌閾值:- Claude Sonnet 4 和大多數模型:1024+ 令牌 - 模型特定要求可能有所不同 - 請查閱 AWS Bedrock 文件

快取策略

Spring AI 透過 BedrockCacheStrategy 列舉提供戰略性快取放置

  • NONE:完全停用提示快取(預設)

  • SYSTEM_ONLY:僅快取系統訊息內容

  • TOOLS_ONLY:僅快取工具定義(僅限 Claude 模型)

  • SYSTEM_AND_TOOLS:快取系統訊息和工具定義(僅限 Claude 模型)

  • CONVERSATION_HISTORY:在聊天記憶場景中快取整個對話歷史記錄

這種戰略方法確保了最佳快取斷點放置,同時保持在 AWS Bedrock 的 4 個斷點限制內。

Amazon Nova 限制

Amazon Nova 模型(Nova Micro、Lite、Pro、Premier)僅支援對 systemmessages 內容進行快取。它們支援對 tools 進行快取。

如果您嘗試將 TOOLS_ONLYSYSTEM_AND_TOOLS 策略與 Nova 模型一起使用,AWS 將返回 ValidationException。對於 Amazon Nova 模型,請使用 SYSTEM_ONLY 策略。

啟用提示快取

透過在 BedrockChatOptions 上設定 cacheOptions 並選擇 strategy 來啟用提示快取。

僅限系統快取

最常見的用例 - 在多個請求中快取系統指令

// Cache system message content
ChatResponse response = chatModel.call(
    new Prompt(
        List.of(
            new SystemMessage("You are a helpful AI assistant with extensive knowledge..."),
            new UserMessage("What is machine learning?")
        ),
        BedrockChatOptions.builder()
            .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
                .build())
            .maxTokens(500)
            .build()
    )
);

僅限工具快取

快取大型工具定義,同時保持系統提示動態(僅限 Claude 模型)

// Cache tool definitions only
ChatResponse response = chatModel.call(
    new Prompt(
        "What's the weather in San Francisco?",
        BedrockChatOptions.builder()
            .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.TOOLS_ONLY)
                .build())
            .toolCallbacks(weatherToolCallbacks)  // Large tool definitions
            .maxTokens(500)
            .build()
    )
);
此策略僅在 Claude 模型上受支援。Amazon Nova 模型將返回 ValidationException

系統和工具快取

快取系統指令和工具定義以實現最大程度的重用(僅限 Claude 模型)

// Cache system message and tool definitions
ChatResponse response = chatModel.call(
    new Prompt(
        List.of(
            new SystemMessage("You are a weather analysis assistant..."),
            new UserMessage("What's the weather like in Tokyo?")
        ),
        BedrockChatOptions.builder()
            .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_AND_TOOLS)
                .build())
            .toolCallbacks(weatherToolCallbacks)
            .maxTokens(500)
            .build()
    )
);
此策略使用 2 個快取斷點(一個用於工具,一個用於系統)。僅在 Claude 模型上受支援。

對話歷史快取

快取多輪聊天機器人和助手的不斷增長的對話歷史記錄

// Cache conversation history with ChatClient and memory
ChatClient chatClient = ChatClient.builder(chatModel)
    .defaultSystem("You are a personalized career counselor...")
    .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory)
        .conversationId(conversationId)
        .build())
    .build();

String response = chatClient.prompt()
    .user("What career advice would you give me?")
    .options(BedrockChatOptions.builder()
        .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
        .cacheOptions(BedrockCacheOptions.builder()
            .strategy(BedrockCacheStrategy.CONVERSATION_HISTORY)
            .build())
        .maxTokens(500)
        .build())
    .call()
    .content();

使用 ChatClient 流式 API

String response = ChatClient.create(chatModel)
    .prompt()
    .system("You are an expert document analyst...")
    .user("Analyze this large document: " + document)
    .options(BedrockChatOptions.builder()
        .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
        .cacheOptions(BedrockCacheOptions.builder()
            .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
            .build())
        .build())
    .call()
    .content();

使用示例

這是一個演示帶有成本跟蹤的提示快取的完整示例

// Create system content that will be reused multiple times
String largeSystemPrompt = "You are an expert software architect specializing in distributed systems...";
// (Ensure this is 1024+ tokens for cache effectiveness)

// First request - creates cache
ChatResponse firstResponse = chatModel.call(
    new Prompt(
        List.of(
            new SystemMessage(largeSystemPrompt),
            new UserMessage("What is microservices architecture?")
        ),
        BedrockChatOptions.builder()
            .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
                .build())
            .maxTokens(500)
            .build()
    )
);

// Access cache-related token usage from metadata
Integer cacheWrite1 = (Integer) firstResponse.getMetadata()
    .getMetadata()
    .get("cacheWriteInputTokens");
Integer cacheRead1 = (Integer) firstResponse.getMetadata()
    .getMetadata()
    .get("cacheReadInputTokens");

System.out.println("Cache creation tokens: " + cacheWrite1);
System.out.println("Cache read tokens: " + cacheRead1);

// Second request with same system prompt - reads from cache
ChatResponse secondResponse = chatModel.call(
    new Prompt(
        List.of(
            new SystemMessage(largeSystemPrompt),  // Same prompt - cache hit
            new UserMessage("What are the benefits of event sourcing?")
        ),
        BedrockChatOptions.builder()
            .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
                .build())
            .maxTokens(500)
            .build()
    )
);

Integer cacheWrite2 = (Integer) secondResponse.getMetadata()
    .getMetadata()
    .get("cacheWriteInputTokens");
Integer cacheRead2 = (Integer) secondResponse.getMetadata()
    .getMetadata()
    .get("cacheReadInputTokens");

System.out.println("Cache creation tokens: " + cacheWrite2); // Should be 0
System.out.println("Cache read tokens: " + cacheRead2);      // Should be > 0

令牌使用跟蹤

AWS Bedrock 透過響應元資料提供特定於快取的指標。快取指標可透過元資料 Map 訪問

ChatResponse response = chatModel.call(/* ... */);

// Access cache metrics from metadata Map
Integer cacheWrite = (Integer) response.getMetadata()
    .getMetadata()
    .get("cacheWriteInputTokens");
Integer cacheRead = (Integer) response.getMetadata()
    .getMetadata()
    .get("cacheReadInputTokens");

特定於快取的指標包括

  • cacheWriteInputTokens:返回建立快取條目時使用的令牌數

  • cacheReadInputTokens:返回從現有快取條目讀取的令牌數

當您第一次傳送快取的提示時: - cacheWriteInputTokens 將大於 0 - cacheReadInputTokens 將為 0

當您再次傳送相同的快取提示時(在 5 分鐘 TTL 內): - cacheWriteInputTokens 將為 0 - cacheReadInputTokens 將大於 0

實際用例

透過在多個問題中快取文件內容,高效分析大型法律合同或合規文件

// Load a legal contract (PDF or text)
String legalContract = loadDocument("merger-agreement.pdf"); // ~3000 tokens

// System prompt with legal expertise
String legalSystemPrompt = "You are an expert legal analyst specializing in corporate law. " +
    "Analyze the following contract and provide precise answers about terms, obligations, and risks: " +
    legalContract;

// First analysis - creates cache
ChatResponse riskAnalysis = chatModel.call(
    new Prompt(
        List.of(
            new SystemMessage(legalSystemPrompt),
            new UserMessage("What are the key termination clauses and associated penalties?")
        ),
        BedrockChatOptions.builder()
            .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
                .build())
            .maxTokens(1000)
            .build()
    )
);

// Subsequent questions reuse cached document - 90% cost savings
ChatResponse obligationAnalysis = chatModel.call(
    new Prompt(
        List.of(
            new SystemMessage(legalSystemPrompt), // Same content - cache hit
            new UserMessage("List all financial obligations and payment schedules.")
        ),
        BedrockChatOptions.builder()
            .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
                .build())
            .maxTokens(1000)
            .build()
    )
);

批處理程式碼審查

使用一致的審查標準處理多個程式碼檔案,同時快取審查指南

// Define comprehensive code review guidelines
String reviewGuidelines = """
    You are a senior software engineer conducting code reviews. Apply these criteria:
    - Security vulnerabilities and best practices
    - Performance optimizations and memory usage
    - Code maintainability and readability
    - Testing coverage and edge cases
    - Design patterns and architecture compliance
    """;

List<String> codeFiles = Arrays.asList(
    "UserService.java", "PaymentController.java", "SecurityConfig.java"
);

List<String> reviews = new ArrayList<>();

for (String filename : codeFiles) {
    String sourceCode = loadSourceFile(filename);

    ChatResponse review = chatModel.call(
        new Prompt(
            List.of(
                new SystemMessage(reviewGuidelines), // Cached across all reviews
                new UserMessage("Review this " + filename + " code:\n\n" + sourceCode)
            ),
            BedrockChatOptions.builder()
                .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
                .cacheOptions(BedrockCacheOptions.builder()
                    .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
                    .build())
                .maxTokens(800)
                .build()
        )
    );

    reviews.add(review.getResult().getOutput().getText());
}

// Guidelines cached after first request, subsequent reviews are faster and cheaper

具有知識庫的客戶支援

建立客戶支援系統,快取您的產品知識庫以提供一致、準確的響應

// Load comprehensive product knowledge
String knowledgeBase = """
    PRODUCT DOCUMENTATION:
    - API endpoints and authentication methods
    - Common troubleshooting procedures
    - Billing and subscription details
    - Integration guides and examples
    - Known issues and workarounds
    """ + loadProductDocs(); // ~2500 tokens

@Service
public class CustomerSupportService {

    public String handleCustomerQuery(String customerQuery, String customerId) {
        ChatResponse response = chatModel.call(
            new Prompt(
                List.of(
                    new SystemMessage("You are a helpful customer support agent. " +
                        "Use this knowledge base to provide accurate solutions: " + knowledgeBase),
                    new UserMessage("Customer " + customerId + " asks: " + customerQuery)
                ),
                BedrockChatOptions.builder()
                    .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
                    .cacheOptions(BedrockCacheOptions.builder()
                        .strategy(BedrockCacheStrategy.SYSTEM_ONLY)
                        .build())
                    .maxTokens(600)
                    .build()
            )
        );

        return response.getResult().getOutput().getText();
    }
}

// Knowledge base is cached across all customer queries
// Multiple support agents can benefit from the same cached content

多租戶 SaaS 應用程式

在不同租戶之間快取共享工具定義,同時為每個租戶定製系統提示

// Shared tool definitions (cached once, used across all tenants)
List<FunctionToolCallback> sharedTools = createLargeToolRegistry(); // ~2000 tokens

// Tenant-specific configuration
@Service
public class MultiTenantAIService {

    public String processRequest(String tenantId, String userQuery) {
        // Load tenant-specific system prompt (changes per tenant)
        String tenantPrompt = loadTenantSystemPrompt(tenantId);

        ChatResponse response = chatModel.call(
            new Prompt(
                List.of(
                    new SystemMessage(tenantPrompt), // Tenant-specific, not cached
                    new UserMessage(userQuery)
                ),
                BedrockChatOptions.builder()
                    .model("us.anthropic.claude-3-7-sonnet-20250219-v1:0")
                    .cacheOptions(BedrockCacheOptions.builder()
                        .strategy(BedrockCacheStrategy.TOOLS_ONLY)
                        .build())
                    .toolCallbacks(sharedTools) // Shared tools - cached
                    .maxTokens(500)
                    .build()
            )
        );

        return response.getResult().getOutput().getText();
    }
}

// Tools cached once, each tenant gets customized system prompt

最佳實踐

  1. 選擇正確的策略:

    • 對可重用系統提示和指令使用 SYSTEM_ONLY(適用於所有模型)

    • 當您有大型穩定工具但動態系統提示時使用 TOOLS_ONLY(僅限 Claude)

    • 當系統和工具都龐大且穩定時使用 SYSTEM_AND_TOOLS(僅限 Claude)

    • 在多輪對話中與 ChatClient 記憶體一起使用 CONVERSATION_HISTORY

    • 使用 NONE 顯式停用快取

  2. 滿足令牌要求:重點快取滿足最低令牌要求(大多數模型為 1024+ 令牌)的內容。

  3. 重用相同內容:快取最適用於提示內容的精確匹配。即使是很小的更改也需要新的快取條目。

  4. 監控令牌使用情況:使用元資料指標跟蹤快取效率

    Integer cacheWrite = (Integer) response.getMetadata().getMetadata().get("cacheWriteInputTokens");
    Integer cacheRead = (Integer) response.getMetadata().getMetadata().get("cacheReadInputTokens");
    if (cacheRead != null && cacheRead > 0) {
        System.out.println("Cache hit: " + cacheRead + " tokens saved");
    }
  5. 戰略性快取放置:實施會根據您選擇的策略自動將快取斷點放置在最佳位置,確保符合 AWS Bedrock 的 4 個斷點限制。

  6. 快取生命週期:AWS Bedrock 快取具有固定的 5 分鐘 TTL(生存時間)。每次快取訪問都會重置計時器。

  7. 模型相容性:請注意模型特定的限制

    • Claude 模型:支援所有快取策略

    • Amazon Nova 模型:僅支援 SYSTEM_ONLYCONVERSATION_HISTORY(不支援工具快取)

  8. 工具穩定性:當使用 TOOLS_ONLYSYSTEM_AND_TOOLSCONVERSATION_HISTORY 策略時,請確保工具保持穩定。更改工具定義將使所有下游快取斷點失效,因為會發生級聯失效。

快取失效和級聯行為

AWS Bedrock 遵循具有級聯失效的分層快取模型

快取層次結構工具 → 系統 → 訊息

每個級別的更改都會使該級別和所有後續級別失效

哪些變化 工具快取 系統快取 訊息快取

工具

❌ 無效

❌ 無效

❌ 無效

系統

✅ 有效

❌ 無效

❌ 無效

訊息

✅ 有效

✅ 有效

❌ 無效

使用 SYSTEM_AND_TOOLS 策略的示例:

// Request 1: Cache both tools and system
ChatResponse r1 = chatModel.call(
    new Prompt(
        List.of(new SystemMessage("System prompt"), new UserMessage("Question")),
        BedrockChatOptions.builder()
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_AND_TOOLS)
                .build())
            .toolCallbacks(tools)
            .build()
    )
);
// Result: Both caches created

// Request 2: Change only system prompt (tools same)
ChatResponse r2 = chatModel.call(
    new Prompt(
        List.of(new SystemMessage("DIFFERENT system prompt"), new UserMessage("Question")),
        BedrockChatOptions.builder()
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_AND_TOOLS)
                .build())
            .toolCallbacks(tools) // SAME tools
            .build()
    )
);
// Result: Tools cache HIT (reused), system cache MISS (recreated)

// Request 3: Change tools (system same as Request 2)
ChatResponse r3 = chatModel.call(
    new Prompt(
        List.of(new SystemMessage("DIFFERENT system prompt"), new UserMessage("Question")),
        BedrockChatOptions.builder()
            .cacheOptions(BedrockCacheOptions.builder()
                .strategy(BedrockCacheStrategy.SYSTEM_AND_TOOLS)
                .build())
            .toolCallbacks(newTools) // DIFFERENT tools
            .build()
    )
);
// Result: BOTH caches MISS (tools change invalidates everything downstream)

實現細節

Spring AI 中的提示快取實現遵循以下關鍵設計原則

  1. 戰略性快取放置:快取斷點會根據所選策略自動放置在最佳位置,確保符合 AWS Bedrock 的 4 個斷點限制。

  2. 提供商可移植性:快取配置透過 BedrockChatOptions 而不是單個訊息完成,從而在不同 AI 提供商之間切換時保持相容性。

  3. 執行緒安全:快取斷點跟蹤使用執行緒安全機制實現,以正確處理併發請求。

  4. UNION 型別模式:AWS SDK 使用 UNION 型別,其中快取點作為單獨的塊而不是屬性新增。這與直接 API 方法不同,但確保了型別安全和 API 合規性。

  5. 增量快取CONVERSATION_HISTORY 策略將快取斷點放置在最後一個使用者訊息上,從而實現增量快取,其中每個對話輪次都基於先前的快取字首。

成本考慮

AWS Bedrock 提示快取定價(近似值,因模型而異)

  • 快取寫入:比基本輸入令牌貴約 25%

  • 快取讀取:便宜約 90%(僅為基本輸入令牌價格的 10%)

  • 盈虧平衡點:只需 1 次快取讀取後,您就省錢了

成本計算示例:

// System prompt: 2000 tokens
// User question: 50 tokens

// Without caching (5 requests):
// Cost: 5 × (2000 + 50) = 10,250 tokens at base rate

// With caching (5 requests):
// Request 1: 2000 tokens × 1.25 (cache write) + 50 = 2,550 tokens
// Requests 2-5: 4 × (2000 × 0.10 (cache read) + 50) = 4 × 250 = 1,000 tokens
// Total: 2,550 + 1,000 = 3,550 tokens equivalent

// Savings: (10,250 - 3,550) / 10,250 = 65% cost reduction

工具呼叫

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?")
        .toolNames("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 支援 base64 編碼的 image/jpegimage/pngimage/gifimage/webp MIME 型別的影像。

Spring AI 的 Message 介面透過引入 Media 型別支援多模態 AI 模型。它包含訊息中媒體附件的資料和資訊,使用 Spring 的 org.springframework.util.MimeTypejava.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

以及文字訊息“解釋你在這張圖片上看到了什麼?”,並生成類似以下的響應

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-matroskavideo/quicktimevideo/mp4video/webmvideo/x-flvvideo/mpegvideo/x-ms-wmvvideo/3gpp MIME 型別的影片。

Spring AI 的 Message 介面透過引入 Media 型別支援多模態 AI 模型。它包含訊息中媒體附件的資料和資訊,使用 Spring 的 org.springframework.util.MimeTypejava.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

以及文字訊息“解釋你在這個影片中看到了什麼?”,並生成類似以下的響應

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 文件作為輸入

Multimodal Test PNG

以及文字訊息“你是一位非常專業的文件摘要專家。請總結給定的文件。”,並生成類似以下的響應

**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();
    }
}
© . This site is unofficial and not affiliated with VMware.