java集成OpenAI的chatGpt功能

一、開通OpenAI賬號

1.註冊OpenAI賬號

官網地址:https://openai.com/

注意:提前準備好國外手機號,沒有的話用短信平臺購買手機號接收短信

2.購買國外手機號

地址:https://tiger-sms.com/

 我用支付寶充值了30多元(起充要30,加上手續費30多有點坑啊),買了一個印度尼西亞的號,美國的號用不了,提示虛擬手機號不允許註冊。

 

3.用買到的手機號註冊並獲取短信驗證碼

 

4.登錄OpenAI選擇第一個開始聊天

 

 

二、java集成OpenAI的api

1.設置token

登錄OpenAI選擇第三個進入

進入個人平臺頁面,右上角點擊後選擇View API keys

新增一個key,注意複製好key的內容(這就是token)

 

 2. 項目中引入OpenAI的第三方工具包

由於官方只提供NodeJs和Python版本的工具包,java版的只能用第三方的開源包,可靠性安全性沒法保證,將就着用。

 點擊openai-java進入這個開源網站

 代碼寫的挺不錯的,可惜用的是gradle構建的,由於gradle本人幾乎不會用,就沒下載源碼了。好在提供了maven依賴。

 在maven倉庫中可以查詢到最新的jar包,引入項目即可

<!-- https://mvnrepository.com/artifact/com.theokanning.openai-gpt3-java/service -->
<dependency>
    <groupId>com.theokanning.openai-gpt3-java</groupId>
    <artifactId>service</artifactId>
    <version>0.12.0</version>
</dependency>

3.拷貝例子代碼進行測試

由於缺少類等原因跑不起來,引入相關包

      <!-- json數據解析工具包 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.15.2</version>
        </dependency>

在國內無法直接調用OpenAI的接口,需要使用VPN代理訪問。完整的代碼測試代碼如下:

package org.example.chatgpt;

import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.theokanning.openai.OpenAiApi;
import com.theokanning.openai.completion.CompletionChoice;
import com.theokanning.openai.completion.CompletionRequest;
import com.theokanning.openai.completion.chat.*;
import com.theokanning.openai.image.CreateImageRequest;
import com.theokanning.openai.service.OpenAiService;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.function.Consumer;

import static com.theokanning.openai.service.OpenAiService.*;

/**
 * 時間: 2023/6/5 17:07
 */
public class Main {

    public static void main(String[] args) {
        String token = "sk-XXXXXXXXXXXX";
        String proxyHost = "127.0.0.1";
        int proxyPort = 7890;

        //構建HTTP代理
        Proxy proxy = null;
        if (StrUtil.isNotBlank(proxyHost)) {
            proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
        }
        //構建HTTP客戶端
        OkHttpClient client = defaultClient(token, Duration.of(60, ChronoUnit.SECONDS))
                .newBuilder()
                .proxy(proxy)
                .build();
        ObjectMapper mapper = defaultObjectMapper();
        Retrofit retrofit = defaultRetrofit(client, mapper);
        OpenAiApi api = retrofit.create(OpenAiApi.class);
        OpenAiService service = new OpenAiService(api, client.dispatcher().executorService());

        //文本補全
        System.out.println("\nCreating completion...");
        CompletionRequest completionRequest = CompletionRequest.builder()
                .model("ada")
                .prompt("你叫什麼?")
                .echo(true)
                .user("testing")
                .n(3)
                .build();
        service.createCompletion(completionRequest).getChoices().forEach(new Consumer<CompletionChoice>() {
            @Override
            public void accept(CompletionChoice completionChoice) {
                System.out.println(completionChoice.getText());
            }
        });

        //圖片生成
        System.out.println("\nCreating Image...");
        CreateImageRequest request = CreateImageRequest.builder()
                .prompt("小貓釣魚漫畫")
                .build();

        System.out.println("\nImage is located at:");
        System.out.println(service.createImage(request).getData().get(0).getUrl());

        //對話
        System.out.println("Creating chat completion...");
        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), "你叫什麼?");
        messages.add(systemMessage);
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest
                .builder()
                .model("gpt-3.5-turbo")
                .messages(messages)
                .n(1)
                .maxTokens(500)
                .logitBias(new HashMap<>())
                .build();
        //完整對話
        service.createChatCompletion(chatCompletionRequest)
                .getChoices().forEach(new Consumer<ChatCompletionChoice>() {
                    @Override
                    public void accept(ChatCompletionChoice chatCompletionChoice) {
                        System.out.println(chatCompletionChoice.getMessage());
                    }
                });

        //流式對話(逐Token返回)
//        service.streamChatCompletion(chatCompletionRequest)
//                .doOnError(Throwable::printStackTrace)
//                .blockingForEach(System.out::println);

        //立即釋放連接
        service.shutdownExecutor();
    }
}

上述代碼測試了:文本補全、繪圖、聊天三個功能。

 

注意事項:

1.由於網絡的原因,很多國外網站無法訪問,需要先開通VPN,訪問國外網站

2.國外手機號購買無法註冊,多換幾個號碼試試

3.代碼中需要設置HTTP代理,代理的地址就是VPN的本地地址

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章