【Spring AI】01.聊天API-OpenAI

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 对这个变量进行赋值。生效该配置的一种方法是设置环境变量:

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 文件:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

或添加到您的 Gradle build.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 URLapi.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 来覆盖默认选项。例如,要覆盖请求的默认模型和温度:

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 客户端:

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 的示例。

@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 文件:

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

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-openai'
}

请参阅 03. 开始章节Dependency Management 部分,将 Spring AI BOM 添加到构建文件中

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

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 的简单代码段:

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 函数调用教程。


  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值