Bedrock Converse API

亚马逊Bedrock Converse API为对话式AI模型提供了统一界面,具备增强功能,包括函数/工具调用、多模态输入和流式响应。spring-doc.cadn.net.cn

Bedrock Converse API 具有以下高级功能:spring-doc.cadn.net.cn

Bedrock Converse API 在处理 AWS 特有的认证和基础设施问题时,提供了跨多个型号提供商的统一接口。 目前,Converse API 支持的模型包括:亚马逊泰坦,亚马逊新星,AI21实验室,拟人克洛德,Cohere 指挥,元羊驼,密斯特拉尔人工智能.

遵循 Bedrock 的建议,Spring AI 正在转向使用 Amazon Bedrock 的 Converse API 来实现所有聊天对话。 虽然现有的 InvokeModel API 支持对话应用,但我们强烈建议所有聊天对话模型采用 Converse API。spring-doc.cadn.net.cn

Converse API 不支持嵌入作,因此这些作将保留在当前 API,嵌入模型功能则保留在现有 API 中InvokeModel API将被维护spring-doc.cadn.net.cn

前提条件

请参阅《亚马逊基石入门》一文,了解如何设置 API 访问spring-doc.cadn.net.cn

自动配置

春季AI自动配置、起始模块的工件名称发生了重大变化。 更多信息请参阅升级说明spring-doc.cadn.net.cn

添加Spring-AI-入门模型-Bedrock-Converse对你项目Maven的依赖pom.xml或者Gradlebuild.gradle构建文件:spring-doc.cadn.net.cn

<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的物料清单添加到你的构建文件中。

聊天属性

前缀春.ai.bedrock.aws是配置与AWS Bedrock连接的属性前缀。spring-doc.cadn.net.cn

属性 描述 默认值

spring.ai.bedrock.aws.regionspring-doc.cadn.net.cn

AWS 区域使用spring-doc.cadn.net.cn

美国东1号spring-doc.cadn.net.cn

spring.ai.bedrock.aws.timeoutspring-doc.cadn.net.cn

AWS 整个 API 调用的最大时长spring-doc.cadn.net.cn

5米spring-doc.cadn.net.cn

spring.ai.bedrock.aws.connection超时spring-doc.cadn.net.cn

建立连接的最大等待时间spring-doc.cadn.net.cn

5spring-doc.cadn.net.cn

spring.ai.bedrock.aws.connection获取超时spring-doc.cadn.net.cn

等待新连接从池中获得的最大时间spring-doc.cadn.net.cn

30多岁spring-doc.cadn.net.cn

spring.ai.bedrock.aws.async读超时spring-doc.cadn.net.cn

阅读异步回答的最大持续时间spring-doc.cadn.net.cn

30多岁spring-doc.cadn.net.cn

spring.ai.bedrock.aws.访问密钥spring-doc.cadn.net.cn

AWS 访问密钥spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

Spring.ai.bedrock.aws.秘密密钥spring-doc.cadn.net.cn

AWS 秘密密钥spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.bedrock.aws.session-token(Spring)。Bedrock.aws.session-token(会话Tokens)spring-doc.cadn.net.cn

AWS 会话Tokens用于临时凭证spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

现在,启用和禁用聊天自动配置通过带有前缀的顶层属性进行配置spring.ai.model.chat.spring-doc.cadn.net.cn

启用时,spring.ai.model.chat=bedrock-converse(默认启用)spring-doc.cadn.net.cn

要禁用,请使用spring.ai.model.chat=none(或任何不匹配Bedrock-Converse的值)spring-doc.cadn.net.cn

此改动旨在允许配置多个模型。spring-doc.cadn.net.cn

前缀春.ai.bedrock.converse.chat是配置Converse API聊天模型实现的属性前缀。spring-doc.cadn.net.cn

属性 描述 默认值

spring.ai.bedrock.converse.chat.enabled(已移除且不再有效)spring-doc.cadn.net.cn

启用Bedrock Converse聊天模式。spring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

spring.ai.model.chatspring-doc.cadn.net.cn

启用Bedrock Converse聊天模式。spring-doc.cadn.net.cn

基岩-康弗斯spring-doc.cadn.net.cn

spring.ai.bedrock.converse.chat.options.modelspring-doc.cadn.net.cn

