見出し画像

Chat-GPT・LineAPI・Herokuを使ってルイズと会話できるようにした話

下記のコピペをご存じだろうか

ルイズ!ルイズ!ルイズ!ルイズぅぅうううわぁああああああああああああああああああああああん!!!
あぁああああ…ああ…あっあっー!あぁああああああ!!!ルイズルイズルイズぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!
小説12巻のルイズたんかわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!
アニメ2期放送されて良かったねルイズたん!あぁあああああ!かわいい!ルイズたん!かわいい!あっああぁああ!
コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!
ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら…
ル イ ズ ち ゃ ん は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!
そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ハルケギニアぁああああ!!
この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のルイズちゃんが僕を見てる?
表紙絵のルイズちゃんが僕を見てるぞ!ルイズちゃんが僕を見てるぞ!挿絵のルイズちゃんが僕を見てるぞ!!
アニメのルイズちゃんが僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!
いやっほぉおおおおおおお!!!僕にはルイズちゃんがいる!!やったよケティ!!ひとりでできるもん!!!
あ、コミックのルイズちゃああああああああああああああん!!いやぁあああああああああああああああ!!!!
あっあんああっああんあアン様ぁあ!!シ、シエスター!!アンリエッタぁああああああ!!!タバサァぁあああ!!
ううっうぅうう!!俺の想いよルイズへ届け!!ハルゲニアのルイズへ届け!

自分も一時期は釘宮病患者だったため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の説明がされています

管理画面からWebhookの設定をします。

Webhook送信:利用する

Webhook URL:https://<自分のアプリケーション名>.herokuapp.com/callback

接続確認が表示されれば完了です。

筆者はPythonをかじっただけの人間なのでWebhookとかよくわかりません。
Webhookが何なのか、どこで設定するのか、何のために設定するのか、よくわからなかったので放置したらアプリをpushした後にうまく動かなくて少しハマりました。
その時参考にしたページが以下のページです。

つまり、LineのMessaging API上でHerokuのWebhook URLを設定したうえで、Webhookを有効にしろってことですね。(間違ってたら教えてください。)

Pythonのバージョンが古すぎると怒られる

筆者はなんちゃってプログラマーなのでPythonを一番最初にインストールしたバージョンからアップデートしていませんでした。
筆者の使っているバージョンは3.7.xだったのですが、Herokuでは以下のページに示されるように3.9.15以上がサポートされているようです。

ちゃんとしたアップデートの方法もわからなかったので、以下のページを参考にアップデートしました。

完全に個人用ですが、これでsettingを変えるだけで自分の好きなキャラクターといつでも会話ができるようになりました。
質問や指摘ポイントなどあれば教えてください。

よろしくお願いいたします。

この記事が気に入ったらサポートをしてみませんか?