StreamlitLineBot / youri_bot.py
HALU-HAL's picture
add base app
ea8b9b3
# line_bot.py
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
from line_bot import LineBot # your_line_bot_fileは、LineBotクラスを含むファイルの名前です。
import torch
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM # your_model_libraryは、モデルクラスを含むライブラリの名前です。
# LineBot クラスを定義します。
# このクラスは、LINE Bot APIとのやり取りを管理するためのメソッドを含んでいます。
class YouriBot(LineBot):
# コンストラクタでは、LINE Bot APIとWebhookHandlerの初期化を行います。
def __init__(self, access_token, channel_secret):
# LineBotApiオブジェクトを作成し、LINEのアクセストークンを設定します。
self.line_bot_api = LineBotApi(access_token)
# WebhookHandlerオブジェクトを作成し、LINEのチャネルシークレットを設定します。
self.handler = WebhookHandler(channel_secret)
# トークナイザーとモデルの準備
self.tokenizer = AutoTokenizer.from_pretrained(
"rinna/youri-7b-chat-gptq"
)
self.model = AutoGPTQForCausalLM.from_quantized(
"rinna/youri-7b-chat-gptq",
device_map="auto",
use_safetensors=True
)
def generate_response(self, prompt):
# 推論の実行
token_ids = self.tokenizer.encode(
prompt,
add_special_tokens=False,
return_tensors="pt")
with torch.no_grad():
output_ids = self.model.generate(
input_ids=token_ids.to(self.model.device),
max_new_tokens=200,
do_sample=True,
temperature=0.5,
pad_token_id=self.tokenizer.pad_token_id,
bos_token_id=self.tokenizer.bos_token_id,
eos_token_id=self.tokenizer.eos_token_id
)
return self.tokenizer.decode(
output_ids[0][token_ids.size(1):],
skip_special_tokens=True
)
# Flaskアプリケーションを作成するメソッドです。
def create_app(self):
# Flaskのインスタンスを作成します。
app = Flask(__name__)
# '/test'のパスにアクセスがあった場合の処理を定義します。
@app.route("/test")
def test():
# テスト用のエンドポイントなので、"TEST OK"というレスポンスを返します。
return "TEST OK"
# '/'のパスにPOSTリクエストがあった場合の処理を定義します。
# これはLINE PlatformからのWebhookを処理するためのエンドポイントです。
@app.route("/", methods=['POST'])
def callback():
# LINE Platformからのリクエストに含まれる署名を取得します。
signature = request.headers['X-Line-Signature']
# リクエストの本体(body)をテキストとして取得します。
body = request.get_data(as_text=True)
# リクエストの内容をログに記録します。
app.logger.info("Request body: " + body)
# 署名を検証し、イベントハンドラを呼び出します。
try:
self.handler.handle(body, signature)
except InvalidSignatureError:
# 署名が無効な場合は、エラーメッセージを出力し、400エラーを返します。
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
# すべて正常に処理された場合は、'OK'のレスポンスを返します。
return 'OK'
# MessageEventとTextMessageを処理するイベントハンドラを定義します。
@self.handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
# 受信したメッセージの内容をログに出力します。
print("event.message.text:{}".format(event.message.text))
# ユーザーに送られたテキストメッセージと同じ内容で返信します。
prompt = f"設定: あなたの優秀なAIアシスタントです。\nユーザー: {event.message.text}\nシステム: "
print(f"prompt:{prompt}")
# AIによるレスポンス生成
response_text = self.generate_response(prompt)
print(f"response_text:{response_text}")
self.line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text),
)
# Flaskアプリケーションのインスタンスを返します。
return app