模型ID。你可以使用支持的模型和模型特性spring-doc.cadn.net.cn

没有。 在AWS Bedrock控制台中选择你的modelIDspring-doc.cadn.net.cn

spring.ai.bedrock.converse.chat.options.temperature.temperaturespring-doc.cadn.net.cn

控制输出的随机性。值范围可为 [0.0,1.0]spring-doc.cadn.net.cn

0.8spring-doc.cadn.net.cn

spring.ai.bedrock.converse.chat.options.top-pspring-doc.cadn.net.cn

抽样时需要考虑的Tokens的最大累计概率。spring-doc.cadn.net.cn

AWS Bedrock 默认设置spring-doc.cadn.net.cn

spring.ai.bedrock.converse.chat.options.top-kspring-doc.cadn.net.cn

生成下一个Tokens时的Tokens选择数量。spring-doc.cadn.net.cn

AWS Bedrock 默认设置spring-doc.cadn.net.cn

spring.ai.bedrock.converse.chat.options.max标记spring-doc.cadn.net.cn

生成的响应中最多的Tokens数。spring-doc.cadn.net.cn

500spring-doc.cadn.net.cn

运行时选项

用便携式聊天选项BedrockChatOptions便携式构建器用于创建模型配置,如温度、maxToken、topP 等。spring-doc.cadn.net.cn

启动时,默认选项可以配置为BedrockConverseProxyChatModel(api, options)构造者或spring.ai.bedrock.converse.chat.options.*性能。spring-doc.cadn.net.cn

运行时,你可以通过添加新的、请求专属的选项来覆盖默认选项,提示叫:spring-doc.cadn.net.cn

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的提示缓存功能允许你缓存常用提示,降低成本并改善重复交互的响应时间。当你缓存提示时,后续相同的请求可以重复使用缓存内容,显著减少输入标记的处理数量。spring-doc.cadn.net.cn

支持的型号spring-doc.cadn.net.cn

Claude 3.x、Claude 4.x 以及通过 AWS Bedrock 提供的 Amazon Nova 型号支持提示缓存。spring-doc.cadn.net.cn

不同模型对缓存效能的最低Tokens阈值不同:- Claude Sonnet 4 及大多数型号:1024+ Tokens- 模型特定要求可能有所不同 - 请参阅 AWS Bedrock 文档spring-doc.cadn.net.cn

缓存策略

Spring AI 通过BedrockCache策略枚举:spring-doc.cadn.net.cn

这种战略方法确保缓存断点的最佳位置,同时保持在AWS Bedrock的4个断点限制内。spring-doc.cadn.net.cn

亚马逊 Nova 限制spring-doc.cadn.net.cn

亚马逊Nova机型(Nova Micro、Lite、Pro、Premier)只支持缓存系统消息内容。 他们支持缓存工具.spring-doc.cadn.net.cn

如果你尝试使用TOOLS_ONLYSYSTEM_AND_TOOLSNova模型的策略,AWS将返回验证例外. 用SYSTEM_ONLY亚马逊Nova车型的策略。spring-doc.cadn.net.cn

启用提示缓存

通过设置启用提示缓存缓存选项BedrockChatOptions并选择一个策略.spring-doc.cadn.net.cn

仅系统缓存

最常见的用例——跨多个请求的缓存系统指令:spring-doc.cadn.net.cn

// 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模型):spring-doc.cadn.net.cn

// 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型号。亚马逊Nova型号将返回验证例外.

系统与工具缓存

缓存系统指令和工具定义以实现最大程度的重复使用(仅限 Claude 模型):spring-doc.cadn.net.cn

// 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()
    )
);
该策略使用两个缓存断点(一个用于工具,一个用于系统)。仅支持 Claude 模型。

对话历史缓存

为多回合聊天机器人和助手提供缓存,增加对话历史:spring-doc.cadn.net.cn

// 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 Fluent 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();

使用示例

这里有一个完整的示例,展示了带成本跟踪的提示缓存:spring-doc.cadn.net.cn

// 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

Tokens使用跟踪

AWS Bedrock 通过响应元数据提供缓存专用的指标。 缓存指标可通过元数据映射访问:spring-doc.cadn.net.cn

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");

缓存专用指标包括:spring-doc.cadn.net.cn

