Anthropic 3 聊天模型

Anthropic Claude 是一系列基础 AI 模型,可用于各种应用。开发者和企业可以利用其 API 访问,直接在 Anthropic 的 AI 基础设施 之上进行构建。

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

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

先决条件

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

export SPRING_AI_ANTHROPIC_API_KEY=<INSERT KEY HERE>

添加仓库和 BOM

Spring AI 组件发布在 Maven Central 和 Spring Snapshot 仓库中。请参考 仓库 部分将这些仓库添加到您的构建系统中。

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

自动配置

Spring AI 自动配置、Starter 模块的构件名称发生了重大变化。请参考 升级注意事项 获取更多信息。

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

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-anthropic</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-anthropic'
}
请参考 依赖管理 部分将 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,输出 token 限制会从 4096 增加到 8192 token(仅适用于 claude-3-5-sonnet)。

tools-2024-04-04

配置属性

聊天自动配置的启用和禁用现在通过前缀为 spring.ai.model.chat 的顶级属性进行配置。

要启用,将 spring.ai.model.chat=anthropic (默认启用)

要禁用,将 spring.ai.model.chat=none (或任何不匹配 anthropic 的值)

进行此更改是为了允许配置多个模型。

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

属性 描述 默认值

spring.ai.anthropic.chat.enabled(已移除且不再有效)

启用 Anthropic 聊天模型。

true

spring.ai.model.chat

启用 Anthropic 聊天模型。

anthropic

spring.ai.anthropic.chat.options.model

要使用的 Anthropic 聊天模型。支持:claude-3-7-sonnet-latestclaude-3-5-sonnet-latestclaude-3-opus-20240229claude-3-sonnet-20240229claude-3-haiku-20240307

claude-3-7-sonnet-latest

spring.ai.anthropic.chat.options.temperature

用于控制生成完成内容表观创造性的采样温度。值越高,输出越随机;值越低,结果越集中和确定。不建议在同一完成请求中同时修改 temperature 和 top_p,因为这两个设置的相互作用难以预测。

0.8

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

在聊天完成中生成的最大 token 数。输入 token 和生成 token 的总长度受模型上下文长度限制。

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

使用核采样。在核采样中,我们按概率递减的顺序计算每个后续 token 的所有选项的累积分布,并在达到 top_p 指定的特定概率时截断。您应该只更改 temperature 或 top_p 中的一个,而不是同时更改两者。仅推荐用于高级用例。通常只需要使用 temperature。

-

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

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

-

spring.ai.anthropic.chat.options.toolNames

要在一个提示请求中启用工具调用的工具列表,通过其名称标识。具有这些名称的工具必须存在于 toolCallbacks 注册表中。

-

spring.ai.anthropic.chat.options.toolCallbacks

要向 ChatModel 注册的工具回调。

-

spring.ai.anthropic.chat.options.internal-tool-execution-enabled

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

true

(已弃用 - 由 toolNames 替代) spring.ai.anthropic.chat.options.functions

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

-

(已弃用 - 由 toolCallbacks 替代) spring.ai.anthropic.chat.options.functionCallbacks

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

-

(已弃用 - 由 negated internal-tool-execution-enabled 替代) spring.ai.anthropic.chat.options.proxy-tool-calls

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

false

spring.ai.anthropic.chat.options.http-headers

要添加到聊天完成请求中的可选 HTTP 头。

-

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

运行时选项

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

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

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

ChatResponse response = chatModel.call(
    new Prompt(
        "Generate the names of 5 famous pirates.",
        AnthropicChatOptions.builder()
            .model("claude-3-7-sonnet-latest")
            .temperature(0.4)
        .build()
    ));
除了模型特定的 AnthropicChatOptions,您还可以使用可移植的 ChatOptions 实例,通过 ChatOptionsBuilder#builder() 创建。

工具/函数调用

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

多模态

多模态是指模型同时理解和处理来自各种来源信息的能力,包括文本、PDF、图像、数据格式。

图像

目前,Anthropic Claude 3 支持图像的 base64 源类型,以及 image/jpegimage/pngimage/gifimage/webp 媒体类型。更多信息请查看 Vision guide。Anthropic Claude 3.5 Sonnet 还支持 application/pdf 文件的 pdf 源类型。

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

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

var imageData = new ClassPathResource("/multimodal.test.png");

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

以及文本消息 "Explain what do you see on this picture?",并生成类似以下内容的响应:

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

PDF

从 Sonnet 3.5 开始,提供 PDF 支持(测试版)。使用 application/pdf 媒体类型将 PDF 文件附加到消息中:

var pdfData = new ClassPathResource("/spring-ai-reference-overview.pdf");

var userMessage = new UserMessage(
        "You are a very professional document summarization specialist. Please summarize the given document.",
        List.of(new Media(new MimeType("application", "pdf"), pdfData)));

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

示例控制器

创建 一个新的 Spring Boot 项目,并将 spring-ai-starter-model-anthropic 添加到您的 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-latest
spring.ai.anthropic.chat.options.temperature=0.7
spring.ai.anthropic.chat.options.max-tokens=450
用您的 Anthropic 凭据替换 api-key

这将创建一个 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()
            .model("claude-3-opus-20240229")
            .temperature(0.4)
            .maxTokens(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 客户端

AnthropicApiAnthropic Message API 的轻量级 Java 客户端。

以下类图展示了 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 示例