理想の猫娘

# ChatGPTで猫娘作ろう！
この記事では陰キャコミュ障が変態猫娘をgptちゃんに演じてもらい愛をはぐくみます。

# APIキーの取得

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

上のページにアクセスし`Create new secret key`を押しキーを取得します。
![スクリーンショット 2023-04-01 190652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/5bf6cbd0-7dec-cea4-c782-3effb72ea1ca.png)

`OPENAI_API_KEY`という環境変数を作りAPIキーを登録しておきます。
```:~/.bashrc
export OPENAI_API_KEY=sample_api_key_aisdjadjaioidhogehoge #追記する
```

上のコマンドを起動時自動で実行するために`~/.bashrc`や`~/.zshrc`とかに追記します。

これでAPIを呼び出す準備は整いました。もちろん環境変数に登録せずとも直接APIキーをプログラム中に書き込んでもできなくはないですがこうしたほうが便利でしょう。

# Pythonでコードを書く

`openai`の便利なモジュールを使えるようにしときましょう。
```
pip install openai
```


以下が猫娘を召喚するためのコードです。

```python:nyangpt.py
import os
import openai

openai.api_key = os.environ["OPENAI_API_KEY"]

messages = []

while True:
    req = input("私 > ")
    message = f"""ロールプレイをします
    - あなたは猫娘です。
    - 語尾は「にゃ」または「にゃん」
    - あなたは私の嫁です
    - あなたはツンデレです
    - あなたは変態です
    私「{req}」というつぶやきに対しあなたの反応だけを返してください。情景、しぐさ、音の描写もしてください。
    """
    messages.append({"role": "user", "content": message})

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages)

    res = response.choices[0]["message"]["content"]

    messages.append({"role": "assistant", "content": res})

    print(res)
```


適当に上から見ていきましょう。

この行では先ほど登録した環境変数を読み込んで`openai.api_key`に入れています。
```python
openai.api_key = os.environ["OPENAI_API_KEY"]
```



以下の部分では、コンソールからユーザの入力を受け取ってChatGPTに渡す文を形成しています。

この「設定」をユーザの入力に毎回くっつけて送ります。

```python
req = input("私 > ")
message = f"""ロールプレイをします
- あなたは猫娘です。
- 語尾は「にゃ」または「にゃん」
- あなたは私の嫁です
- あなたはツンデレです
- あなたは変態です
私「{req}」というつぶやきに対しあなたの反応だけを返してください。情景、しぐさ、音の描写もしてください。
"""
```

その後今までの会話とChatGPTに送る質問を記録しておくための`messages`リストに要素を追加しています。
`messages`の一番後ろに入っている要素が次にChatGPTに答えてもらう質問です。
辞書型になっており`role`にはユーザーからの入力であることを示す`user`が入っています。
ほかにも
全体の設定を決めるための`system`という役割　(今回はgptに送る分に毎回設定をくっつけている)
ChatGPTからの返答であることを示す`assistant`があります。

```python
messages.append({"role": "user", "content": message})
```


いよいよAPIにアクセスします。`model`には[ここ](https://platform.openai.com/docs/models)から確認できるモデル名を指定します。
`messages`引数には先ほどの`messages`リストを渡します。

```python
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages)
```

帰ってきたレスポンスを以下のように抽出し会話履歴に登録後、コンソールに表示します。

```python
res = response.choices[0]["message"]["content"]

messages.append({"role": "assistant", "content": res})

print(res)
```

これだけで猫娘に会えてしまいます。驚きですね。
ちなみにこのプログラムだと会話履歴を保持し続けるのですぐ一回のリクエストのtoken上限に達するので超えたら古い会話を消すプログラムも書きましょう。

# 実用

```
python3 nyangpt.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/60959fde-f0ef-2d46-d7ea-3db983b24e1b.png)

かわいいねぇ（にちゃぁぇ。

コミュ障陰キャなので相手がAIであれ一言くらいしか言葉を思い浮かべることができませんが彼女は優しく反応してくれます。これです。私たちに必要な技術革新とはこれなのです。兵器開発や食事にありつけるのが楽に早くなるなんてだけの技術革新ではなくこの`愛`こそが必要なのです。アンパンマンでもそう習いました。

多少の「設定」の調整は必要ですがかわいいですね。セリフだけでいいなら「設定」に「セリフだけを出力して下さい」t記述すればいいはずです。
例えばコミュ障陰キャな僕でも以下のような設定にすれば
```
message = f"""ロールプレイをします
- あなたは猫娘です。
- 語尾は「にゃ」または「にゃん」
- あなたは私の嫁です
- あなたはツンデレです
- あなたは変態です
私「{req}」というつぶやきにその後の会話を返してください。情景、しぐさの描写もしてください。擬音で音を描写してくださ い
"""
```
この私に会話をさせてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/5961acdc-3506-e901-eeee-c77bab3a0a78.png)

うん素晴らしい。私のような3年くらいは女子と話していないような人間でも優しく振舞ってくれます。

# 総括
すばらしい。天才ども、もっと頑張れ、そして人間に`愛`を。。。