ターミナルから GPT-3(実質 ChatGPT) を呼び出すオレオレコマンド

## 概要

OpenAI のサイトの Examples というセクションを見てみたら、「Q&A」という例が出ていました。

[OpenAI](https://platform.openai.com/examples/default-qa)

たぶん ChatGPT はこれに近いことをやっていると思われるので、個人利用ならそこまで問題なく ChatGPT 代替が作れそうです。

一応会員向けの情報だと思うのでコピペは避け、オリジナルのプロンプトを用いた Python スクリプトを書いてみます。

また、そのスクリプトにエイリアスを張ることで、ターミナルから簡単に呼び出せるようにします。

## API KEY の取得 と .zshrc(1 回目)

会員画面右上のメニューから"VIEW API KEYS"を選択し、画面が切り替わったら"Create new secret key"から作成します。

キーをどこかに保管し、

```bash
vim ~/.zshrc
```

などと入力して.zshrc ファイルを編集します(Mac 前提)。

```bash
export OPENAI_API_KEY={KEY}
```

上記の{KEY}を保管しておいたキーに置き換えた行を打ち込み、保存します。

ターミナルを再起動します(あるいは再読み込み)。

これで"OPENAI_API_KEY"という名前の環境変数が読み取れるようになりました。

(今回は Mac のどこで呼び出すか分からないので .zshrc に記載しましたが、ディレクトリ内でしか呼び出さない場合は direnv などを使うのが楽だと思います)

## Python スクリプトの記述

まず`pip install openai`のようにしてライブラリをインストールします。

これも Mac のどこから呼び出すか分からないのでグローバルにインストールしてしまいますが、普通なら`venv`などを使うと思います。

そして `qa.py` ファイルを作成します。

```python qa.py
import os
import openai
import argparse

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument("text", type=str, default="")
  args= parser.parse_args()
  TEXT = args.text

  MY_PROMPT = f"""日本語で答えるQ&Aボットがほしい。答えが不明な場合「不明」と答えてほしい。

  Q: 富士山の高さは？
  A: 3,776メートルです

  Q: 日本の人口は？
  A: 1.257億(2021年当時)

  Q: バナナの平方根は？
  A: 不明

  Q: ビートルズの代表的なアルバム
  A: "Abbey Road", "Rubber Soul", "White Album"

  Q: {TEXT}
  A: """

  openai.api_key = os.getenv("OPENAI_API_KEY")

  response = openai.Completion.create(model="text-davinci-003", prompt=MY_PROMPT, temperature=0.25, max_tokens=512)

  for choice in response["choices"]:
      print(choice["text"])

if __name__ == '__main__':
  main()
```

全体はこんな感じにしてみました。

### スクリプト解説

```python
parser = argparse.ArgumentParser()
parser.add_argument("text", type=str, default="")
args= parser.parse_args()
TEXT = args.text
```

ここでは呼び出されたときの引数を解釈しています。

例えば

```bash
python qa.py "世界の人口は？"
```

のように使った場合、`args.text`に"世界の人口は？"が入ります。

それを`TEXT`に代入しています。

```python
MY_PROMPT = f"""日本語で答えるQ&Aボットがほしい。答えが不明な場合「不明」と答えてほしい。

Q: 富士山の高さは？
A: 3,776メートルです

Q: 日本の人口は？
A: 1.257億(2021年当時)

Q: バナナの平方根は？
A: 不明

Q: ビートルズの代表的なアルバム
A: "Abbey Road", "Rubber Soul", "White Album"

Q: {TEXT}
A: """
```

ここがキモです！

GPT-3 に渡すプロンプトを設定しています。

まず前提として「日本語で答える Q&A ボットがほしい。答えが不明な場合「不明」と答えてほしい。」という命令というかプロンプトを渡します。

次に Q&A の例をいくつか示します。

最後に Q の欄にさきほどの TEXT を挿入、A の欄を空白にしてプロンプトを終えます。

GPT-3 の Completion API は文章の続きを補完するものなので、A の欄の続きを書く = Q に答えてくれます。

```python
openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Completion.create(model="text-davinci-003", prompt=MY_PROMPT, temperature=0.25, max_tokens=512)

for choice in response["choices"]:
    print(choice["text"])
```

API の呼び出し部分です。先ほど環境変数に格納したキーを取得します。

prompt に MY_PROMPT を指定した Competion(Generator オブジェクトになるのかな)を作ります。

それを responce に格納し、response の中の text を読み、表示します。

## エイリアスを張る .zshrc(2 回目)

ここまでがスクリプトを作る作業です。

一旦

```bash
python qa.py "宇宙の人口は？"
```

のように質問してテストしてみるといいでしょう。

その後、スクリプトをターミナルから呼び出せるように .zshrc を編集します。

```bash
vim ~/.zshrc
```

```bash
alias qa="python {スクリプトへのフルパス}"
```

{スクリプトへのフルパス}の部分をフルパスに置き換えてください。

ターミナルを再起動します(あるいは再読み込み)。

これで、"qa"コマンドで AI に質問し、しばらく待つと回答が表示されるはずです！

## 感想

今のところ使用感は良好です。

プロンプト部分を変えたスクリプトを他にも用意して、用途ごとに使い分けたりしたいです。

## 課金について

OpenAI に登録したての場合、$18 の枠がもらえます。

今回の用途なら十分に足りると思います。

しばらくすると$18 は消えてしまうようなので、そのときは課金が必要になります。

(自分もまだ課金していないので使い心地や適正な値段かどうか等は分かりません)