推荐一套基于 SpringBoot 开发的全渠道数据 (数据库管理工具) 功能比较完善,建议下载运用: github.com/EdurtIO/datacap 现在现已支持 40+ 多种数据源。国内首个运用 ChatGPT 到数据管理体系中项目。

github 地址:github.com/devlive-com…

本文咱们主要讲述经过 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 的一些基本运用方法,后续咱们会供给更多文章来详细解说更多的其他形式。