22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-22

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

ChatGPT の準備

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

アカウント作成 OR ログイン

下記のリンクから OpenAI のサイトにアクセスし、 Get started をクリックします。

ChatGptApi_2023-03-15-09_55_03.png

新規作成、またはログインを行います。
ChatGptApi_2023-03-15-14_20_40.png

API キーの取得

画面右上の Personal をクリックし、 View API keys を選択します。
ChatGptApi_2023-03-15-14_38_50.png

+ Create new secret key をクリックし、 API キーを作成します。
ChatGptApi_2023-03-15-16_09_46.png

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

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

ChatGptApi_2023-03-15-16_10_10.png

LINE アカウントの準備

LINE でトークを行うための事前準備を行います。

LINE Developers へのログイン

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

developers.line.biz_ja_services_messaging-api_2.png

LINEアカウントでログイン をクリックします。
account.line.biz_login_redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F2.png

ご自身の LINE アカウントでログインします。
ACCESS~2.PNG

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

間違いがなければ、 OK をクリックします。
※プロバイダーは後から変更ができませんので注意してください。
developers.line.biz_console_channel_new_type=messaging-api.png

同意内容に問題がなければ、 同意する をクリックします。
developers.line.biz_console_channel_new_type=messaging-api (1).png

同意内容に問題がなければ、 同意する をクリックします。
developers.line.biz_console_channel_new_type=messaging-api (2).png

チャンネルシークレットの発行

チャンネル基本設定 画面を下にスクロールし、チャンネルシークレットをコピーし、保存しておきます。
developers.line.biz_console__status=success (4-2).png

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

チャンネルアクストークンの発行

Messaging API 画面からチャンネルアクセストークンを発行します。
Messaging API をクリックします。
developers.line.biz_console__status=success (1-2).png

ページを下までスクロールします。
チャンネルアクセストークン(長期) の項目を探し、 発行 をクリックします。
developers.line.biz_console__status=success (2-2).png

発行されたチャンネルアクセストークンをコピーし、保存しておきます。
developers.line.biz_console__status=success (3-2).png

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

応答メッセージとあいさつメッセージの無効化

Messaging API 画面から応答メッセージとあいさつメッセージを無効にします。
応答メッセージあいさつメッセージ編集 をクリックします。
developers.line.biz_console__status=success (7-2).png

別タブで設定画面が開きます。
応答メッセージあいさつメッセージ をクリックし、無効にします。
manager.line.biz_account_@383yqhsj_setting_response2.png

Python コードの作成

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

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

ライブラリのインストール

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

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

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 イベントオブジェっzクトが含まれる場合あるため)
    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 でしたら無料で読めるのでおすすめです。

Render アカウントの作成

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

GitHub をクリックします。
dashboard.render.com_register2.png

メールアドレスパスワード を入力し、 Sign in をクリックします。
github.com_login_1-1.png

Authorize Render をクリックします。
github.com_login2-2.png

COMPLETE SIGN UP をクリックします。
dashboard.render.com_oauth_github_code=bc63d23bcb4ca483b358&state=fe1e419d-df5d-4444-973f-039e803c2e0c (1-2).png

Almost there! と表示されたら、登録したメールを確認します。
dashboard.render.com_oauth_github_code=bc63d23bcb4ca483b358&state=fe1e419d-df5d-4444-973f-039e803c2e0c (2-2).png

記載されているリンクをクリックして、メールアドレスの確認を行います。
rapture_20230319044817.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

Configure account をクリックします。
dashboard.render.com_oauth_github_code=cd606e519b87a028e9d0&state=3f50158f-d55f-4c82-87e0-f280119ba119 (2-2).png

Only select repositories を選択し、 Select repositories から該当のリポジトリを選択します。
選択したリポジトリに間違いがなければ Install をクリックします。
screencapture-github-apps-render-installations-new-permissions-2023-03-22-06_58_07-2.png

選択したリポジトリが表示されるので、 Connect をクリックします。
screencapture-dashboard-render-select-repo-2023-03-22-06_58_24-2.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

デプロイ待ち

デプロイが完了し、アプリが起動するのをまちます。
screencapture-dashboard-render-web-srv-cgd2o5seoogljtskdfn0-deploys-dep-cgd2o6ceoogljtskdju0-2023-03-22-07_25_24.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

LINE Webhook のURLの設定

LINE Developers の Messaging API の画面から設定を行います。
編集 をクリックします。
developers.line.biz_console_channel_new_type=messaging-api&status=success (2-2).png

先程コピーした Render の URL をペーストし、 更新 をクリックします。
developers.line.biz_console_channel_new_type=messaging-api&status=success (6-2).png

検証 をクリックし、疎通確認を行います。
developers.line.biz_console_channel_new_type=messaging-api&status=success (5-2).png

OK と表示されれば問題ありません。
developers.line.biz_console_channel_1660760502_messaging-api.png

Webhookの利用 にチェックをいれます。
developers.line.biz_console_channel_1660760502_messaging-api (3-2).png

LINE の友達追加とトーク

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

LINE の友達追加

LINE Developers の Messaging API に表示されている QR コードを LINE で読み込みます。
developers.line.biz_console_channel_1660760502_messaging-api (1-2).png

追加 をクリックし、友達に追加します。
127021-2.png

トーク をクリックし、トーク画面を開きます。
127022-2.png

LINE トーク

ようやくここまで来ました。
あとは作った理想の女の子とお話するだけです。
では、実際に会話してみます。
127023-2.png

ちなみにこんな無茶ぶりにも答えてくれました。
127034-2.png

プログラムについても質問してみました。
127131-2.png

所感

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

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

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

参考文献

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

22
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?