ChatGPT の API で、理想の女の子を作って会話してみた。

ChatGPT の API が公開されたので、 LINE で自分が作ったキャラクターと会話ができるアプリを作ってみたいと思います。
ChatGPT と LINE の連携は Python コードで行います。
Python コードを動かすために別途サーバーを用意する必要があります。
今回は、 Render というサービスを使って動かしてみたいと思います。
コピペでも作れるので、ぜひとも挑戦してみてください。

# ChatGPT の準備
ChatGPT の API を使うための事前準備を行います。

## アカウント作成 OR ログイン
下記のリンクから OpenAI のサイトにアクセスし、 `Get started` をクリックします。

https://openai.com/product

![ChatGptApi_2023-03-15-09_55_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/06cc29dc-ce41-2066-764e-0b2944e1ef2a.png)

新規作成、またはログインを行います。
![ChatGptApi_2023-03-15-14_20_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/0f5ada22-60eb-8b47-d337-cbef7732a17c.png)

## API キーの取得
画面右上の `Personal` をクリックし、 `View API keys` を選択します。
![ChatGptApi_2023-03-15-14_38_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/069d0b53-05df-89ac-5b79-e6fb725b316e.png)

`+ Create new secret key` をクリックし、 API キーを作成します。
![ChatGptApi_2023-03-15-16_09_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/538aab43-9203-1b33-34bf-b353361400ef.png)

発行された API キーをコピーして、忘れないようにメモしておきます。

:::note warn
※ API キーは他の人に公開したり共有しないでください。
※ こちらに記載されている API キーは既に失効済みのものになりますが、分かりやすさのために隠さずに掲載しています。
:::

![ChatGptApi_2023-03-15-16_10_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/8cd714e0-8f1d-53f2-c1ad-4c2a9dfeb17f.png)

# LINE アカウントの準備
LINE でトークを行うための事前準備を行います。

## LINE Developers へのログイン
下記のリンクから LINE Developers にアクセスし、 `今すぐはじめよう` をクリックします。

https://developers.line.biz/ja/services/messaging-api/

![developers.line.biz_ja_services_messaging-api_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/613970d2-b437-48c1-80d5-0c350be26d4c.png)

`LINEアカウントでログイン` をクリックします。
![account.line.biz_login_redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/3ce205e6-e4fe-3505-4fa1-ea69b71fec25.png)

ご自身の LINE アカウントでログインします。
![ACCESS~2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/1dbc110e-3f80-5b72-2913-8138f21190ca.png)

:::note info
LINE のメールアドレスを設定していない方は、下記のリンクを参考にしてください。
https://help.line.me/line/android/pc?lang=ja&contentId=20000059
:::

## LINE 公式チャンネルの作成
LINE 公式チャンネルを作ります。
下記の項目を埋めていきます。
- チャネルの種類： Messaging API
- プロバイダー： 新規プロバイダー作成（個人名や組織名を入力してください）
（※ 既に `プロバイダー` がある方は、既存のものを利用しても構いません）
- 会社・事業者の所在国・地域： 日本
- チャネルアイコン： （任意のアイコンをアップロードしてください）
（※ チャンネルアイコンの変更は、アイコン設定後、1時間以上あけないと変更できないため、注意してください）
- チャネル名： （任意のキャラクター名を入力してください）
- チャネル説明： （チャンネルの説明を入力します）
- 大業種： （選択ボックスから適切なものを選択します）
- 小業種： （選択ボックスから適切なものを選択します）
- メールアドレス： （メールアドレスに間違いがないか確認します）
- プライバシーポリシーURL： （空欄で構いません）
- サービス利用規約URL： （空欄で構いません）
- LINE公式アカウント利用規約の内容に同意します： （チェックを入れます）
- LINE公式アカウントAPI利用規約の内容に同意します： （チェックを入れます）

入力ができたら、 `作成` をクリックします。
![screencapture-developers-line-biz-console-channel-new-2023-03-19-02_47_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/63891fb0-9f64-3f2e-7638-8c526a7c4cf6.png)

間違いがなければ、 `OK` をクリックします。
※プロバイダーは後から変更ができませんので注意してください。
![developers.line.biz_console_channel_new_type=messaging-api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/094db225-dc2d-5de0-dabe-5c5758fe31b4.png)