当你第一次发送缓存提示时: -cacheWriteInputTokens将大于 0 -缓存读取输入Tokens将为0spring-doc.cadn.net.cn

当你再次发送同一个缓存提示(TTL时间5分钟内): -cacheWriteInputTokens将为0 -缓存读取输入Tokens将大于 0spring-doc.cadn.net.cn

实际应用场景

通过缓存多个问题的文档内容,高效分析大型法律合同或合规文件:spring-doc.cadn.net.cn

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

批处理代码审查

在缓存审查指南的同时,处理多个符合一致审查标准的代码文件:spring-doc.cadn.net.cn

// 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

带知识库的客户支持

创建一个客户支持系统,缓存您的产品知识库,以获得一致且准确的回复:spring-doc.cadn.net.cn

// 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应用

缓存在不同租户间共享工具定义,同时为每个租户定制系统提示:spring-doc.cadn.net.cn

// 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. 选择合适的策略spring-doc.cadn.net.cn

  2. 满足Tokens要求:重点缓存符合最低Tokens要求的内容(大多数型号为1024+Tokens)。spring-doc.cadn.net.cn

  3. 重复使用相同内容:缓存在提示内容的精确匹配中效果最佳。 即使是小改动也需要重新创建缓存条目。spring-doc.cadn.net.cn

  4. 监控Tokens使用情况:利用元数据指标跟踪缓存有效性:spring-doc.cadn.net.cn

    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个断点限制。spring-doc.cadn.net.cn

  6. 缓存寿命:AWS Bedrock缓存有固定的5分钟TTL(存活时间)。 每次缓存访问都会重置计时器。spring-doc.cadn.net.cn

  7. 模型兼容性:注意模型特有的限制:spring-doc.cadn.net.cn

  8. 工具稳定性:使用时TOOLS_ONLY,SYSTEM_AND_TOOLSCONVERSATION_HISTORY策略,确保工具保持稳定。 更改工具定义会导致所有下游缓存断点因级联失效而失效。spring-doc.cadn.net.cn

缓存失效与级联行为

AWS Bedrock采用层级缓存模型,采用级联失效:spring-doc.cadn.net.cn

缓存层级工具→系统→消息spring-doc.cadn.net.cn

每个层级的变化都会使该层级及后续所有层级失效:spring-doc.cadn.net.cn

变化 工具缓存 系统缓存 消息缓存

工具spring-doc.cadn.net.cn

❌ 无效spring-doc.cadn.net.cn

❌ 无效spring-doc.cadn.net.cn

❌ 无效spring-doc.cadn.net.cn

系统spring-doc.cadn.net.cn

✅ 有效spring-doc.cadn.net.cn

❌ 无效spring-doc.cadn.net.cn

❌ 无效spring-doc.cadn.net.cn

消息spring-doc.cadn.net.cn

✅ 有效spring-doc.cadn.net.cn

✅ 有效spring-doc.cadn.net.cn

❌ 无效spring-doc.cadn.net.cn

示例SYSTEM_AND_TOOLS策略:spring-doc.cadn.net.cn

// 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 中的提示缓存实现遵循以下关键设计原则:spring-doc.cadn.net.cn

  1. 战略性缓存布置:缓存断点会根据所选策略自动放置在最佳位置,确保符合AWS Bedrock的4个断点限制。spring-doc.cadn.net.cn

  2. 提供者可移植性:缓存配置通过以下方式完成BedrockChatOptions而不是单独发送消息,在切换不同AI提供商时保持兼容性。spring-doc.cadn.net.cn

  3. 线程安全:缓存断点跟踪采用线程安全机制实现,以正确处理并发请求。spring-doc.cadn.net.cn

  4. UNION 类型模式:AWS SDK 使用 UNION 类型,缓存点作为独立块而非属性添加。 这与直接的 API 方法不同,但确保了类型安全和 API 合规性。spring-doc.cadn.net.cn

  5. 增量缓存:该CONVERSATION_HISTORYStrategy 在最后一条用户消息上设置缓存断点,从而实现增量缓存,每个对话回合都建立在之前缓存前缀的基础上。spring-doc.cadn.net.cn

费用考虑

AWS Bedrock 提示缓存的定价(大致,因型号而异):spring-doc.cadn.net.cn

