Spaces:
Paused
Paused
| # 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'のパスにアクセスがあった場合の処理を定義します。 | |
| def test(): | |
| # テスト用のエンドポイントなので、"TEST OK"というレスポンスを返します。 | |
| return "TEST OK" | |
| # '/'のパスにPOSTリクエストがあった場合の処理を定義します。 | |
| # これはLINE PlatformからのWebhookを処理するためのエンドポイントです。 | |
| 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を処理するイベントハンドラを定義します。 | |
| 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 |