Bedrock Anthropic 3

Anthropic Claude 是一系列基础 AI 模型,可用于各种应用。

Claude 模型具有以下高级功能

  • 200k Token 上下文窗口:Claude 拥有 200,000 个令牌的慷慨容量,使其成为处理技术文档、代码库和文学作品等大量信息的理想选择。

  • 支持的任务:Claude 的多功能性涵盖了摘要、问答、趋势预测和文档比较等任务,使从对话到内容生成等各种应用程序成为可能。

  • AI 安全功能:基于 Anthropic 的安全研究,Claude 在其交互中优先考虑帮助、诚实和无害,从而降低品牌风险并确保负责任的 AI 行为。

AWS Bedrock Anthropic 模型页面Amazon Bedrock 用户指南 中包含有关如何使用 AWS 托管模型的详细信息。

Anthropic 的 Claude 2 和 3 模型也可以直接在 Anthropic 自己的云平台上使用。Spring AI 提供了专门的 Anthropic Claude 客户端来访问它。

先决条件

有关设置 API 访问的详细信息,请参阅 Spring AI 关于 Amazon Bedrock 的文档

添加存储库和 BOM

Spring AI 工件发布在 Spring Milestone 和 Snapshot 存储库中。有关将这些存储库添加到您的构建系统的信息,请参阅 存储库 部分。

为了帮助进行依赖项管理,Spring AI 提供了 BOM(物料清单)以确保在整个项目中使用一致版本的 Spring AI。有关将 Spring AI BOM 添加到您的构建系统的信息,请参阅 依赖项管理 部分。

自动配置

spring-ai-bedrock-ai-spring-boot-starter 依赖项添加到您的项目的 Maven pom.xml 文件中

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-bedrock-ai-spring-boot-starter</artifactId>
</dependency>

或添加到您的 Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-bedrock-ai-spring-boot-starter'
}
有关将 Spring AI BOM 添加到您的构建文件的信息,请参阅 依赖项管理 部分。

启用 Anthropic Chat

默认情况下,Anthropic 模型处于禁用状态。要启用它,请将 spring.ai.bedrock.anthropic3.chat.enabled 属性设置为 true。导出环境变量是设置此配置属性的一种方法

export SPRING_AI_BEDROCK_ANTHROPIC3_CHAT_ENABLED=true

聊天属性

前缀 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.anthropic3.chat 是用于配置 Claude 的聊天模型实现的属性前缀。

属性 描述 默认值

spring.ai.bedrock.anthropic3.chat.enable

启用 Bedrock Anthropic 聊天模型。默认情况下禁用

false

spring.ai.bedrock.anthropic3.chat.model

要使用的模型 ID。支持 anthropic.claude-3-sonnet-20240229-v1:0anthropic.claude-3-haiku-20240307-v1:0 以及旧版 anthropic.claude-v2anthropic.claude-v2:1anthropic.claude-instant-v1 模型,用于同步和流式响应。

anthropic.claude-3-sonnet-20240229-v1:0

spring.ai.bedrock.anthropic3.chat.options.temperature

控制输出的随机性。值可以在 [0.0,1.0] 范围内。

0.8

spring.ai.bedrock.anthropic3.chat.options.top-p

在采样时要考虑的令牌的最大累积概率。

AWS Bedrock 默认值

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

指定生成器用于生成下一个令牌的令牌选择数量。

AWS Bedrock 默认值

spring.ai.bedrock.anthropic3.chat.options.stop-sequences

配置最多四个生成器识别的序列。在停止序列之后,生成器将停止生成更多令牌。返回的文本不包含停止序列。

10

spring.ai.bedrock.anthropic3.chat.options.anthropic-version

要使用的生成器的版本。

bedrock-2023-05-31

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

指定在生成的响应中使用的最大令牌数。请注意,模型可能会在达到此最大值之前停止。此参数仅指定要生成的令牌的绝对最大数。我们建议限制为 4,000 个令牌以获得最佳性能。