成本计算示例spring-doc.cadn.net.cn

// 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工具的一个示例:spring-doc.cadn.net.cn

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 豆子作为工具:spring-doc.cadn.net.cn

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

更多信息请参见工具文档。spring-doc.cadn.net.cn

模 态

多模态指的是模型能够同时理解和处理来自多种来源的信息,包括文本、图片、视频、PDF、文档、HTML、数据格式等。spring-doc.cadn.net.cn

Bedrock Converse API 支持多模态输入,包括文本和图像输入,并可根据合并输入生成文本响应。spring-doc.cadn.net.cn

你需要一个支持多模态输入的模型,比如Anthropic Claude或Amazon Nova型号。spring-doc.cadn.net.cn

图像

对于支持视觉多模态的模型,如亚马逊Nova、Anthropic Claude、Llama 3.2,亚马逊的Bedrock Converse API允许你在负载中包含多张图像。这些模型可以分析传递的图像并回答问题,对图像进行分类,并根据提供的指令进行图像的总结。spring-doc.cadn.net.cn

目前,Bedrock Converse 支持基地64编码图像图片/jpeg,图片/PNG,图片/动图image/webp哑剧类型。spring-doc.cadn.net.cn

春季 AI消息界面通过引入媒体类型。 它包含了关于消息中媒体附件的数据和信息,使用 Spring 的org.springframework.util.MimeType以及一个java.lang.Object对于原始媒体数据。spring-doc.cadn.net.cn

下面是一个简单的代码示例,演示了用户文本与图片的组合。spring-doc.cadn.net.cn

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图像:spring-doc.cadn.net.cn

多模态测试图像

并配有短信“请解释你在这张图片上看到了什么?”,并生成类似这样的回复:spring-doc.cadn.net.cn

The image shows a close-up view of a wire fruit basket containing several pieces of fruit.
...

视频

Amazon Nova 型号允许你在负载中包含一个视频,视频可以以 base64 格式提供,也可以通过 Amazon S3 URI 提供。spring-doc.cadn.net.cn

目前,Bedrock Nova 支持以下视频视频/X-matroska,视频/QuickTime,视频/mp4,视频/网络管理,视频/X-FLV,视频/MPEG,视频/x-ms-WMV视频/3GPP哑剧类型。spring-doc.cadn.net.cn

春季 AI消息界面通过引入媒体类型。 它包含了关于消息中媒体附件的数据和信息,使用 Spring 的org.springframework.util.MimeType以及一个java.lang.Object对于原始媒体数据。spring-doc.cadn.net.cn

下面是一个简单的代码示例,演示了用户文本与视频的结合。spring-doc.cadn.net.cn

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图像:spring-doc.cadn.net.cn

多模态测试视频

并配有短信“请解释你在这个视频中看到了什么?”,并生成类似这样的回复:spring-doc.cadn.net.cn

The video shows a group of baby chickens, also known as chicks, huddled together on a surface
...

文件

对于某些型号,Bedrock 允许你通过 Converse API 文档支持将文档包含在有效载荷中,文档支持以字节形式提供。 文档支持有两种不同版本,如下所述:spring-doc.cadn.net.cn

  • 文本文档类型(txt、csv、html、md等),强调文本理解。这些用例包括基于文档文本元素进行回答。spring-doc.cadn.net.cn

  • 媒体文档类型(PDF、DOCX、XLX),强调基于愿景的理解以回答问题。这些用例包括基于图表、图表等回答问题。spring-doc.cadn.net.cn

目前,Anthropic PDF 支持(测试版)和亚马逊 Bedrock Nova 模型支持文档多模态。spring-doc.cadn.net.cn

下面是一个简单的代码示例,演示了用户文本与媒体文档的结合。spring-doc.cadn.net.cn

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公文:spring-doc.cadn.net.cn

多模态测试PNG

并附上短信:“你是一位非常专业的文档摘要专家。请总结给出的文件。“,并生成类似这样的回复:spring-doc.cadn.net.cn

**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-入门模型-Bedrock-Converse对你的依赖。spring-doc.cadn.net.cn

添加一个application.properties归档于以下src/主/资源:spring-doc.cadn.net.cn

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

这里有一个使用聊天模型的控制器示例:spring-doc.cadn.net.cn

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