ChatGPT API（gpt-3.5-turbo）を Node.js から使ってみる（公式リファレンスで参照した情報も記載）

## はじめに
この記事は、提供が開始されたばかりの「ChatGPT API」を、早速 Node.js で試してみたという話です。

ChatGPT API の提供が始まった話は、「[Introducing ChatGPT and Whisper APIs](https://openai.com/blog/introducing-chatgpt-and-whisper-apis)」という公式の記事を、今朝方見かけて知りました。

https://twitter.com/youtoy/status/1631073285776760832

### API の利用料金
[Pricing のページ](https://openai.com/pricing) を見ると、ChatGPT API（gpt-3.5-turbo）の料金は、「$0.002 / 1K tokens」となっているようです。
![Pricing](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7d1f4486-fc77-5a02-bf6a-082bb728a123.png)

## 公式の技術情報について
今回は Node.js を使って進めたのですが、その際に参照した公式の情報についても書いてみます。

### Node.js用のサンプルプログラム
まず、[OpenAI公式の API Reference](https://platform.openai.com/docs/api-reference/) で、Node.js用のサンプルを見る方法を掲載します。

- 手順
   1. [OpenAI公式の API Reference の「Create chat completion Beta」という項目](https://platform.openai.com/docs/api-reference/chat/create)へ移動
   1. 画面右にある「Example request」と書かれた部分のプルダウンメニューから、「node.js」を選択
      - 【このリンクで直接開けます】 ⇒ https://platform.openai.com/docs/api-reference/chat/create?lang=node.js ）

以下に、Node.js用のサンプルを表示させた時の様子と、取得できるプログラムの内容を掲載します。
![公式ドキュメントでNode.jsを選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ac66018a-9711-f5ab-9270-96c389aaecd2.png)

```javascript:公式サンプル
const { Configuration, OpenAIApi } = require("openai");

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

const completion = await openai.createChatCompletion({
  model: "gpt-3.5-turbo",
  messages: [{role: "user", content: "Hello world"}],
});
console.log(completion.data.choices[0].message);
```

## 実際に実行してみる
それでは公式サンプルをもとに、実際に Node.js で処理を実行してみます。

### 前提
この後の手順を進めた際の前提を記載します。

- OpenAI のアカウント作成や APIキー取得は実施済み
  - OpenAI の APIキーが利用可能な状態（有償のプランで利用／無料枠の残りがある状態）
- Node.js が利用できる状態

ちなみに、APIキーの取得・確認方法を、[昨年 12月に書いた記事](https://qiita.com/youtoy/items/84384ad7a742ea1ce8f5#openai-%E3%81%AE-api-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC)の中で書いていますので、よろしければご参照ください。

### 処理の内容
今回用いた Node.js のプログラムは、以下の通りです。内容は、ほとんど公式サンプルと同じです。

```javascript
const { Configuration, OpenAIApi } = require("openai");

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

(async () => {
  const completion = await openai.createChatCompletion({
    model: "gpt-3.5-turbo",
    messages: [{ role: "user", content: "ChatGPT について教えて" }],
  });
  console.log(completion.data.choices[0].message);
})();
```

入力文は、サンプルにあった「Hello world」ではなく「ChatGPT について教えて」という内容にしてみました。

#### 処理実行時の補足
上記を実行する前に `npm i openai` を実行して、パッケージをインストールしています。また、APIキーの設定では、とりあえずのお試しということで、Mac のコマンドを使った一時的な環境変数の設定を行いました。具体的には、ターミナルで `export OPENAI_API_KEY=【OpenAI の APIキー】` というコマンドを実行しておいてから、Node.js のプログラムを nodeコマンドで実行しました。

### 実行結果
実行結果は以下のとおりです。ChatGPT に関する説明を、返答として得ることができました。

https://twitter.com/youtoy/status/1631131706509127681

なお、公式サンプルの入力例も試したので、合わせてその結果ものせておきます。
![公式サンプルを実行した結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/12b43fb2-d24a-89da-ec5a-c0f871a26688.png)

### 「text-davinci-003」を試した時との違い
[昨年 12月に書いた記事で「text-davinci-003」を試した時](https://qiita.com/youtoy/items/84384ad7a742ea1ce8f5#%E5%85%AC%E5%BC%8F%E6%83%85%E5%A0%B1%E3%82%92%E3%82%82%E3%81%A8%E3%81%AB--nodejs-%E3%81%A7-api-%E3%82%92%E4%BD%BF%E3%81%86)との違いを少し書いておきます。

大きな違いの 1つは、プログラム中のデータ送信部分で「role」という内容が含まれているところです。その近くの行だけ、以下に載せてみます。

```javascript:「text-davinci-003」を使った場合
  const response = await openai.createCompletion({
    model: "text-davinci-003",
    prompt: "Chat GPTについて教えて。",
    ...
```

```javascript:「gpt-3.5-turbo」を使った場合
  const completion = await openai.createChatCompletion({
    model: "gpt-3.5-turbo",
    messages: [{ role: "user", content: "ChatGPT について教えて" }],
    ...
```

この role について、OpenAI公式の API Reference の説明（以下の画像の部分）を見てみると、「system、user、assistant」の何れかになるようです。
![roleについて](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0e38e6b1-eb88-02d3-42b6-37ba24b8bd57.png)

そして、その 3種類の role　は、以下の意味になるようです。

- system： 「ChatGPT にどのような対応をしてほしいか」などの設定を記載
- user： ユーザー側の入力
- assistant： ChatGPT の返答

ちなみに、上の画像では messages の中に「role が system、user、assistant、user となっている 4つのオブジェクト」がありますが、2つ目（user）と 3つ目（assistant）は、過去のやりとりの履歴を送っているようです。
これにより、ChatGPT の返答が、過去のやりとりの内容も加味したものになるようです（詳細は、まだ確認中...）。

## おわりに
提供が始まったばかりの ChatGPT API を、Node.js で利用して、簡単なやりとりを行うことができました。
まだ細かい仕様などは確認できてないので、そのあたりは今後見ていければと思います。

### 【追記】 余談： 別の仕組みと組み合わせてみた話
#### 【追記1】 LINE Bot への組み込み
その後、ChatGPT とのやりとりを、LINEアプリ上で行えるものも試しに作ってみました。

https://twitter.com/youtoy/status/1631282409470820353

#### 【追記2】 特定のキャラっぽいふるまいをさせる
「role の system を使って、特定のキャラっぽいふるまいをさせる」という話を見かけて、それも試してみました。
 
https://twitter.com/youtoy/status/1631340241905934336

#### 【追記3】 リアルタイム音声認識との組み合わせ（VOSK を利用）
[過去に記事を書いたこともある](https://qiita.com/youtoy/items/649dcad9ecccf75a9d01)、リアルタイム音声認識ができる「VOSK」と組み合わせて、入力を音声で行えるようにしてみました。

https://twitter.com/youtoy/status/1631513211546763264

#### 【追記4】 ブラウザ上での音声対話（音声認識と音声合成を p5.speech で実装）
ChatGPT API をライブラリを使わず、Fetch API から利用するようにして、ブラウザから使ってみました。
さらに、その仕組みに音声認識・音声合成の両方を足して、ChatGPT と音声対話をする仕組みのテストをやってみました。

https://twitter.com/youtoy/status/1631931659754041345

###【追記5】 Discord Bot への組み込み

https://twitter.com/youtoy/status/1632048817699946497

## Python を使った事例
今回の記事では Node.js を利用しましたが、Python でも利用可能です。Python が使われている事例の記事のリンクを掲載しておきます。

●ChatGPT API の使い方｜npaka｜note
　https://note.com/npaka/n/n0dd2b226e8ae

●ChatGPT APIを使ってAIキャラクターを作ってみる！ - Qiita
　https://qiita.com/sakasegawa/items/db2cff79bd14faf2c8e0