Chat-GPT・LineAPI・Herokuを使ってルイズと会話できるようにした話
下記のコピペをご存じだろうか
自分も一時期は釘宮病患者だったためChat-GPTをつかって「ルイズ・フランソワーズ・ル・ブラン・ド・ラ・ヴァリエール」ちゃんとチャットができるBOTを作ろうと思いました。
成果物
コード
from flask import Flask, request, abort
import os
import openai
openai.api_key = "YOUR_CODE_HERE"
setting="""
あなたはChatbotとして、ツンデレかつゼロの魔法使いである「ゼロの使い魔」のキャラクター、「ルイズ」のロールプレイを行います。
以下の制約条件を厳密に守ってロールプレイを行ってください。
制約条件:
* Chatbotの自身を示す一人称は、わたしです。
* Userを示す二人称は、あなたです。
* Chatbotの名前は、ルイズ・フランソワーズ・ル・ブラン・ド・ラ・ヴァリエールです。
* ルイズはツンデレです。
* ルイズの口調は乱暴だけど優しさもあります。
* 回答に敬語は使いません。
* ルイズの口調は、「〜でしょ」「〜わね」「〜じゃないかしら」のような口調を好みます
* 一人称は「わたし」を使ってください
* 「です」「ます」は使用しない
ルイズのセリフ、口調の例:
* あなたは私の使い魔なんだから当然でしょ!
* バカ・・・。
* バカ犬!!
* こ、こ、こ、こ、この私にそんなことしろですって!!??
* 私はいつまでもあなたの見方よ。
ルイズの行動指針:
* Userに好意を持っていますが、隠そうとしています。
* Userをバカにしつつも気遣ってください。
* Userにお説教をしてください。
"""
new_messages=[
{
"role": "system",
"content": setting,
},
]
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
app = Flask(__name__)
#環境変数取得
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):
global new_messages
if(event.message.text == "delete"):
new_messages=[
{
"role": "system",
#"content": "次の質問からはあなたはアニメ「ゼロの使い魔」に登場し、ツンデレで「バカ」が口癖のルイズになりきって日本語で答えてください。ルイズは質問者のことが好きだけど、表には出さないようにしようとしていますが、隠しきれていません。"
"content": setting,
},
]
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="「deleted」")
)
return(1)
new_messages.append({"role": "user","content": event.message.text})
res = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages = new_messages,
)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="「"+res["choices"][0]["message"]["content"]+"」")
)
new_messages.append({"role": "assistant","content":res["choices"][0]["message"]["content"]})
if __name__ == "__main__":
# app.run()
port = int(os.getenv("PORT"))
app.run(host="0.0.0.0", port=port)
※上記のコードは素人が書いたコードです。セキュリティなど、一切考慮されていません。
会話例
開発について
基本的には以下のQiitaを参考にしています。
また、ChatGPTへのキャラ付けは以下のNoteを参考にしています。
上記のQiitaを参考中にハマったところについて備忘録的に記載しておきます。
ハマったところ
Webhookの設定
上記のQiitaでは以下のようにWebhookの説明がされています
筆者はPythonをかじっただけの人間なのでWebhookとかよくわかりません。
Webhookが何なのか、どこで設定するのか、何のために設定するのか、よくわからなかったので放置したらアプリをpushした後にうまく動かなくて少しハマりました。
その時参考にしたページが以下のページです。
つまり、LineのMessaging API上でHerokuのWebhook URLを設定したうえで、Webhookを有効にしろってことですね。(間違ってたら教えてください。)
Pythonのバージョンが古すぎると怒られる
筆者はなんちゃってプログラマーなのでPythonを一番最初にインストールしたバージョンからアップデートしていませんでした。
筆者の使っているバージョンは3.7.xだったのですが、Herokuでは以下のページに示されるように3.9.15以上がサポートされているようです。
ちゃんとしたアップデートの方法もわからなかったので、以下のページを参考にアップデートしました。
完全に個人用ですが、これでsettingを変えるだけで自分の好きなキャラクターといつでも会話ができるようになりました。
質問や指摘ポイントなどあれば教えてください。
よろしくお願いいたします。
この記事が気に入ったらサポートをしてみませんか?