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
文件
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
</dependency>
或添加到 Gradle build.gradle
构建文件中。
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.chat
是用于配置 Anthropic 聊天模型实现的属性前缀。
属性 | 说明 | 默认值 |
---|---|---|
spring.ai.anthropic.chat.enabled |
启用 Anthropic 聊天模型。 |
true |
spring.ai.anthropic.chat.options.model |
这是要使用的 Anthropic 聊天模型。支持 |
|
spring.ai.anthropic.chat.options.temperature |
用于控制生成完成品的明显创造力的采样温度。较高的值会使输出更加随机,而较低的值会使结果更加集中和确定。不建议为同一完成请求修改温度和 top_p,因为这两个设置的交互作用难以预测。 |
0.8 |
spring.ai.anthropic.chat.options.max-tokens |
在聊天完成中生成的最大令牌数。输入令牌和生成令牌的总长度受模型的上下文长度限制。 |
500 |
spring.ai.anthropic.chat.options.stop-sequence |
将导致模型停止生成的自定义文本序列。我们的模型通常会在自然完成其回合时停止,这将导致响应停止原因“end_turn”。如果你希望模型在遇到自定义文本字符串时停止生成,则可以使用 stop_sequences 参数。如果模型遇到其中一个自定义序列,则响应停止原因值将为“stop_sequence”,并且响应停止序列值将包含匹配的停止序列。 |
- |
spring.ai.anthropic.chat.options.top-p |
使用核采样。在核采样中,我们计算每个后续令牌的所有选项的累积分布,按概率递减顺序排列,并在达到 top_p 指定的特定概率时将其切断。你应该更改温度或 top_p,但不能同时更改两者。仅推荐用于高级用例。你通常只需要使用温度。 |
- |
spring.ai.anthropic.chat.options.top-k |
仅从每个后续令牌的顶部 K 个选项中进行采样。用于删除“长尾”低概率响应。在此处了解更多技术细节。仅推荐用于高级用例。你通常只需要使用温度。 |
- |
spring.ai.mistralai.chat.options.functions |
按名称识别的函数列表,用于在单个提示请求中启用函数调用。这些名称的函数必须存在于 functionCallbacks 注册表中。 |
- |
spring.ai.mistralai.chat.options.functionCallbacks |
向 ChatModel 注册的 MistralAI 工具函数回调。 |
- |
所有以 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 函数调用。
多模态
多模态是指模型同时理解和处理来自各种来源的信息的能力,包括文本、图像、音频和其他数据格式。这种范式代表了人工智能模型的重大进步。
目前,Anthropic Claude 3 支持 images
的 base64
源类型,以及 image/jpeg
、image/png
、image/gif
和 image/webp
媒体类型。有关更多信息,请查看 Vision 指南。
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, imageData)));
ChatResponse response = chatModel.call(new Prompt(List.of(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-opus-20240229
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", 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);
}
}
手动配置
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(anthropicApi,
AnthropicChatOptions.builder()
.withModel("claude-3-opus-20240229")
.withTemperature(0.4)
.withMaxTokens(200)
.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."));
AnthropicChatOptions
提供聊天请求的配置信息。AnthropicChatOptions.Builder
是流畅选项构建器。
底层 AnthropicApi 客户端
AnthropicApi 为 Anthropic 消息 API 提供轻量级 Java 客户端。
以下类图说明了 AnthropicApi
聊天界面和构建块
以下是一个简单的片段,说明如何以编程方式使用 API
AnthropicApi anthropicApi =
new AnthropicApi(System.getenv("ANTHROPIC_API_KEY"));
RequestMessage chatCompletionMessage = new RequestMessage(
List.of(new MediaContent("Tell me a Joke?")), Role.USER);
// Sync request
ResponseEntity<ChatCompletion> response = anthropicApi
.chatCompletionEntity(new ChatCompletionRequest(AnthropicApi.ChatModel.CLAUDE_3_OPUS.getValue(),
List.of(chatCompletionMessage), null, 100, 0.8f, false));
// Streaming request
Flux<StreamResponse> response = anthropicApi
.chatCompletionStream(new ChatCompletionRequest(AnthropicApi.ChatModel.CLAUDE_3_OPUS.getValue(),
List.of(chatCompletionMessage), null, 100, 0.8f, true));
请参阅 AnthropicApi.java 的 JavaDoc 以获取更多信息。
低级 API 示例
-
AnthropicApiIT.java 测试提供了一些如何使用轻量级库的常规示例。