共计 1342 个字符,预计需要花费 4 分钟才能阅读完成。
快速入门
Chat API允许我们通过简单的配置快速地调用大语言模型以对用户的输入文本进行回复响应。聊天API通常是我们向AI模型发起请求从而工作的,AI模型获得输入数据,根据预先训练好的数据进行文本生成再返回给我们,我们将得到的生成结果应用在我们的程序中,这就是一个完整的调用流程。
1.1 项目搭建
创建子模块,并在pom.xml
文件中引入下面的依赖。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
上述依赖是用于请求OpenAI平台相关模型,例如:对话用的ChatGPT、画图用的Dall-e-2/3、文本嵌入text-embedding-ada-002以及音频合成与识别的whisper和tts等相关模型。
接着我们再创建配置文件application.yml
,将相关key和api信息进行填写
server:
port: 8321
spring:
ai:
openai:
api-key: 123
base-url: 默认:https://api.openai.com
1.2 快速对话
在我们配置完成后,当SpringBoot启动时,会为我们自动注入OpenAiChatClient
的Bean,该Bean实现了对ChatGPT系列的阻塞式调用和流式调用的接口。
在这里,我们选择阻塞式调用接口进行演示。
创建一个ChatController
类,将ChatClient
注入进来,并编写一个简单的接口进行测试:
package com.ningning0111.controller;
import org.springframework.ai.chat.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/demo")
public String demo(String prompt){
String response = chatClient.call(prompt);
return response;
}
}
在上面的测试接口中,核心代码String response = chatClient.call(prompt)
。其中,prompt
是我们输入到ChatGPT的文本(一般是问题),response
则是ChatGPT针对prompt生成出的文本,即响应。Spring AI将底层的请求、参数配置等进行了封装,AI模型默认gpt-3.5-turbo
。因此我们只需这简简单单的一行代码就能对接ChatGPT。
Hello,你有试过请求超时吗,我看源码下面是使用的webClient,但是他自己build了一个,我似乎没办法设置超时时长
@vair12 源码中的WebClient没有显示地设置超时时间,那么它会采用Netty底层默认的超时时间,底层是没有超时时间设定的,意味着只有服务器响应,请求才结束。
OpenAiChatClient中,使用的是重试机制来解决请求超时问题,通过设置RetryTemplate,定义一些策略(Spring AI默认使用的是退避策略)来调用OpenAiApi.如果要设置超时时长的话,可以定义一个重试策略(如果超过一定时间还没有响应,则取消当前重试)来替换原来的退避策略。参考代码如下:
“`java
package com.ningning0111.config;
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.policy.TimeoutRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
@Configuration
public class ApplicationConfig {
@Bean
public ChatClient chatClient() {
RetryTemplate retryTemplate = new RetryTemplate(); // 重试模板
TimeoutRetryPolicy timeoutRetryPolicy = new TimeoutRetryPolicy(); // 重试策略
timeoutRetryPolicy.setTimeout(3000); // 设置超时时间
retryTemplate.setRetryPolicy(timeoutRetryPolicy); // 设置策略
return new OpenAiChatClient(
new OpenAiApi(
“https://api.openai.com”,
“你的Key”),
OpenAiChatOptions.builder().withModel(OpenAiApi.DEFAULT_CHAT_MODEL).withTemperature(0.7f).build(),
null,retryTemplate);
}
}
“`
理论上应该是可以的,这个Bean也可以正常调用。当然自定义OpenAiChatClient时,你得把自动装配给排除。