Anthropic 3 聊天

Anthropic Claude 是一系列基础 AI 模型,可用于各种应用。对于开发人员和企业,您可以利用 API 访问权限,并直接构建在 Anthropic 的 AI 基础设施 之上。

Spring AI 支持 Anthropic 的 消息 API,用于同步和流式文本生成。

Anthropic 的 Claude 模型也可通过 Amazon Bedrock 获得。Spring AI 还提供了专用的 Amazon Bedrock Anthropic 客户端实现。

先决条件

您需要在 Anthropic 门户上创建一个 API 密钥。在 Anthropic API 仪表板 上创建一个帐户,并在 获取 API 密钥 页面上生成 API 密钥。Spring AI 项目定义了一个名为 spring.ai.anthropic.api-key 的配置属性,您应该将其设置为从 anthropic.com 获得的 API 密钥 的值。导出环境变量是设置该配置属性的一种方法。

export SPRING_AI_ANTHROPIC_API_KEY=<INSERT KEY HERE>

添加存储库和 BOM

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

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

自动配置

Spring AI 为 Anthropic 聊天客户端提供 Spring Boot 自动配置。要启用它,请将以下依赖项添加到项目的 Maven pom.xml 或 Gradle build.gradle 文件中

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-anthropic-spring-boot-starter'
}
请参阅 依赖项管理 部分,将 Spring AI BOM 添加到您的构建文件中。

聊天属性

重试属性

前缀 spring.ai.retry 用作属性前缀,允许您配置 Anthropic 聊天模型的重试机制。

属性 描述 默认值

spring.ai.retry.max-attempts

最大重试次数。

10

spring.ai.retry.backoff.initial-interval

指数退避策略的初始睡眠时长。

2 秒。

spring.ai.retry.backoff.multiplier

退避间隔乘数。

5

spring.ai.retry.backoff.max-interval

最大退避时长。

3 分钟。

spring.ai.retry.on-client-errors

如果为 false,则抛出 NonTransientAiException,并且不尝试针对 4xx 客户端错误代码进行重试

false

spring.ai.retry.exclude-on-http-codes

不应触发重试的 HTTP 状态代码列表(例如,抛出 NonTransientAiException)。

spring.ai.retry.on-http-codes

应触发重试的 HTTP 状态代码列表(例如,抛出 TransientAiException)。

目前,重试策略不适用于流式 API。

连接属性

前缀 spring.ai.anthropic 用作属性前缀,允许您连接到 Anthropic。

属性 描述 默认值

spring.ai.anthropic.base-url

连接到的 URL

api.anthropic.com

spring.ai.anthropic.version

Anthropic API 版本

2023-06-01

spring.ai.anthropic.api-key

API 密钥

-

spring.ai.anthropic.beta-version

启用新的/实验性功能。如果设置为 max-tokens-3-5-sonnet-2024-07-15,则输出令牌限制将从 4096 个令牌增加到 8192 个令牌(仅适用于 claude-3-5-sonnet)。

tools-2024-04-04

配置属性

前缀 spring.ai.anthropic.chat 是属性前缀,允许您配置 Anthropic 的聊天模型实现。

属性 描述 默认值

spring.ai.anthropic.chat.enabled

启用 Anthropic 聊天模型。

true

spring.ai.anthropic.chat.options.model

这是要使用的 Anthropic 聊天模型。支持:claude-3-5-sonnet-20241022claude-3-opus-20240229claude-3-sonnet-20240229claude-3-haiku-20240307 以及旧版 claude-2.1claude-2.0claude-instant-1.2 模型。

claude-3-opus-20240229

spring.ai.anthropic.chat.options.temperature

用于控制生成补全内容的显式创造性的采样温度。较高的值将使输出更随机,而较低的值将使结果更集中和确定性。不建议为同一个补全请求同时修改 temperature 和 top_p,因为这两个设置的交互作用难以预测。

0.8

spring.ai.anthropic.chat.options.max-tokens

在聊天补全中生成的令牌的最大数量。输入令牌和生成令牌的总长度受模型上下文长度的限制。

500

spring.ai.anthropic.chat.options.stop-sequence

导致模型停止生成的自定义文本序列。我们的模型通常会在自然完成其轮次时停止,这将导致响应 stop_reason 为 "end_turn"。如果希望模型在遇到自定义文本字符串时停止生成,可以使用 stop_sequences 参数。如果模型遇到其中一个自定义序列,则响应 stop_reason 值将为 "stop_sequence",并且响应 stop_sequence 值将包含匹配的停止序列。

-

spring.ai.anthropic.chat.options.top-p

使用核采样。在核采样中,我们计算每个后续令牌的所有选项的累积分布(按概率降序排列),并在其达到 top_p 指定的特定概率时将其截断。您应该更改 temperature 或 top_p,但不要同时更改两者。仅推荐用于高级用例。通常您只需要使用 temperature。

-

spring.ai.anthropic.chat.options.top-k

仅从每个后续令牌的前 K 个选项中进行采样。用于去除“长尾”低概率响应。在此处了解更多技术细节。仅推荐用于高级用例。通常您只需要使用 temperature。

-

spring.ai.anthropic.chat.options.functions

要为单个提示请求启用函数调用的函数列表,这些函数由其名称标识。这些名称的函数必须存在于 functionCallbacks 注册表中。

-

spring.ai.anthropic.chat.options.functionCallbacks

要与 ChatModel 注册的工具函数回调。

-

spring.ai.anthropic.chat.options.proxy-tool-calls

如果为 true,则 Spring AI 不会在内部处理函数调用,而是将其代理到客户端。然后,客户端负责处理函数调用,将其分派到相应的函数并返回结果。如果为 false(默认值),则 Spring AI 将在内部处理函数调用。仅适用于支持函数调用的聊天模型。

false

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

运行时选项

AnthropicChatOptions.java 提供模型配置,例如要使用的模型、温度、最大令牌数等。

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

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

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

函数调用

您可以使用 AnthropicChatModel 注册自定义 Java 函数,并让 Anthropic Claude 模型智能地选择输出包含要调用一个或多个已注册函数的参数的 JSON 对象。这是一种强大的技术,可以将 LLM 功能与外部工具和 API 连接起来。阅读有关 Anthropic 函数调用 的更多信息。

多模态

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

目前,Anthropic Claude 3 支持 imagesbase64 源类型,以及 image/jpegimage/pngimage/gifimage/webp 媒体类型。查看 视觉指南 以获取更多信息。

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

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

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

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

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

logger.info(response.getResult().getOutput().getContent());

它以 multimodal.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-anthropic-spring-boot-starter 添加到您的 pom(或 gradle)依赖项中。

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

spring.ai.anthropic.api-key=YOUR_API_KEY
spring.ai.anthropic.chat.options.model=claude-3-5-sonnet-20241022
spring.ai.anthropic.chat.options.temperature=0.7
spring.ai.anthropic.chat.options.max-tokens=450
api-key 替换为您的 Anthropic 凭据。

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

@RestController
public class ChatController {

    private final AnthropicChatModel chatModel;

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

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", this.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 this.chatModel.stream(prompt);
    }
}

手动配置

AnthropicChatModel 实现 ChatModelStreamingChatModel,并使用 低级 AnthropicApi 客户端 连接到 Anthropic 服务。

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

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

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

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

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

var anthropicApi = new AnthropicApi(System.getenv("ANTHROPIC_API_KEY"));

var chatModel = new AnthropicChatModel(this.anthropicApi,
        AnthropicChatOptions.builder()
            .withModel("claude-3-opus-20240229")
            .withTemperature(0.4)
            .withMaxTokens(200)
        .build());

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

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

AnthropicChatOptions 提供聊天请求的配置信息。AnthropicChatOptions.Builder 是一个流畅的选项构建器。

低级 AnthropicApi 客户端

AnthropicApi 提供了一个轻量级的 Java 客户端,用于 Anthropic 消息 API

以下类图说明了 AnthropicApi 聊天接口和构建块

AnthropicApi Chat API Diagram
AnthropicApi Event Model

这是一个简单的代码片段,说明如何以编程方式使用 api

AnthropicApi anthropicApi =
    new AnthropicApi(System.getenv("ANTHROPIC_API_KEY"));

AnthropicMessage chatCompletionMessage = new AnthropicMessage(
        List.of(new ContentBlock("Tell me a Joke?")), Role.USER);

// Sync request
ResponseEntity<ChatCompletionResponse> response = this.anthropicApi
    .chatCompletionEntity(new ChatCompletionRequest(AnthropicApi.ChatModel.CLAUDE_3_OPUS.getValue(),
            List.of(this.chatCompletionMessage), null, 100, 0.8, false));

// Streaming request
Flux<StreamResponse> response = this.anthropicApi
    .chatCompletionStream(new ChatCompletionRequest(AnthropicApi.ChatModel.CLAUDE_3_OPUS.getValue(),
            List.of(this.chatCompletionMessage), null, 100, 0.8, true));

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

低级 API 示例