Open AIのAPIキー発行からJavaでの簡単実装までやってみる

最近、話題のChatGPTをOpenAIの公式サイトで使いながら思ったのがAPI処理を実装してみようということでした。それに関して記録の形で投稿したいと思います。

## Javaで実装するには
以下の順番でやってみようと思っている
1\. OpenAIのAPIキーを取得 
2\. Java用ライブラリーを使用
3\. 処理用コードを作成
4\. テスト

### 1. OpenAIのAPIキーを取得
以下のリンクに接続してログイン

https://platform.openai.com/account/api-keys

そうすると、以下の画面が表示されるので「＋Create new secret key」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/257020d9-bf0b-e4a4-6741-0c6c05589f34.png)

名前は適当に入力して「Create secret key」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/c6cd6351-5846-5f49-feed-d9223b25da32.png)

これでAPIキーが発行された
右側のコピーボタンを使ってメモしておこう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/cbfb1e84-136e-d38a-efcd-3ab2e7f27de9.png)

登録してから3ヶ月間は無料で18ドル分が付与されるんだそうで、確認したところ、期限ありの１８ドル分が入っていた。これでテストができそう。
（以下はテストで少し使った後の画像になる）
（Googleの職場アカウントで登録した際はもらえなかったので、要確認！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/9c184d35-51fa-3d4a-8a76-0920752e4dc2.png)


### 2. Java用ライブラリーを使用
以下のリンクには実装に必要なライブラリーが載っているので一度確認をしてみよう

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

artifact「client」モジュールにあるOpenAiServiceは使えないようなので、今回は簡単に作るために「service」を用いて作ってみようと思う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/d3ecad95-cff7-0fa3-cf96-a4b1e1989d1b.png)

Maven設定はこちら。最新バージョンを取り込もう (2023.4.21時点)
``` porm.xml
<dependencies>
    <dependency>
      <groupId>com.theokanning.openai-gpt3-java</groupId>
      <artifactId>service</artifactId>
      <version>0.12.0</version>       
    </dependency>
  </dependencies>
```

### 3. 処理用コードを作成
Javaコードはこちら。
各設定はResourceBundleを用いてまとめておいた
プロンプトはScannerとかを使って直接入力してもらうようにしてもいいが、今回は文字列に直入力しておいて実行する形にする
``` app.java
package com.openai;

import java.util.ResourceBundle;
import com.theokanning.openai.completion.CompletionRequest;
import com.theokanning.openai.service.OpenAiService;
import com.theokanning.openai.completion.*;

public class App
{
    public static void main( String[] args )
    {
        ResourceBundle config = ResourceBundle.getBundle("prop");
        String prompt = "Q: 日本の首都名はなんですか? A:";
        String token = config.getString("openai.token");
        String model = config.getString("openai.model");
        int maxTokens = Integer.valueOf(config.getString("openai.maxTokens"));
        Double temperature = Double.valueOf(config.getString("openai.temperature"));
        
        CompletionRequest completionRequest = CompletionRequest.builder()
        .prompt(prompt)
        .model(model)
        .echo(true)
        .maxTokens(maxTokens)
        .temperature(temperature)
        .build();

        OpenAiService service = new OpenAiService(token);
        CompletionChoice choice = service.createCompletion(completionRequest).getChoices().get(0);
        System.out.println(choice.getText());
    }
}
```

設定ファイルはこちら
APIキーとモデル設定が一番大事だと思う
ちなみに、API利用は有料だが、個人アカウントに限って期限ありで20ドル分、使えるのですごく助かる！
```prop.properties
openai.token=OpenAIから取得したAPIキー
openai.model=text-davinci-003
openai.maxTokens=100
# 値が大きいほど、モデルにはより多くのリスクが伴います。
# よりクリエイティブなアプリケーションの場合は 0.9、答えが明確なアプリケーションの場合は 0
openai.temperature=0
```

モデルに関する情報は以下を参照

https://platform.openai.com/docs/models/overview

### 4. テスト
早速、テストしてみよう
mainメソッドを実行したところ、以下のようにちゃんと動いてくれた！
これを基にいろんなWebサービスに適用できそうー！

```
Q: 日本の首都名はなんですか? A: 日本の首都名は東京です。
```

## 最後に
応用はいろいろできそうです。
今回はOpenAiServiceの「createCompletion」のみ使っていますが、中身に定義されているメソッドからチャット機能とかイメージ生成などができると思います。
以上！