私がChatGPTを用いた開発を始めて、最初に作成したChatGPT APIを用いたLINE botをAWSのインスタンスに移してみました、
自己署名だとLINEがwebhook URLを認めてくれないので、今回もngrockを使用しました。
使用しているAWSのインスタンスのインスタンスイメージはubuntuです。
手順は、インスタンス上でChatGPT APIを用いたLINE botを実行中にするだけです。
インスタンス上でChatGPT APIを用いたLINE botを実行中にする
まず、インスタンスにSSH接続します。
インスタンスのコンソールが開いたら以下をインストールします。
aptのアップデート
sudo apt update
pipのインストール
sudo apt install python3-pip
LINEのインストール
sudo pip install line-bot-sdk
ngrokのインストール
sudo pip install pyngrok
flaskのインストール
sudo pip install flask
openaiのインストール
sudo pip install openai
次にpythonのファイルを保存するディレクトリを作成します。
mkdir ディレクトリ名
作成したディレクトリに移動します。
cd ディレクトリ名
作成したディレクトリでファイルを作成します。
nano ファイル名
作成したファイルの中に下記のbotのコードを入れて、ctrl oでファイルを保存して、ctrl xでファイルを閉じます。
※LINE、ngrok、openaiのキーやトークンをコードに入れてください。これらの取得については、こちらを参考にしてください。
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, ImageSendMessage,
)
import os
from pyngrok import ngrok
from pyngrok.conf import PyngrokConfig
import openai
# LINEのチャネルシークレット
LINE_CHANNEL_SECRET = ''
# LINEのチャネルアクセストークン
LINE_ACCESS_TOKEN = ''
# ngrokのAuthtoken
NGROK_AUTHTOKEN = ''
# openaiのキー
openai.api_key = ""
# URLの生成
ngrok.set_auth_token(NGROK_AUTHTOKEN)
os.system('kill -9 $(pgrep ngrok)')
https_tunnel = ngrok.connect(addr='127.0.0.1:5000',bind_tls=True)
print(https_tunnel)
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'
assist1 = "" # 初期化
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
global assist1 # assist1をグローバル変数にする
text = event.message.text
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "任意の設定"},
{"role": "assistant", "content": assist1},
{"role": "user", "content": text},
]
)
assist1 = response["choices"][0]["message"]["content"] # assist1を更新
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=response["choices"][0]["message"]["content"]),
)
if __name__ == '__main__':
app.run()
一度、上手くファイルが作成されているか下記のコマンドで確認します。
find ~
上手くファイルが作成されていたら、screenを作成します。
screen -S スクリーン名
ルート権限で、screen内でpythonで作成したファイルを実行します。
sudo python3 ファイル名.py
実行したら、生成されたURLを取得して、LINE Developers のダッシュボードにwebhook URLを設定します。(詳しくは、こちらを参考にしてください。)
※稀にエラーが発生します。エラーが発生した場合、エラー処理して頂くか、インスタンスを再起動してください。
webhook URLを設定後、LINE Developersで検証を押します。
成功と表示されたら、上手く接続出来ています。
ここまで出来たら、LINE botを友達登録して話しかけてみてください。
botから返答があれば、成功です!
最後に
慣れてくるとこの手のAWSインスタンスへの移行も簡単に行えますね。
ただ、screenだとインスタンスを再起動すると停止してしまうので、他のやり方に変更してみようかなと最近思っています。
また何か作ってみます。