前言
本文主要介绍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
| <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;
private static List<String> keys;
}
|
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
|
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;
|
输出结果
流式输出的api可以与sse推送消息,后来写了一个测试页面,实现了打字机的效果,页面十分潦草,将就着看看…………
接口的其他使用方式可下载openai-java源码自行理解,目前我也在学习当中
关于代理
上述配置中代理指的是魔法的代理地址,先开启魔法
1、网络 -》 右键 属性
2、找到Internet选项
3、连接 -》 局域网设置
地址 对应的配置 proxyHost
端口 对应的配置 proxyPort
demo源码地址
gitee
github