Springboot集成OpenAi官方开源项目opanAI-Java

前言

本文主要介绍Springboot集成openai-java完成openai官方接口的调用,官方有多种语言的demo示例

OPENAI开源openai-java项目地址:https://github.com/TheoKanning/openai-java

准备工作

必要的前提,要使用chatgpt必须要魔法

  • 魔法
  • openai帐号(需要apiKey)
  • springboot+maven的项目

开始

1、maven中引入openai-java

目前用的版本是0.12.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- openai -->
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>api</artifactId>
<version>${openai.version}</version>
</dependency>
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>client</artifactId>
<version>${openai.version}</version>
</dependency>
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>service</artifactId>
<version>${openai.version}</version>
</dependency>

2、配置

测试我把配置信息放在了yml中

1
2
3
4
5
openai:
proxyHost: 127.0.0.1
proxyPort: 7890
keys:
- sk-xxxxxxxxxxxxxxxxxxxxxxxx

配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
@ConfigurationProperties(prefix = "openai")
public class OpenAiModel {

/**
* 代理地址
*/
private static String proxyHost;
/**
* 代理端口
*/
private static Integer proxyPort;
/**
* openai apikey
*/
private static List<String> keys;

// 省略 get set
}

3、使用

调用api的核心类是OpenAiService,不清楚是不是魔法的问题,我直接调用会ping不通,请求超时,必须设置代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* openAiService 工厂
* @author WuHao
* @since 2023/5/24 10:00
*/
public class AiServiceFactory {

private static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(10L);

public static OpenAiService createService() {
String token = Optional.ofNullable(OpenAiModel.getKeys()).orElseThrow(() -> new RuntimeException("ApiKey不能为空,请检查参数配置")).stream().findFirst().orElse(null);

Assert.notEmpty(token,() -> new RuntimeException("ApiKey不能为空,请检查参数配置"));

ObjectMapper mapper = OpenAiService.defaultObjectMapper();
// 设置代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(OpenAiModel.getProxyHost(), OpenAiModel.getProxyPort()));
OkHttpClient client = OpenAiService.defaultClient(token, DEFAULT_TIMEOUT).newBuilder()
.proxy(proxy)
.build();
Retrofit retrofit = OpenAiService.defaultRetrofit(client, mapper);

return new OpenAiService(retrofit.create(OpenAiApi.class), client.dispatcher().executorService());

}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@GetMapping("/testChat")
public String testChat() throws UnsupportedEncodingException {
OpenAiService service = AiServiceFactory.createService();

final List<ChatMessage> messages = new ArrayList<>();
final ChatMessage systemMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), URLDecoder.decode("取一个3个字的中文名字,要求姓氏为吴", "UTF-8"));

messages.add(systemMessage);
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest
.builder()
.model("gpt-3.5-turbo")
.messages(messages)
.n(1)
.maxTokens(50)
.logitBias(new HashMap<>())
.build();

service.streamChatCompletion(chatCompletionRequest)
.doOnError(Throwable::printStackTrace)
.blockingForEach(System.err::println);

service.shutdownExecutor();
return null;

输出结果

图片.png

流式输出的api可以与sse推送消息,后来写了一个测试页面,实现了打字机的效果,页面十分潦草,将就着看看…………

图片.png

接口的其他使用方式可下载openai-java源码自行理解,目前我也在学习当中

关于代理

上述配置中代理指的是魔法的代理地址,先开启魔法

1、网络 -》 右键 属性

图片.png

2、找到Internet选项

图片.png

3、连接 -》 局域网设置

地址 对应的配置 proxyHost
端口 对应的配置 proxyPort

图片.png

demo源码地址

gitee
github


Springboot集成OpenAi官方开源项目opanAI-Java
http://www.codersand.fun/2023/05/24/course/Springboot集成opanAI-Java/
作者
吴昊
发布于
2023年5月24日
许可协议