500

查看 AnthropicChatModel 以获取其他模型 ID。支持的值为:anthropic.claude-instant-v1anthropic.claude-v2anthropic.claude-v2:1。模型 ID 值也可以在 AWS Bedrock 文档中找到基本模型 ID

所有以 spring.ai.bedrock.anthropic3.chat.options 为前缀的属性都可以在运行时通过向 Prompt 调用添加特定于请求的 运行时选项 来覆盖。

运行时选项

Anthropic3ChatOptions.java 提供模型配置,例如温度、topK、topP 等。

在启动时,可以使用 BedrockAnthropicChatModel(api, options) 构造函数或 spring.ai.bedrock.anthropic3.chat.options.* 属性配置默认选项。

在运行时,您可以通过向 Prompt 调用添加新的、特定于请求的选项来覆盖默认选项。例如,要覆盖特定请求的默认温度

ChatResponse response = chatModel.call(
    new Prompt(
        "Generate the names of 5 famous pirates.",
        Anthropic3ChatOptions.builder()
            .withTemperature(0.4)
        .build()
    ));
除了特定于模型的 AnthropicChatOptions 之外,您还可以使用可移植的 ChatOptions 实例,该实例使用 ChatOptionsBuilder#builder() 创建。

多模态

多模态是指模型能够同时理解和处理来自各种来源的信息的能力,包括文本、图像、音频和其他数据格式。这种范式代表了人工智能模型的重大进步。

目前,Anthropic Claude 3 支持 base64 源类型用于 images,以及 image/jpegimage/pngimage/gifimage/webp 媒体类型。查看 视觉指南 以了解更多信息。

Spring AI 的 Message 接口通过引入 Media 类型来支持多模态 AI 模型。这种类型包含有关消息中媒体附件的数据和信息,使用 Spring 的 org.springframework.util.MimeType 和一个 java.lang.Object 来表示原始媒体数据。

以下是一个从 Anthropic3ChatModelIT.java 中提取的简单代码示例,演示了用户文本与图像的组合。

    byte[] imageData = new ClassPathResource("/test.png").getContentAsByteArray();

    var userMessage = new UserMessage("Explain what do you see o this picture?",
            List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));

    ChatResponse response = chatModel.call(new Prompt(List.of(userMessage)));

    assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple", "basket");

它以 test.png 图像作为输入

Multimodal Test Image

以及文本消息“解释一下你在这张图片上看到了什么?”,并生成类似以下的响应

The image shows a close-up view of a wire fruit basket containing several pieces of fruit.
The basket appears to be made of thin metal wires formed into a round shape with an elevated handle.

Inside the basket, there are a few yellow bananas and a couple of red apples or possibly tomatoes.
The vibrant colors of the fruit contrast nicely against the metallic tones of the wire basket.

The shallow depth of field in the photograph puts the focus squarely on the fruit in the foreground, while the basket handle extending upwards is slightly blurred, creating a pleasing bokeh effect in the background.

The composition and lighting give the image a clean, minimalist aesthetic that highlights the natural beauty and freshness of the fruit displayed in this elegant wire basket.

示例控制器

创建 一个新的 Spring Boot 项目,并将 spring-ai-bedrock-ai-spring-boot-starter 添加到你的 pom(或 gradle)依赖项中。

src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 Anthropic 聊天模型

spring.ai.bedrock.aws.region=eu-central-1
spring.ai.bedrock.aws.timeout=1000ms
spring.ai.bedrock.aws.access-key=${AWS_ACCESS_KEY_ID}
spring.ai.bedrock.aws.secret-key=${AWS_SECRET_ACCESS_KEY}

spring.ai.bedrock.anthropic3.chat.enabled=true
spring.ai.bedrock.anthropic3.chat.options.temperature=0.8
spring.ai.bedrock.anthropic3.chat.options.top-k=15
regionsaccess-keysecret-key 替换为你的 AWS 凭据。

