LINE bot with chatGPT 作成日記
前置き
以下を参考にLINE公式アカウント作成しつつ、
LINE BOTの作り方~アカウントの作成とQ&Aの登録方法~ (first-contact.jp)
以下の「Discord botコード:短期記憶」を参考に、ChatGPTを組み込みます
Discord bot with chatGPT 作成日記|える|note
ーえるさんの日記ー
ー完ー
…とか書くと相変わらずnoteにならないので、以下は実際に作ってみたやつです❢
LINE公式アカウントを作成
LINE for Business|LINEが提供する法人向けサービス (linebiz.com)
からアカウントを作っていきます
今回はメールアドレスで登録します
メールアドレスを送付→登録用リンクが送られてくる
→ユーザー名やパスワードなど必要事項記入
な感じの流れで登録できます
LINE Official Account Manager画面はこんな感じです
画像では隠していますが、「※LINEID」と記載している箇所にID表記されているはずです
この時点からLINEで友達登録も可能、トークも可能です
デフォルトでは自動応答が入っておりchatGPT実装においてはOFFする必要があるので、以降に記載します
LINE Bot(=公式アカウント)設定
Line Official Account Managerでの設定
タブの「チャット」から応答設定に移動します
チャットを ON
あいさつメッセージ を OFF
にします
あいさつメッセージOFFはお好みで
すると以下の感じになります
次に、応答設定の下 Messaging APIの設定にはいります
必要情報入力、規約確認など実施すると完了します
Channel secretは後程使うので覚えておきます
次に、LINE Developersの設定に移動します
上記の その他設定は LINE Develpoers から行えます の部分から移動できます
LINE Developersでの設定
そして、MessagingAPI設定の下の方にあるチャネルアクセストークンを発行します
こちらも後ほど使うので覚えておきます
LINE Botコード: chatGPT with 短期記憶
事前準備①:ngrok
ngrokのAuthtokenを入手しておきます
ngrok - Online in One Line
ColabでAIイラスト生成をしている方は持っているケースも多いので詳細は省略
事前準備②:OpenAIのAPI Key
※とりあえず省略
事前準備③:LINEチャネルシークレット
Line Official Account Manager設定で覚えておいたものを使います
事前準備④:LINEチャネルアクセストークン
LINE Developers設定で覚えておいたものを使います
Colabでの実装
Colabでのbot実装は再稼働が手間なのですが、まあ動作は可能なので良いかなと思っています
1) インストール
!pip install openai
!pip install langchain
!pip install tiktoken
!pip install flask
!pip install line-bot-sdk
!pip install pyngrok
2) 事前準備物を入力
import os
# LINEのチャネルシークレット
LINE_CHANNEL_SECRET = 'ここに入力'
# LINEのチャネルアクセストークン
LINE_ACCESS_TOKEN = 'ここに入力'
# ngrokのAuthtoken
NGROK_AUTHTOKEN = 'ここに入力'
# OpenAI
openai_apikey = "ここに入力"
os.environ['OPENAI_API_KEY'] = openai_apikey
3) NgrokTunnelアドレスの生成
!ngrok authtoken $NGROK_AUTHTOKEN
import os
from pyngrok import ngrok
from pyngrok.conf import PyngrokConfig
os.system('kill -9 $(pgrep ngrok)')
webhook_url = ngrok.connect(addr='127.0.0.1:5000', pyngrok_config=PyngrokConfig(start_new_session=True))
print (webhook_url)
そして、生成されたアドレスをLINE DevelopersのMessaging API設定、Webhook URLに入力し、Webhookの利用をONにします
Webhook URLはTunnelアドレス生成のたびに更新する必要がありますので、Colab実行はここが手間だと思っています
4) 実行
Discord botの記述と異なり、Colabのセルにそのまま記載および実行可能です memory.txtは空ファイルで作っておきます
import os
import openai
from flask import Flask, request, abort
#langchain import
from langchain.prompts import (
ChatPromptTemplate,
MessagesPlaceholder,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.chains.conversation.memory import ConversationSummaryBufferMemory
#API seting
openai.api_key = os.environ['OPENAI_API_KEY']
#langchain initial
system_settings = """あなたはAIアシスタントです"""
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(system_settings),
MessagesPlaceholder(variable_name="history"),
HumanMessagePromptTemplate.from_template("{input}")
])
use_model = "gpt-3.5-turbo"
S_conversation = ConversationChain(
memory=ConversationSummaryBufferMemory(
return_messages=True,
llm=ChatOpenAI(model_name=use_model),
max_token_limit=500
),
prompt=prompt,
llm=ChatOpenAI(model_name=use_model),
verbose=True
)
# buffer load
f = open('memory.txt', 'r')
memory_text = f.read()
f.close()
S_conversation.predict(input=memory_text)
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, ImageSendMessage,
)
app = Flask(__name__)
line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)
@app.route("/test")
def test():
return "TEST OK"
@app.route("/", 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:
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
rep_text = S_conversation.predict(input=event.message.text)
S_memory_text = S_conversation.memory.load_memory_variables({})
Sf = open('memory.txt', 'w')
Sf.write(str(S_memory_text))
Sf.close()
line_bot_api.reply_message(
event.reply_token,
#TextSendMessage(text=event.message.text),
TextSendMessage(text=rep_text),
)
if __name__ == '__main__':
app.run()
できました❣
既読がつかないのは設定漏れ、、なのかな…?
GASでの実装
検索すると出てくるのはこちらが多いですかね
ただ私がよくわからないので…
多分省略
この記事が気に入ったらサポートをしてみませんか?