0


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

exportSPRING_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最大重试次数。10spring.ai.retry.backoff.initial-interval指数退避策略的初始睡眠持续时间。2 sec.spring.ai.retry.backoff.multiplier退避策略间隔倍数。5spring.ai.retry.backoff.max-interval最大退避持续时间。3 min.spring.ai.retry.on-client-errors如果为 false,则引发 NonTransientAiException,并且对4xx客户端错误代码不尝试重试falsespring.ai.retry.exclude-on-http-codes不触发重试的 HTTP 状态代码列表(例如,抛出 NonTransientAiException)。empty

连接属性(Connection Properties)

属性前缀为 spring.ai.openai
属性描述默认值spring.ai.openai.base-url要连接到的 openai URLapi.openai.comspring.ai.openai.api-key访问 api 的 key,在 OpenAI 的秘钥管理里获取-

配置属性

属性前缀为spring.ai.openai.chat,可用于配置 OpenAI 的聊天客户端属性。
属性描述默认值spring.ai.openai.chat.enabled启用 OpenAI 聊天客户端。truespring.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.8spring.ai.openai.chat.options.frequencyPenalty介于 -2.0 和 2.0 之间的数字。到目前为止,正值会根据在文本中的出现频率来惩罚新令牌,从而降低模型重复同一行的可能性。0.0fspring.ai.openai.chat.options.logitBias修改特殊令牌在对话中出现的可能性。-spring.ai.openai.chat.options.maxTokens聊天对话返回的最大令牌数。输入令牌数和生成令牌数的总长度受模型上下文长度的限制。-spring.ai.openai.chat.options.n为每条输入消息生成多少个对话选项。请注意,将根据所有选项生成的令牌总数付费。将 n 保留为 1 以最大程度地降低成本。1spring.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(newPrompt("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 的示例。

@RestControllerpublicclassChatController{privatefinalOpenAiChatClient chatClient;@AutowiredpublicChatController(OpenAiChatClient chatClient){this.chatClient = chatClient;}@GetMapping("/ai/generate")publicMapgenerate(@RequestParam(value ="message", defaultValue ="Tell me a joke")String message){returnMap.of("generation", chatClient.call(message));}@GetMapping("/ai/generateStream")publicFlux<ChatResponse>generateStream(@RequestParam(value ="message", defaultValue ="Tell me a joke")String message){Prompt prompt =newPrompt(newUserMessage(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 =newOpenAiApi(System.getenv("OPENAI_API_KEY"));var chatClient =newOpenAiChatClient(openAiApi).withDefaultOptions(OpenAiChatOptions.builder().withModel("gpt-35-turbo").withTemperature(0.4).withMaxTokens(200).build());ChatResponse response = chatClient.call(newPrompt("Generate the names of 5 famous pirates."));// Or with streaming responsesFlux<ChatResponse> response = chatClient.stream(newPrompt("Generate the names of 5 famous pirates."));

OpenAiChatOptions提供了聊天请求需要的配置信息.OpenAiChatOptions.Builder是链式调用构建器。

Low-level OpenAiApi Client

OpenAiApi 是 OpenAI Chat API 的轻量级 Java 客户端。
以下类图说明了OpenAiApi 接口 和 构建基块:
在这里插入图片描述

下面是一个如何使用 API 的简单代码段:

OpenAiApi openAiApi =newOpenAiApi(System.getenv("OPENAI_API_KEY"));ChatCompletionMessage chatCompletionMessage =newChatCompletionMessage("Hello world",Role.USER);// Sync requestResponseEntity<ChatCompletion> response = openAiApi.chatCompletionEntity(newChatCompletionRequest(List.of(chatCompletionMessage),"gpt-3.5-turbo",0.8f,false));// Streaming requestFlux<ChatCompletionChunk> streamResponse = openAiApi.chatCompletionStream(newChatCompletionRequest(List.of(chatCompletionMessage),"gpt-3.5-turbo",0.8f,true));

请关注 OpenAiApi.java 的 JavaDoc 以获取更多信息。


示例代码


测试类 OpenAiApiIT.java 提供了一些如何使用轻量级库的一般示例。
测试类 OpenAiApiToolFunctionCallIT.java 演示如何使用 low-level API 调用工具函数。属于基于 OpenAI 函数调用教程。



本文转载自: https://blog.csdn.net/u011046509/article/details/138289860
版权归原作者 小明同学的开发日常 所有, 如有侵权,请联系我们删除。

“【Spring AI】01.聊天API-OpenAI”的评论:

还没有评论