公式LINEアカウントにChatGPTによる返信機能を付ける!
ChatGPTの登場によって自然な文章を自動で生成することができるようになりました。
そうなるとチャットボットサービスとして活用したいと思われる方も出てくると思います。
今回は公式LINEでChatGPT機能を活用した自動返信を試してみました!ぜひお試しを!
セットアップ
サーバーにはHerokuを用いるので、GitとHeroku CLIをインストールします。
まずはHerokuに登録します。
Herokuはアプリケーションを実行するインターネット付きの環境を用意してくれます。自分のPCで実行したアプリケーションはそのPCを閉じてしまうと停止してしまいますが、Herokuでアプリケーションを実行させておけば、ずっと実行し続けてくれます。
gitのインストール
Heroku CLIのインストール
コンソールからHerokuにログインし、続けて今回のアプリケーションを作成します。アプリ名は任意の名称でよいです。
heroku login
heroku create アプリ名
ChatGPTAPIの設定
ChatGPTAPI使用するために、ChatGPTに登録し、APIKeyを取得しておきます。 View API keysからAPI Keysにアクセスして、 SECRET KEYを取得します。
公式LINEの開設
LINE Business IDを開設して, Messaging APIに登録します.
Messaging APIに登録し, チャネルを追加すると, 自動的に公式LINEアカウントが開設されます.
チャネルアクセストークンの発行
webhookの設定
heroku open時のアドレス+/callbackを設定します。
“検証"ボタンで200が返ってくるか検証できます。
公式ラインの友達追加
QRコードから作成した公式LINEを追加します。
サーバーサイド
まずはローカル環境でPythonパッケージのインストールをします。
pip install openai
pip install line-bot-sdk
pip install flask
pip install gunicorn
Herokuのサーバーでもローカルと同様の開発環境構築ができるように、requirements.txtの作成します。
pip freeze > requirements.txt
API Keyやアクセストークンをソースコード中に記載するのを避けるため、環境変数としてHerokuのサーバーに保存します。
LINEのチャネルアクセストークン、
heroku config:set YOUR_OPENAI_API="YOUR_OPENAI_APIの文字列" --app アプリ名
heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの文字列" --app アプリ名
heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの文字列" --app アプリ名
適切にconfigを設定できたか、以下のコマンドで確認できます。
heroku config --app アプリ名
ngroku(Herokuサーバーの代替)
Herokuを使用する方は設定不要です。
Herokuでサブスクリプション契約を結びたくなく、一時的に試したいときはngrokを使用することも可能です。
ngrokの設定
ローカル開発環境で実行されているWebアプリケーションを外部に公開する
ngrokにサインアップ後, ngrokをダウンロードし, 解凍, config設定, サーバーの開始をさせます.
# decompress a file
tar -xzvf ngrok-v3-stable-linux-amd64.tgz
# Connect your account
ngrok config add-authtoken YOUR_TOKEN
# To start a HTTP tunnel forwarding to your local port 5000, run this next
ngrok http 5000
プログラム
Procfileの作成
サーバーでどのプログラムを実行するか指定します。
今回はapp.pyを実行するので、appを指定します。
web: gunicorn app:app --log-file=-
app.pyの作成
公式LINEがメッセージを受信すると、webhookし、このプログラムのcallback関数を実行させます。
callback関数中では公式LINEが受信したメッセージに対する返信をChatGPTが考え、返信してくれるようになっています。
from flask import Flask, request, abort
import openai
import os
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
app = Flask(__name__)
#環境変数取得
openai.api_key = os.environ["YOUR_OPENAI_API"]
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)
@app.route("/")
def hello_world():
return "hello world!"
@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
# ユーザーからのメッセージを取得
user_message = event.message.text
# OpenAIのGPT-4を使ってユーザーからのメッセージに返答を生成
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": user_message},
],
)
# OpenAIからの返答を取得
gpt_response = response['choices'][0]['message']['content']
# メッセージを返送
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=gpt_response))
if __name__ == "__main__":
# app.run()
port = int(os.getenv("PORT"))
app.run(host="0.0.0.0", port=port)
callback():
この関数は, LINE Messaging APIからのPOSTリクエストを処理します.
これは, @app.route(“/callback", methods=['POST’])というデコレータで指定されたURLとHTTPメソッドによって決定されます.
つまり, “/callback"のURLにPOSTメソッドでリクエストが来た場合に, この関数が実行されます.
この関数は, LINE Messaging APIから送られてきた署名を検証し, リクエストのボディを取得します.
その後, handler.handle(body, signature)によりメッセージの処理が行われます.
handle_message(event):
handler.add(MessageEvent, message=TextMessage)というデコレータによって, MessageEventというLINEメッセージイベントがトリガーされたときにこの関数が実行されます.
この関数は, ユーザーから送られてきたメッセージを受け取り, そのメッセージに対する応答を生成します.
具体的には, openai.ChatCompletion.createを用いてOpenAIのGPT-4にメッセージを送り, その返答を取得します. そして, その返答をLINE botがユーザーに送るメッセージとして使用します.
ソースコードが作成できたら、Herokuにそれをpushしましょう。
git init
git add .
git commit -m "commit comments"
git push heroku master
ここまでの設定が適切に行えていれば、アプリケーションが実行され、公式LINEにメッセージを送ると、返事が返ってくるようになります。
おわりに
今回は公式LINEでの自動返信機能を試してみました。実際に使用する場合はさらに、禁止ワードの指定、使用回数限界設定やより専門に特化するようにプロンプト設定やLlamaIndexの使用が必要になってくると思います。