ChatGPT の API が公開されたので、 LINE で自分が作ったキャラクターと会話ができるアプリを作ってみたいと思います。
ChatGPT と LINE の連携は Python コードで行います。
Python コードを動かすために別途サーバーを用意する必要があります。
今回は、 Render というサービスを使って動かしてみたいと思います。
コピペでも作れるので、ぜひとも挑戦してみてください。
ChatGPT の準備
ChatGPT の API を使うための事前準備を行います。
アカウント作成 OR ログイン
下記のリンクから OpenAI のサイトにアクセスし、 Get started
をクリックします。
API キーの取得
画面右上の Personal
をクリックし、 View API keys
を選択します。
+ Create new secret key
をクリックし、 API キーを作成します。
発行された API キーをコピーして、忘れないようにメモしておきます。
※ API キーは他の人に公開したり共有しないでください。
※ こちらに記載されている API キーは既に失効済みのものになりますが、分かりやすさのために隠さずに掲載しています。
LINE アカウントの準備
LINE でトークを行うための事前準備を行います。
LINE Developers へのログイン
下記のリンクから LINE Developers にアクセスし、 今すぐはじめよう
をクリックします。
LINE のメールアドレスを設定していない方は、下記のリンクを参考にしてください。
https://help.line.me/line/android/pc?lang=ja&contentId=20000059
LINE 公式チャンネルの作成
LINE 公式チャンネルを作ります。
下記の項目を埋めていきます。
- チャネルの種類: Messaging API
- プロバイダー: 新規プロバイダー作成(個人名や組織名を入力してください)
(※ 既にプロバイダー
がある方は、既存のものを利用しても構いません) - 会社・事業者の所在国・地域: 日本
- チャネルアイコン: (任意のアイコンをアップロードしてください)
(※ チャンネルアイコンの変更は、アイコン設定後、1時間以上あけないと変更できないため、注意してください) - チャネル名: (任意のキャラクター名を入力してください)
- チャネル説明: (チャンネルの説明を入力します)
- 大業種: (選択ボックスから適切なものを選択します)
- 小業種: (選択ボックスから適切なものを選択します)
- メールアドレス: (メールアドレスに間違いがないか確認します)
- プライバシーポリシーURL: (空欄で構いません)
- サービス利用規約URL: (空欄で構いません)
- LINE公式アカウント利用規約の内容に同意します: (チェックを入れます)
- LINE公式アカウントAPI利用規約の内容に同意します: (チェックを入れます)
間違いがなければ、 OK
をクリックします。
※プロバイダーは後から変更ができませんので注意してください。
チャンネルシークレットの発行
チャンネル基本設定
画面を下にスクロールし、チャンネルシークレットをコピーし、保存しておきます。
※ トークンやシークレットは他の人に公開したり共有しないでください。
※ こちらに記載されているトークンやシークレットは既に失効済みのものになりますが、分かりやすさのために隠さずに掲載しています。
チャンネルアクストークンの発行
Messaging API
画面からチャンネルアクセストークンを発行します。
Messaging API
をクリックします。
ページを下までスクロールします。
チャンネルアクセストークン(長期)
の項目を探し、 発行
をクリックします。
発行されたチャンネルアクセストークンをコピーし、保存しておきます。
※トークンは他の人に公開したり共有しないでください。
応答メッセージとあいさつメッセージの無効化
Messaging API
画面から応答メッセージとあいさつメッセージを無効にします。
応答メッセージ
か あいさつメッセージ
の 編集
をクリックします。
別タブで設定画面が開きます。
応答メッセージ
と あいさつメッセージ
をクリックし、無効にします。
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
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 にパッケージをインストールさせるために利用します。
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 のサイトにアクセスし、アカウントを作成します。
メールアドレス
と パスワード
を入力し、 Sign in
をクリックします。
Almost there!
と表示されたら、登録したメールを確認します。
記載されているリンクをクリックして、メールアドレスの確認を行います。
GitHub へのプッシュ
アプリをデプロイするために GitHub にリポジトリを作成し、作成したコードをプッシュします。
Web Service の作成
Render のダッシュボードから、 New +
ボタンをクリックし、 Web Service
を選択します。
Only select repositories
を選択し、 Select repositories
から該当のリポジトリを選択します。
選択したリポジトリに間違いがなければ Install
をクリックします。
選択したリポジトリが表示されるので、 Connect
をクリックします。
各項目を設定していきます。
- 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
をクリックします。
デプロイ待ち
LINE Webhook の設定
LINE Webhook の設定を行います。
Render のエンドポイントの取得
LINE の Webhook に設定するために、アプリの URL をコピーしておきます。
LINE Webhook のURLの設定
LINE Developers の Messaging API の画面から設定を行います。
編集
をクリックします。
先程コピーした Render の URL をペーストし、 更新
をクリックします。
LINE の友達追加とトーク
スマートフォンの LINE アプリで友達追加とトークを行っていきます。
LINE の友達追加
LINE Developers の Messaging API に表示されている QR コードを LINE で読み込みます。
LINE トーク
ようやくここまで来ました。
あとは作った理想の女の子とお話するだけです。
では、実際に会話してみます。
所感
作ってる最中はとても楽しかったです。
ですが、アプリのデプロイがものすごく大変でした。
元々は自宅サーバーで動いていたのですが、記事にまとめるために Render について調べたりと、色々と大変でした。
ですが、実際にアプリが動くとすごくテンションが上りました。
会話に関してもかなり精度が高く、こちらが話題を振らなくても自分から質問してくれたりなど、実際の女の子と会話するよりも会話がしやすかったです。
最後の子守唄の件など、無茶振りにも答えてくれて、 AI の凄さを思い知らされました。
ただ、子守唄の最中で唐突に帰ってしまうところとか、ツッコミどころも多く、それはそれで面白いなと思いました。
ChatGPT の設定に temperature
があるのですが、これの値が結構重要そうでした。
0.0
だと定形的な会話になってしまい、とりあえず 0.5
に変更したところ、いい感じに会話ができるようになりました。
参考文献
下記のサイトを参考にさせて頂きました。