推荐一套基于 SpringBoot 开发的全平台数据 (数据库管理工具) 功能比较完善,建议下载使用: github.com/EdurtIO/datacap 目前已经支持 40+ 多种数据源。国内首个应用 ChatGPT 到数据管理系统中项目。
github 地址:https://github.com/devlive-community/openai-java-sdk
本文我们主要讲述通过 openai-java-sdk
依赖整合访问 OpenAi 提供的功能。
OpenAI Java SDK 主要 为 Java 开发人员提供方便易用的 SDK 来与 OpenAI 的 API 进行交互。
构建 maven
项目,并添加依赖
<dependency><groupId>org.devlive.sdk</groupId><artifactId>openai-java-sdk</artifactId><version>1.2.0</version>
</dependency>
推荐将 1.2.0
替换为 LATEST
,这样可以始终使用最新版本。
构建连接客户端
OpenAiClient client = OpenAiClient.builder().apiKey(System.getProperty("openai.token")).build();
默认我们只需要指定 OpenAi 提供的密钥即可。如果我们需要使用第三方提供的 OpenAi 镜像,可以使用以下代码:
OpenAiClient client = OpenAiClient.builder().apiHost(System.getProperty("proxy.host")).apiKey(System.getProperty("proxy.token")).build();
proxy.host
第三方服务提供的主机名
proxy.token
第三方服务提供的密钥
构建 Completions
CompletionEntity configure = CompletionEntity.builder().model(CompletionModel.TEXT_DAVINCI_003.getName()).prompt("测试一下").temperature(2D).build();
client.createCompletion(configure).getChoices().forEach(System.out::println);
运行程序后,输入大概如下内容:
ChoiceEntity(content=git diff
git diff 恩·胜恩, index=0, logProb=null, finishReason=length)
如果我们需要替换其他模型只需要替换
.model(CompletionModel.TEXT_DAVINCI_003.getName())
即可。
构建 Chat Completions
通过该方式可以实现 ChatGPT 的对话模式。
List<CompletionMessageEntity> messages = Lists.newArrayList();
messages.add(CompletionMessageEntity.builder().content("Hello, my name is openai-java-sdk").build());CompletionChatEntity configure = CompletionChatEntity.builder().messages(messages).build();client.createChatCompletion(configure).getChoices().forEach(choice -> messages.add(choice.getMessage()));messages.add(CompletionMessageEntity.builder().content("What is my name?").build());client.createChatCompletion(configure).getChoices().forEach(choice -> {System.out.println(choice.getMessage());});
运行程序后,输入大概如下内容:
CompletionMessageEntity(role=assistant, content=Your name is "openai-java-sdk" as mentioned earlier., name=null)
在本地调用中我们通过传递上下文对 Ai 提供一些相关信息,方便使其记录我们要获取的内容。
如果我们需要替换其他模型只需要替换
.model(CompletionModel.TEXT_DAVINCI_003.getName())
即可。
自动释放资源
以上提供的方式无法自动释放我们构建的客户端等资源,这样就会导致我们过度消耗,如果访问过大会导致 OOM。
try (OpenAiClient client = OpenAiClient.builder().apiKey(System.getProperty("openai.token")).build()) {List<CompletionMessageEntity> messages = Lists.newArrayList();messages.add(CompletionMessageEntity.builder().content("Hello, my name is openai-java-sdk").build());CompletionChatEntity configure = CompletionChatEntity.builder().messages(messages).build();client.createChatCompletion(configure).getChoices().forEach(choice -> messages.add(choice.getMessage()));messages.add(CompletionMessageEntity.builder().content("What is my name?").build());client.createChatCompletion(configure).getChoices().forEach(choice -> {System.out.println(choice.getMessage());});
}
自定义 OkHttpClient
默认会提供一个 OkHttpClient
,里面配置了默认的一些配置,比如超时时间等,如果我们需要自定义这些参数我们需要使用以下代码
try (OpenAiClient client = OpenAiClient.builder().apiKey(System.getProperty("openai.token")).client(okHttpClient).build()) {List<CompletionMessageEntity> messages = Lists.newArrayList();messages.add(CompletionMessageEntity.builder().content("Hello, my name is openai-java-sdk").build());CompletionChatEntity configure = CompletionChatEntity.builder().messages(messages).build();client.createChatCompletion(configure).getChoices().forEach(choice -> messages.add(choice.getMessage()));messages.add(CompletionMessageEntity.builder().content("What is my name?").build());client.createChatCompletion(configure).getChoices().forEach(choice -> {System.out.println(choice.getMessage());});
}
当然如果我们只是修改一些超时时间相关问题可以参考以下代码:
try (OpenAiClient client = OpenAiClient.builder().apiKey(System.getProperty("openai.token")).timeout(10).unit(TimeUnit.SECONDS).build()) {
List<CompletionMessageEntity> messages = Lists.newArrayList();
messages.add(CompletionMessageEntity.builder().content("Hello, my name is openai-java-sdk").build());CompletionChatEntity configure = CompletionChatEntity.builder().messages(messages).build();client.createChatCompletion(configure).getChoices().forEach(choice -> messages.add(choice.getMessage()));messages.add(CompletionMessageEntity.builder().content("What is my name?").build());client.createChatCompletion(configure).getChoices().forEach(choice -> {System.out.println(choice.getMessage());});
}
我们通过指定 .timeout(10)
配置时长,通过 .unit(TimeUnit.SECONDS)
时长单位,示例中我们配置的是 10秒
。
使用 Azure 提供的 OpenAi
在 Azure 提供的服务中,有些方式做了修改,我们可以参考以下代码:
try(OpenAiClient client=OpenAiClient.builder().apiHost("https://eus-chatgpt.openai.azure.com").apiKey(System.getProperty("azure.token")).provider(ProviderModel.azure).model("text-davinci-002").version("2022-12-01").build())
{client.createCompletion(configure).getChoices();
}
以上就是我们使用 openai-java-sdk
的一些基本使用方式,后续我们会提供更多文章来详细讲解更多的其他模式。