【Spring AI】01.聊天API-OpenAI

文章目录

  • [OpenAI Chat](#OpenAI Chat)
    • 先决条件
      • [添加仓库和 BOM](#添加仓库和 BOM)
    • [自动装配(Auto-configuration )](#自动装配(Auto-configuration ))
      • [Chat 属性(Chat Properties)](#Chat 属性(Chat Properties))
      • [Chat Options](#Chat Options)
      • [函数调用(Function Calling)](#函数调用(Function Calling))
      • [自动装配案例(Sample Controller Auto-configuration)](#自动装配案例(Sample Controller Auto-configuration))
      • 手动配置案例
        • [Low-level OpenAiApi Client](#Low-level OpenAiApi Client)
      • 示例代码

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


相关推荐
车载诊断技术1 小时前
电子电气架构 --- 什么是EPS?
网络·人工智能·安全·架构·汽车·需求分析
KevinRay_1 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
跃跃欲试-迪之1 小时前
animatediff 模型网盘分享
人工智能·stable diffusion
Captain823Jack1 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
被制作时长两年半的个人练习生1 小时前
【AscendC】ReduceSum中指定workLocal大小时如何计算
人工智能·算子开发·ascendc
Captain823Jack2 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
Black_mario2 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
Aileen_0v02 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
数信云 DCloud3 小时前
实力认可 | 通付盾入选《ISC.AI 2024创新能力全景图谱》五项领域
人工智能
itwangyang5203 小时前
AIDD - 从机器学习到深度学习:蛋白质-配体对接评分函数的进展
人工智能·深度学习·机器学习