这将创建一个 BedrockAnthropicChatModel 实现,你可以将其注入到你的类中。以下是一个使用聊天模型进行文本生成的简单 @Controller 类示例。

@RestController
public class ChatController {

    private final BedrockAnthropic3ChatModel chatModel;

    @Autowired
    public ChatController(BedrockAnthropic3ChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", chatModel.call(message));
    }

    @GetMapping("/ai/generateStream")
	public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        Prompt prompt = new Prompt(new UserMessage(message));
        return chatModel.stream(prompt);
    }
}

手动配置

BedrockAnthropic3ChatModel 实现 ChatModelStreamingChatModel,并使用 低级 Anthropic3ChatBedrockApi 客户端 连接到 Bedrock Anthropic 服务。

spring-ai-bedrock 依赖项添加到你的项目的 Maven pom.xml 文件中

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-bedrock</artifactId>
</dependency>

或添加到您的 Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-bedrock'
}
有关将 Spring AI BOM 添加到您的构建文件的信息,请参阅 依赖项管理 部分。

接下来,创建一个 BedrockAnthropic3ChatModel 并将其用于文本生成

Anthropic3ChatBedrockApi anthropicApi =  new Anthropic3ChatBedrockApi(
    AnthropicChatBedrockApi.AnthropicModel.CLAUDE_V3_SONNET.id(),
    EnvironmentVariableCredentialsProvider.create(),
    Region.US_EAST_1.id(),
    new ObjectMapper(),
    Duration.ofMillis(1000L));

BedrockAnthropic3ChatModel chatModel = new BedrockAnthropic3ChatModel(anthropicApi,
    AnthropicChatOptions.builder()
        .withTemperature(0.6f)
        .withTopK(10)
        .withTopP(0.8f)
        .withMaxTokensToSample(100)
        .withAnthropicVersion(AnthropicChatBedrockApi.DEFAULT_ANTHROPIC_VERSION)
        .build());

ChatResponse response = chatModel.call(
    new Prompt("Generate the names of 5 famous pirates."));

// Or with streaming responses
Flux<ChatResponse> response = chatModel.stream(
    new Prompt("Generate the names of 5 famous pirates."));

低级 Anthropic3ChatBedrockApi 客户端

Anthropic3ChatBedrockApi 提供了一个轻量级的 Java 客户端,它建立在 AWS Bedrock Anthropic Claude 模型 之上。

客户端支持 anthropic.claude-3-opus-20240229-v1:0anthropic.claude-3-sonnet-20240229-v1:0anthropic.claude-3-haiku-20240307-v1:0 以及旧版 anthropic.claude-v2anthropic.claude-v2:1anthropic.claude-instant-v1 模型,用于同步(例如 chatCompletion())和流式(例如 chatCompletionStream())响应。

以下是一个简单的代码片段,演示如何以编程方式使用该 API

Anthropic3ChatBedrockApi anthropicChatApi = new Anthropic3ChatBedrockApi(
   AnthropicModel.CLAUDE_V2.id(), Region.EU_CENTRAL_1.id(), Duration.ofMillis(1000L));

AnthropicChatRequest request = AnthropicChatRequest
  .builder(String.format(Anthropic3ChatBedrockApi.PROMPT_TEMPLATE, "Name 3 famous pirates"))
  .withTemperature(0.8f)
  .withMaxTokensToSample(300)
  .withTopK(10)
  .build();

// Sync request
AnthropicChatResponse response = anthropicChatApi.chatCompletion(request);

// Streaming request
Flux<AnthropicChatResponse> responseStream = anthropicChatApi.chatCompletionStream(request);
List<AnthropicChatResponse> responses = responseStream.collectList().block();

有关更多信息,请参阅 Anthropic3ChatBedrockApi.java 的 JavaDoc。