見出し画像

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公式アカウントをはじめる へ移動


アカウントを作成 をぽちっと


LINEアカウントで登録 または メールアドレスで登録します

今回はメールアドレスで登録します
メールアドレスを送付→登録用リンクが送られてくる
→ユーザー名やパスワードなど必要事項記入
な感じの流れで登録できます

登録できました! サービスに移動 をぽちっと


各種情報入力していきます


作成されました! 緑のボタンに飛びます (雑な説明)


LINE Official Account Manager画面はこんな感じです
画像では隠していますが、「※LINEID」と記載している箇所にID表記されているはずです
この時点からLINEで友達登録も可能、トークも可能です


こんな感じ


デフォルトでは自動応答が入っておりchatGPT実装においてはOFFする必要があるので、以降に記載します

LINE Bot(=公式アカウント)設定

Line Official Account Managerでの設定


タブの「チャット」から応答設定に移動します

初期設定

チャットを ON
あいさつメッセージ を OFF
にします
あいさつメッセージOFFはお好みで
すると以下の感じになります

次に、応答設定の下 Messaging APIの設定にはいります

Messaging APIを利用する をぽちー

必要情報入力、規約確認など実施すると完了します
Channel secretは後程使うので覚えておきます

次に、LINE Developersの設定に移動します
上記の その他設定は LINE Develpoers から行えます の部分から移動できます

LINE Developersでの設定

右上をぽちっと そしてLINE Develpoersコンソールへ移動


作成したプロバイダーをぽちっと 私の場合は える です


チャネルをぽちっと こちらも える です


チャネル設定のMessaginAPI設定タブに移動します

そして、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での実装

検索すると出てくるのはこちらが多いですかね
ただ私がよくわからないので…
多分省略




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