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>
自动配置
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,并且不尝试针对 |
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 |
|
spring.ai.anthropic.version |
Anthropic API 版本 |
2023-06-01 |
spring.ai.anthropic.api-key |
API 密钥 |
- |
spring.ai.anthropic.beta-version |
启用新的/实验性功能。如果设置为 |
|
配置属性
前缀 spring.ai.anthropic.chat
是属性前缀,允许您配置 Anthropic 的聊天模型实现。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.anthropic.chat.enabled |
启用 Anthropic 聊天模型。 |
true |
spring.ai.anthropic.chat.options.model |
这是要使用的 Anthropic 聊天模型。支持: |
|
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 支持 images
的 base64
源类型,以及 image/jpeg
、image/png
、image/gif
和 image/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
图像作为输入
以及文本消息“解释你在这张图片上看到了什么?”,并生成类似以下内容的响应
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 实现 ChatModel
和 StreamingChatModel
,并使用 低级 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
聊天接口和构建块
这是一个简单的代码片段,说明如何以编程方式使用 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 示例
-
AnthropicApiIT.java 测试提供了一些关于如何使用轻量级库的一般示例。