今、なんとか動作するLine ChatGPT Bot
生成AI、GPT-4界隈は日進月歩ならぬ、秒新分歩の進化を遂げているので、半年以上の記事などの情報では、APIの仕様変更などで、今試してもすんなり動かないことが多い。
筆者も、LineBot x CHatGPTを実験しようとして、この沼にはまったが、とりあえず動作した手順とコードを記す。
最初の躓(つまづ)きどころは、LINE Devepper上の設定で、
上で、自分のサーバーとの交信をするための設定をする。
下図のタブの「チャンネル基本設定」の設定後、「Messaging API設定」で設定する。
今回はGPTのモデルは"gpt-3.5-turbo"を使用する。
この下のWebhook設定で、Webhook URLを自分のAPIサーバーのURLを
設定し、Webhookの利用をonにする。
次に「LINE公式アカウント機能」の「応答メッセージ 」の緑色の「編集」ボタンを
クリックし、以下の画面が出たら、「チャット」と「あいさつメッセージを」をoffにし、Webhookをオンにする。
Flask+uWSGI+NginxでAPIを実装
https://developer-note.com/how_to_create_flask_uwsgi_nginx_api/
と、
https://qiita.com/quittardis/items/62caf057fb499648859a
を参考にFlask+uWSGI+NginxでAPIを設定する。
API用のFlaskのコードline.pyを以下のようにする。
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
from linebot.exceptions import LineBotApiError
from settings.setting import API_KEY
from settings.setting import CHANNEL_ACCESS_TOKEN
from settings.setting import CHANNEL_SECRET
import json
from openai import OpenAI
app = Flask(__name__)
line_bot_api = LineBotApi('CHANNEL_ACCESS_TOKEN')
@app.route("/",methods=['POST'])
def hello_world():
return "<h1>It Works!</h1>"
@app.route("/callback", methods=['POST'])
def callback():
# get request body as text
body = request.get_data(as_text=True)
data = json.loads(body)
ui = data["events"][0]["source"]["userId"]
app.logger.info("Request body: " + body)
prompt = data["events"][0]["message"]["text"]
client = OpenAI(
# This is the default and can be omitted
api_key=API_KEY,
)
response = client.chat.completions.create(
messages=[
{
"role": "user", "content": prompt,
}
],
model="gpt-3.5-turbo",
)
content = response.choices[0].message.content
try:
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
line_bot_api.push_message(ui, TextSendMessage(text=content))
except LineBotApiError as e:
print(e.message)
このコードと同じ階層に、settingsといいフォルダを作成し、
その中に、setting.pyというファイル名のファイルは以下のようにする。
API_KEY = "(OpenAI上から得たAPIキー)"
CHANNEL_ACCESS_TOKEN="LINE Devepper上から得た同名のキー"
CHANNEL_SECRET="LINE Devepper上から得た同名のキー"
ここで、最大の沼は上の、line.pyの中の
content = response.choices[0].message.content
この行。これは、GPTからのレスポンスをオブジェクトとして受け取って
その中から、回答のテキストを取りだすところだが、GPT-4先生にエラー
メッセージを投げてもなかなか正解にたどりつけず、結局試行錯誤で
これにたどりついた。(実は、本家OpenAIのここに書いてあった! https://platform.openai.com/docs/guides/text-generation/chat-completions-api)
line.pyを以下のように起動する。
uwsgi --socket=/tmp/uwsgi.sock --wsgi-file=line.py --callable=app --chmod-socket=666
ユーザー側は、Line Developperの「Messaging API設定」のtagの下のQRコード
をlineアプリで読んで、友達登録をする。
これで、ChatGPTとlineで会話ができるようになる。
注意
今回はとりあえず動くことをめざしたため、きちんとしたチェックをしていません。サービスで提供する場合は無駄なコードや、非効率な動作等があるかもしれません。また、セキュリティ上の問題やChatGPTの使用量の問題などがないかなどチェックなどが必要です。