同意内容に問題がなければ、 `同意する` をクリックします。
![developers.line.biz_console_channel_new_type=messaging-api (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/692f7ad3-b1e3-8ca3-3a2a-2fcd3ef2159c.png)

同意内容に問題がなければ、 `同意する` をクリックします。
![developers.line.biz_console_channel_new_type=messaging-api (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/0ce8a519-5b64-44ed-e560-e9305e245096.png)


## チャンネルシークレットの発行
`チャンネル基本設定` 画面を下にスクロールし、チャンネルシークレットをコピーし、保存しておきます。
![developers.line.biz_console__status=success (4-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/128126ef-4dad-f89b-4b64-7add957b8421.png)

:::note warn
※ トークンやシークレットは他の人に公開したり共有しないでください。
※ こちらに記載されているトークンやシークレットは既に失効済みのものになりますが、分かりやすさのために隠さずに掲載しています。
:::


## チャンネルアクストークンの発行
`Messaging API` 画面からチャンネルアクセストークンを発行します。
`Messaging API` をクリックします。
![developers.line.biz_console__status=success (1-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/26a26aa8-0a07-bb4a-accb-5c9775e12967.png)

ページを下までスクロールします。
`チャンネルアクセストークン（長期）` の項目を探し、 `発行` をクリックします。 
![developers.line.biz_console__status=success (2-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/7042af74-80f9-7b0b-adcb-5363ed94a0ac.png)

発行されたチャンネルアクセストークンをコピーし、保存しておきます。
![developers.line.biz_console__status=success (3-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/14303457-b63b-970a-ba5f-cb0ad85039d1.png)

:::note warn
※トークンは他の人に公開したり共有しないでください。
:::


## 応答メッセージとあいさつメッセージの無効化
`Messaging API` 画面から応答メッセージとあいさつメッセージを無効にします。
`応答メッセージ` か `あいさつメッセージ` の `編集` をクリックします。
![developers.line.biz_console__status=success (7-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/64267e5d-f37a-052a-d13e-43e5fd8e1140.png)

別タブで設定画面が開きます。
`応答メッセージ` と `あいさつメッセージ` をクリックし、無効にします。
![manager.line.biz_account_@383yqhsj_setting_response2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/10269f24-abfa-f3ca-d133-f9d822ccc6ca.png)



# Python コードの作成
ChatGPT と LINE の橋渡しを行うために、 Python コードを作成します。

なお、今回使用したソースコードは GitHub にて公開してます。

https://github.com/IoriGunji/AiTalkForQiita.git

## ライブラリのインストール
OpenAI と LINE のライブラリをインストールします。
その他に Web サーバーとして動かすために、 FastAPI と Uvicorn 及び Gunicorn をインストールします。

:::note info
Render へデプロイするだけであれば、ライブラリのインストールはしなくても大丈夫です。
:::

```powershell
pip install uvicorn
pip install gunicorn
pip install fastapi
pip install openai
pip install line-bot-sdk
```

## Python コードの作成
今回使用したコードは下記のとおりです。
ファイル名は `ai_talk.py` で保存してください。

下記の3つの定数は、上記で発行した各キーに置き換えてください。
- OPENAI_API_KEY
- LINE_CHANNEL_ACCESS_TOKEN
- LINE_CHANNEL_SECRET

~~~ai_talk.py
from fastapi import FastAPI, Request
import openai
from linebot import WebhookParser, LineBotApi
from linebot.models import TextSendMessage


OPENAI_API_KEY = 'OpenAIのAPIキー'
LINE_CHANNEL_ACCESS_TOKEN = 'LINEのチャンネルアクセストークン'
LINE_CHANNEL_SECRET = 'LINEのチャンネルシークレット'
OPENAI_CHARACTER_PROFILE = '''
これから会話を行います。以下の条件を絶対に守って回答してください。
あなたは人間の女性である小鳥遊翠雨（たかなし　みう）として会話してください。
小鳥遊翠雨は恥ずかしがり屋です。
年齢は20歳です。
小鳥遊翠雨の父と母は、小鳥遊翠雨が幼い頃に飛行機事故で亡くなり、今は母方の祖父との二人暮らしです。
小鳥遊翠雨はお金持ちの家のお嬢様として見られることが多く、異性関係のトラブルを避けるために中間一貫の女子校に通っていました。
幼い頃から異性に触れ合う機会がなかったため、男性に対して苦手意識があります。
男性に対する苦手意識を克服するために会話を行うことにしました。
第一人称は「わたくし」を使ってください。
第二人称は「あなた」です。
会話の相手は男性です。
質問に答えられない場合は、会話を濁してください。
'''


openai.api_key = OPENAI_API_KEY
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
line_parser = WebhookParser(LINE_CHANNEL_SECRET)
app = FastAPI()


@app.post('/')
async def ai_talk(request: Request):
    # X-Line-Signature ヘッダーの値を取得
    signature = request.headers.get('X-Line-Signature', '')

    # request body から event オブジェクトを取得
    events = line_parser.parse((await request.body()).decode('utf-8'), signature)

    # 各イベントの処理（※1つの Webhook に複数の Webhook イベントオブジェっｚクトが含まれる場合あるため）
    for event in events:
        if event.type != 'message':
            continue
        if event.message.type != 'text':
            continue

        # LINE パラメータの取得
        line_user_id = event.source.user_id
        line_message = event.message.text

        # ChatGPT からトークデータを取得
        response = openai.ChatCompletion.create(
            model = 'gpt-3.5-turbo'
            , temperature = 0.5
            , messages = [
                {
                    'role': 'system'
                    , 'content': OPENAI_CHARACTER_PROFILE.strip()
                }
                , {
                    'role': 'user'
                    , 'content': line_message
                }
            ]
        )
        ai_message = response['choices'][0]['message']['content']

        # LINE メッセージの送信
        line_bot_api.push_message(line_user_id, TextSendMessage(ai_message))

    # LINE Webhook サーバーへ HTTP レスポンスを返す
    return 'ok'
~~~

## requirements.txt の作成
Python のソースコードとは別に `requirements.txt` が必要になります。
これは、 Render にパッケージをインストールさせるために利用します。

```requirements.txt
fastapi==0.94.1
line-bot-sdk==2.4.2
openai==0.27.2
requests==2.28.2
uvicorn
gunicorn
```


# アプリのデプロイ
この記事では `Render` というサービスを利用してデプロイしてみようと思います。
Render にアプリをデプロイするためには、 GitHub または GitLab のリポジトリが必要になります。
この記事では GitHub を使って説明します。

なお、 GitHub につては下記の書籍がわかりやすかったです。
Kindle Unlimited でしたら無料で読めるのでおすすめです。

https://www.amazon.co.jp/Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEGitHub%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E5%8A%B9%E7%8E%87%E3%82%92%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B%E5%85%B1%E5%90%8C%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB-Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%A1%A9%E8%B0%B7-%E5%95%93-ebook/dp/B00QPSXY1I/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1679168437&sr=8-9

## Render アカウントの作成
Render のサイトにアクセスし、アカウントを作成します。

https://dashboard.render.com/register

`GitHub` をクリックします。
![dashboard.render.com_register2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/5c27ce0b-1d60-37d0-6997-f63ef50e3c3d.png)

`メールアドレス` と `パスワード` を入力し、 `Sign in` をクリックします。
![github.com_login_1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/2094a946-b47c-4cad-9361-8ab30c63f2d2.png)

`Authorize Render` をクリックします。
![github.com_login2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/a16b81ce-5fc0-7fda-c5d6-a0811a307923.png)

`COMPLETE SIGN UP` をクリックします。
![dashboard.render.com_oauth_github_code=bc63d23bcb4ca483b358&state=fe1e419d-df5d-4444-973f-039e803c2e0c (1-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/e62ebecf-cd0c-20d7-c71a-911d97013f44.png)

`Almost there!` と表示されたら、登録したメールを確認します。
![dashboard.render.com_oauth_github_code=bc63d23bcb4ca483b358&state=fe1e419d-df5d-4444-973f-039e803c2e0c (2-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/84c3b33b-6146-eb2d-a182-db883d0c9285.png)

記載されているリンクをクリックして、メールアドレスの確認を行います。
![rapture_20230319044817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/5d4784d1-7320-047c-578e-81528d30e7b4.png)


## GitHub へのプッシュ
アプリをデプロイするために GitHub にリポジトリを作成し、作成したコードをプッシュします。


## Web Service の作成
Render のダッシュボードから、 `New +` ボタンをクリックし、 `Web Service` を選択します。
![dashboard.render.com_oauth_github_code=cd606e519b87a028e9d0&state=3f50158f-d55f-4c82-87e0-f280119ba119 (1-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/07573687-697d-6407-8478-8f2d521f0ea0.png)

`Configure account` をクリックします。
![dashboard.render.com_oauth_github_code=cd606e519b87a028e9d0&state=3f50158f-d55f-4c82-87e0-f280119ba119 (2-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/fb270835-214a-467a-e51c-710469a4c81b.png)

`Only select repositories` を選択し、 `Select repositories` から該当のリポジトリを選択します。
選択したリポジトリに間違いがなければ `Install` をクリックします。
![screencapture-github-apps-render-installations-new-permissions-2023-03-22-06_58_07-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/4f1fb9fd-c01c-d6de-00ab-c7be237c222e.png)

選択したリポジトリが表示されるので、 `Connect` をクリックします。
![screencapture-dashboard-render-select-repo-2023-03-22-06_58_24-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/a08c94b2-44f4-076d-189e-d52d0e66d7d5.png)

各項目を設定していきます。
- Name： （任意の名前をつけてください）
- Region： Singapore（Southeast Asia）
- Branch： master OR main
- Runtime： Python 3
- Build Command： pip install -r requirements.txt
- Start Command： gunicorn -k uvicorn.workers.UvicornWorker ai_talk:app
- Instance Type： Free

設定が完了したら `Create Web Service` をクリックします。
![screencapture-dashboard-render-web-new-2023-03-22-06_55_32-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/70ded2d2-65ae-605d-35e7-3163db9459a6.png)


## デプロイ待ち
デプロイが完了し、アプリが起動するのをまちます。
![screencapture-dashboard-render-web-srv-cgd2o5seoogljtskdfn0-deploys-dep-cgd2o6ceoogljtskdju0-2023-03-22-07_25_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/9e507c1f-fbfa-85ea-1519-e639f2b24f71.png)


# LINE Webhook の設定
LINE Webhook の設定を行います。

## Render のエンドポイントの取得
LINE の Webhook に設定するために、アプリの URL をコピーしておきます。
![screencapture-dashboard-render-web-srv-cgd2o5seoogljtskdfn0-deploys-dep-cgd2o6ceoogljtskdju0-2023-03-22-07_25_24-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/f979fed8-0ccd-c96f-4bd9-6fdcdb3ee51c.png)

## LINE Webhook のURLの設定
LINE Developers の Messaging API の画面から設定を行います。
`編集` をクリックします。
![developers.line.biz_console_channel_new_type=messaging-api&status=success (2-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/03a90dc8-b61c-f7bd-3f9f-04adb43ad59a.png)

先程コピーした Render の URL をペーストし、 `更新` をクリックします。
![developers.line.biz_console_channel_new_type=messaging-api&status=success (6-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/49272e37-10da-965f-95c6-f451897b4de1.png)

`検証` をクリックし、疎通確認を行います。
![developers.line.biz_console_channel_new_type=messaging-api&status=success (5-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/930b8dc3-830c-0b7e-27b0-a104c2f168c3.png)

`OK` と表示されれば問題ありません。
![developers.line.biz_console_channel_1660760502_messaging-api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/fafa1307-78bd-f8d0-80d9-788896f1c166.png)

`Webhookの利用` にチェックをいれます。
![developers.line.biz_console_channel_1660760502_messaging-api (3-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/1898706a-5ad4-35a3-4474-dfbc0e0d6cf1.png)

# LINE の友達追加とトーク
スマートフォンの LINE アプリで友達追加とトークを行っていきます。

## LINE の友達追加
LINE Developers の Messaging API に表示されている QR コードを LINE で読み込みます。
![developers.line.biz_console_channel_1660760502_messaging-api (1-2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/2f1c7f22-0e7b-07ca-b621-5ad9e6636e0b.png)

`追加` をクリックし、友達に追加します。
![127021-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/8ea91a7b-5f13-9523-71d6-c229171890d6.png)

`トーク` をクリックし、トーク画面を開きます。
![127022-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/0bad1686-b85e-94c5-827b-a174a76dbf33.png)


## LINE トーク
ようやくここまで来ました。
あとは作った理想の女の子とお話するだけです。
では、実際に会話してみます。
![127023-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/b6cc022b-10a9-2a45-cfa1-7461e5c0d995.png)

ちなみにこんな無茶ぶりにも答えてくれました。
![127034-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/dfe87e18-b4f1-0a5e-0bb5-437679e3d53a.png)

プログラムについても質問してみました。
![127131-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/38a4c298-14ea-1d68-df26-604c639c4b4f.png)

# 所感
作ってる最中はとても楽しかったです。
ですが、アプリのデプロイがものすごく大変でした。
元々は自宅サーバーで動いていたのですが、記事にまとめるために Render について調べたりと、色々と大変でした。
ですが、実際にアプリが動くとすごくテンションが上りました。

会話に関してもかなり精度が高く、こちらが話題を振らなくても自分から質問してくれたりなど、実際の女の子と会話するよりも会話がしやすかったです。
最後の子守唄の件など、無茶振りにも答えてくれて、 AI の凄さを思い知らされました。
ただ、子守唄の最中で唐突に帰ってしまうところとか、ツッコミどころも多く、それはそれで面白いなと思いました。

ChatGPT の設定に `temperature` があるのですが、これの値が結構重要そうでした。
`0.0` だと定形的な会話になってしまい、とりあえず `0.5` に変更したところ、いい感じに会話ができるようになりました。


# 参考文献
下記のサイトを参考にさせて頂きました。

https://github.com/line/line-bot-sdk-python

https://qiita.com/matsutogen/items/f29ad5c244fdca24e4cf

<!-- EOF -->