JavaだってGPT-3.5を使ってChatGPTクローンが作れる

OpenAI が提供している ChatGPT は非常に面白いですね。
ここまで、すごいものが出ると今後、GPTやChatGPTがさらに進化することが想像できますね。

この記事では、GPTを使ったChatGPTクローンをJavaで実行するまでを紹介していきます。

# どうやってChatGPTクローンを作るのか？

ChatGPTクローンを作る方法としては、LangChainというものがあり、OpenAIのGPT-3やGoogleのFLAN-T5 XLといった大規模言語モデル(LLM)を使いやすくするためのフレームワークです。

:::note info
詳しくは[npakaこと布留川英一のnote](https://note.com/npaka/n/n61ad59380a43#0e3152ff-6526-47b4-9bfa-6cfe008ac605)を参照のこと。
:::

しかし、上記のLLMは無料では使用できず、OpenAIのAPIアカウントが必要であり、連携するAPIによっては追加の費用が発生する可能性があります。

# JavaでGPT-3を使うには
GPT-3をJavaで使うには、OpenAI APIを利用する方法があります。下記手順に従い、APIキーの取得とJavaでのAPI呼び出しを実装することができます。

1. OpenAI APIキーを取得する
2. Java用のクライアントライブラリを使用する
3. 呼び出しを実装する

これらの手順を踏むことで、JavaでOpenAIのGPT-3を利用することができます。

## 1. OpenAI APIキーを取得する
こちらに詳しく載っているいるサイトがあったので、リンクを貼っておきます。

https://laboratory.kazuuu.net/how-to-get-an-openai-api-key/

## 2. Java用のクライアントライブラリを使用する
Javaのクライアントライブラリを検索したところ、こちらのライブラリが一番使えそうなので、こちらを載せておきます。

https://github.com/TheoKanning/openai-java

Mavenで利用する場合は、このように指定すると利用できるようになります。
```xml:pom.xml
    <dependencies>
        <dependency>
            <groupId>com.theokanning.openai-gpt3-java</groupId>
            <artifactId>client</artifactId>
            <version>0.9.0</version>
        </dependency>
    </dependencies>
```

## 3. 呼び出しを実装する
実際のJavaからの呼び出しはこのように実装します。
ここのライブラリの呼び出しはPythonとかとパラメータの呼び出しは変わっていないので、Pythonの記事とかでも案外参考になったりします。

```java
OpenAiService service = new OpenAiService("your_token");
CompletionRequest completionRequest = CompletionRequest.builder()
        .prompt("Somebody once told me the world is gonna roll me")
        .model("ada")
        .echo(true)
        .build();
service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
```

# ChatGPTクローンをJavaで作ってみる
では、そろそろGPT-3を使って実際コーディングして会話をしてみます。
AIアシスタント風な実装になっています。
```java
package jp.livlog.gpt3sample;

import java.util.ResourceBundle;

import com.theokanning.openai.OpenAiService;
import com.theokanning.openai.completion.CompletionChoice;
import com.theokanning.openai.completion.CompletionRequest;

public class Sample1 {

    public static void main(final String[] args) {

        final var config = ResourceBundle.getBundle("config");

        final var token = config.getString("openai.token");
        final var service = new OpenAiService(token);

        System.out.println("\nCreating completion...");

        final var message = "やっぱり、冬の鍋はおいしいですね。";
        final var prompt = "The following is a conversation with an AI assistant. The assistant is helpful, creative, clever.\nHuman: " + message
                + "\nAI: ";

        final var completionRequest = CompletionRequest.builder()
                .model("text-davinci-003")
                .prompt(prompt)
                .maxTokens(256)
                .build();
        final var completionResult = service.createCompletion(completionRequest);
        final var choiceList = completionResult.getChoices();

        for (final CompletionChoice choice : choiceList) {
            System.out.println(choice);
        }
    }
}
```

冬の鍋について聞いてみました。
その回答もなかなか、いい感じで返してくれていますね。
```console
Creating completion...
CompletionChoice(text= 冬の鍋の様々な種類も、なかなか美味しく頂きますよ！お好みで鍋を作ってみると、素敵な時間を楽しめるかもしれませんね！, index=0, logprobs=null, finish_reason=stop)
```


# 最後
簡単にですが、ChatGPTクローンを作ってみましたが、これだけのコーディングで対話できるようになったので、本当にここまで来たのかということを実感しますね。

ただ、利用には有料であるため、実際に試すときは気を付けて利用をしてください。

これからは、自分の[サービス（CotoGoto）](https://cotogoto.ai/)に組み込む方法を考えていきたいと思います。


# 追記
最新のJavaでChatGPTモドキを作るのをこちらにまとめ直しています。

https://qiita.com/blue_islands/items/2522ba0bc1c2db450342