文章目录
- [OpenAI Chat](#OpenAI Chat)
-
- 先决条件
-
- [添加仓库和 BOM](#添加仓库和 BOM)
- [自动装配(Auto-configuration )](#自动装配(Auto-configuration ))
OpenAI Chat
Spring AI 支持 OpenAI 的 AI 语言模型 ChatGPT。ChatGPT 激发人们对 AI 驱动文本生成的兴趣,这要归功于它创建了行业领先的文本生成模型和嵌入向量。
先决条件
您需要使用 OpenAI 创建一个 API 才能访问 ChatGPT 模型。在 OpenAI 注册页面创建一个帐户,并在 API 密钥页面生成令牌。Spring AI 项目定义了一个名为 spring.ai.openai.api-key 的配置属性,您应将 openai.com 获取的API Key 对这个变量进行赋值。生效该配置的一种方法是设置环境变量:
shell
export SPRING_AI_OPENAI_API_KEY=<INSERT KEY HERE>
添加仓库和 BOM
Spring AI artifacts 发布在 Spring Milestone 和 Snapshot 仓库 中。请参阅 03. 开始章节 的 Add Milestone and Snapshot Repositories 部分 ,将这些依赖包添加到您的工程项目中。
为了帮助依赖关系管理,Spring AI 提供了一个 BOM,以确保在整个项目中使用一致的 Spring AI 版本。请参阅 03. 开始章节 的 Dependency Management 部分,将 Spring AI BOM 添加到您的工程项目中。
自动装配(Auto-configuration )
Spring AI 为 OpenAI Chat Client 提供了 Spring Boot 自动装配。若要启用它,请将以下依赖项添加到项目的 Maven pom.xml 文件:
html
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
或添加到您的 Gradle build.gradle 构建文件。
gradle
dependencies {
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
请参阅 03. 开始章节 的 Dependency Management 部分,将 Spring AI BOM 添加到构建文件中
Chat 属性(Chat Properties)
重试属性
属性前缀为spring.ai.retry,用于配置 OpenAI 聊天客户端的重试机制。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.retry.max-attempts | 最大重试次数。 | 10 |
spring.ai.retry.backoff.initial-interval | 指数退避策略的初始睡眠持续时间。 | 2 sec. |
spring.ai.retry.backoff.multiplier | 退避策略间隔倍数。 | 5 |
spring.ai.retry.backoff.max-interval | 最大退避持续时间。 | 3 min. |
spring.ai.retry.on-client-errors | 如果为 false,则引发 NonTransientAiException,并且对4xx客户端错误代码不尝试重试 | false |
spring.ai.retry.exclude-on-http-codes | 不触发重试的 HTTP 状态代码列表(例如,抛出 NonTransientAiException)。 | empty |
连接属性(Connection Properties)
属性前缀为 spring.ai.openai
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.openai.base-url | 要连接到的 openai URL | api.openai.com |
spring.ai.openai.api-key | 访问 api 的 key,在 OpenAI 的秘钥管理里获取 | - |
配置属性
属性前缀为spring.ai.openai.chat,可用于配置 OpenAI 的聊天客户端属性。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.openai.chat.enabled | 启用 OpenAI 聊天客户端。 | true |
spring.ai.openai.chat.base-url | 可选项,配置的情况下会在聊天的场景下覆盖 spring.ai.openai.base-url | - |
spring.ai.openai.chat.api-key | 可选项,配置的情况下会在聊天的场景下覆盖 spring.ai.openai.api-key | - |
spring.ai.openai.chat.options.model | 要使用的 OpenAI 聊天模型 | gpt-3.5-turbo (gpt-3.5-turbo gpt-4 和 gpt-4-32k 都是使用最新的版本) |
spring.ai.openai.chat.options.temperature | 要使用的模型温度,用于控制生成数据的创造力。较高的值将使输出更具随机性,而较低的值将使结果更具针对性和确定性。不建议对一个请求同时配置 temperature 和 top_p,因为这两个参数同时生效将导致结果难以预测。 | 0.8 |
spring.ai.openai.chat.options.frequencyPenalty | 介于 -2.0 和 2.0 之间的数字。到目前为止,正值会根据在文本中的出现频率来惩罚新令牌,从而降低模型重复同一行的可能性。 | 0.0f |
spring.ai.openai.chat.options.logitBias | 修改特殊令牌在对话中出现的可能性。 | - |
spring.ai.openai.chat.options.maxTokens | 聊天对话返回的最大令牌数。输入令牌数和生成令牌数的总长度受模型上下文长度的限制。 | - |
spring.ai.openai.chat.options.n | 为每条输入消息生成多少个对话选项。请注意,将根据所有选项生成的令牌总数付费。将 n 保留为 1 以最大程度地降低成本。 | 1 |
spring.ai.openai.chat.options.presencePenalty | 介于 -2.0 和 2.0 之间的数字。正值会根据到目前为止的新令牌是否出现在文本中来惩罚它们,从而增加模型谈论新主题的可能性。 | - |
spring.ai.openai.chat.options.responseFormat | 一个对象,指定模型必须输出的格式。设置为 { "type": "json_object" } 启用 JSON 模式,该模式可保证模型生成的消息是有效的 JSON。 | - |
spring.ai.openai.chat.options.seed | 此功能处于测试阶段。如果指定,我们的系统将尽最大努力确定性采样,以便具有相同seed和参数的重复请求返回相同的结果。 | - |
spring.ai.openai.chat.options.stop | 最多 4 个序列(sequences),API 将停止生成更多令牌。 | - |
spring.ai.openai.chat.options.topP | 温度采样的替代方法,称为核采样,其中模型考虑概率质量排序top_p的令牌的结果。因此,0.1 表示仅考虑包含前 10% 概率质量的令牌。我们通常建议改变这个或温度,但不要同时改变两者。 | - |
spring.ai.openai.chat.options.tools | 模型可以调用的工具列表。目前,仅支持将函数作为工具。这个参数可以把以JSON格式输入的函数列表提供给模型 | - |
spring.ai.openai.chat.options.toolChoice | 控制模型调用哪个(如果有)函数。none 表示模型不会调用函数,而是生成消息。auto 表示模型可以在生成消息或调用函数之间进行选择。通过 {"type: "function", "function": {"name": "my_function"}} 指定特定函数会强制模型调用该函数。当不存在任何函数时,none 是默认值。如果存在函数,则 auto 是默认值。 | - |
spring.ai.openai.chat.options.user | 代表您的终端用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。 | - |
spring.ai.openai.chat.options.functions | 函数列表,由其名称标识,启用时单个提示词请求中会调用函数。具有这些名称的函数必须存在于 functionCallbacks 注册表中。 |
您可以对 ChatClient 和 EmbeddingClient 覆盖公共配置项 spring.ai.openai.base-url 和 spring.ai.openai.api-key。如果设置了 spring.ai.openai.chat.base-url 和 spring.ai.openai.chat.api-key 属性,则优先于公共属性。如果您想为不同的模型和不同的模型端点使用不同的 OpenAI 帐户,这将非常有用。
所有以前缀 spring.ai.openai.chat.options 为前缀的属性都可以在运行时被覆盖,只需要通过向 Prompt 添加自定义的 Chat Options 就可以实现。
Chat Options
OpenAiChatOptions.java提供模型配置,例如要使用的模型、温度、频率处罚等。
在启动时,可以使用OpenAiChatClient(api, options)构造函数或spring.ai.openai.chat.options.*属性配置默认选项。
在运行时,您可以通过向 Prompt 调用添加新的自定义的 Chat Options 来覆盖默认选项。例如,要覆盖请求的默认模型和温度:
java
ChatResponse response = chatClient.call(
new Prompt(
"Generate the names of 5 famous pirates.",
OpenAiChatOptions.builder()
.withModel("gpt-4-32k")
.withTemperature(0.4)
.build()
));
除了使用 OpenAiChatOptions 之外,您还可以使用使用 ChatOptionsBuilder#builder() 创建的可移植 ChatOptions 实例。
函数调用(Function Calling)
您可以向 OpenAiChatClient 注册自定义 Java 函数,并让 OpenAI 模型输出包含参数的 JSON 对象,智能地选择调用一个或多个已注册的函数。这是将LLM功能与外部工具和 API 关联起来的强大技术。
自动装配案例(Sample Controller Auto-configuration)
创建一个新的 Spring Boot 项目,并将spring-ai-openai-spring-boot-starter添加到 pom(或 gradle)依赖项。
在 src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 OpenAi Chat 客户端:
text
spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.chat.options.model=gpt-3.5-turbo
spring.ai.openai.chat.options.temperature=0.7
api-key 替换为您的 OpenAI 凭据。
自动装配会创建一个可以注入的 OpenAiChatClient 实现。下面是一个使用 chat client 生成文本的简单的 @Controller 的示例。
java
@RestController
public class ChatController {
private final OpenAiChatClient chatClient;
@Autowired
public ChatController(OpenAiChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", chatClient.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 chatClient.stream(prompt);
}
}
手动配置案例
OpenAiChatClient 实现ChatClient和StreamingChatClient 接口,并使用 Low-level OpenAiApi Client 连接到 OpenAI 服务。
首先将依赖项添加到项目的 Maven pom.xml 文件:
html
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai</artifactId>
</dependency>
或添加到您的 Gradle build.gradle 构建文件。
gradle
dependencies {
implementation 'org.springframework.ai:spring-ai-openai'
}
请参阅 03. 开始章节 的 Dependency Management 部分,将 Spring AI BOM 添加到构建文件中
接下来,创建一个 OpenAiChatClient 并将其用于文本生成:
java
var openAiApi = new OpenAiApi(System.getenv("OPENAI_API_KEY"));
var chatClient = new OpenAiChatClient(openAiApi)
.withDefaultOptions(OpenAiChatOptions.builder()
.withModel("gpt-35-turbo")
.withTemperature(0.4)
.withMaxTokens(200)
.build());
ChatResponse response = chatClient.call(
new Prompt("Generate the names of 5 famous pirates."));
// Or with streaming responses
Flux<ChatResponse> response = chatClient.stream(
new Prompt("Generate the names of 5 famous pirates."));
OpenAiChatOptions提供了聊天请求需要的配置信息.OpenAiChatOptions.Builder是链式调用构建器。
Low-level OpenAiApi Client
OpenAiApi 是 OpenAI Chat API 的轻量级 Java 客户端。
以下类图说明了OpenAiApi 接口 和 构建基块:
下面是一个如何使用 API 的简单代码段:
java
OpenAiApi openAiApi =
new OpenAiApi(System.getenv("OPENAI_API_KEY"));
ChatCompletionMessage chatCompletionMessage =
new ChatCompletionMessage("Hello world", Role.USER);
// Sync request
ResponseEntity<ChatCompletion> response = openAiApi.chatCompletionEntity(
new ChatCompletionRequest(List.of(chatCompletionMessage), "gpt-3.5-turbo", 0.8f, false));
// Streaming request
Flux<ChatCompletionChunk> streamResponse = openAiApi.chatCompletionStream(
new ChatCompletionRequest(List.of(chatCompletionMessage), "gpt-3.5-turbo", 0.8f, true));
请关注 <OpenAiApi.java> 的 JavaDoc 以获取更多信息。
示例代码
测试类 OpenAiApiIT.java 提供了一些如何使用轻量级库的一般示例。
测试类 OpenAiApiToolFunctionCallIT.java 演示如何使用 low-level API 调用工具函数。属于基于 OpenAI 函数调用教程。