【Spring AI】01.聊天API-OpenAI

慈云数据 7个月前 (05-09) 技术支持 47 0

文章目录

  • OpenAI Chat
    • 先决条件
      • 添加仓库和 BOM
      • 自动装配(Auto-configuration )
        • Chat 属性(Chat Properties)
          • 重试属性
          • 连接属性(Connection Properties)
          • 配置属性
          • Chat Options
          • 函数调用(Function Calling)
          • 自动装配案例(Sample Controller Auto-configuration)
          • 手动配置案例
            • 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 对这个变量进行赋值。生效该配置的一种方法是设置环境变量

              export SPRING_AI_OPENAI_API_KEY=
              

              添加仓库和 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 文件:

                  org.springframework.ai
                  spring-ai-openai-spring-boot-starter
              
              

              或添加到您的 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 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 文件:

                  org.springframework.ai
                  spring-ai-openai
              
              

              或添加到您的 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 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 response = openAiApi.chatCompletionEntity(
                  new ChatCompletionRequest(List.of(chatCompletionMessage), "gpt-3.5-turbo", 0.8f, false));
              // Streaming request
              Flux 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 函数调用教程。


微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon