3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初めに

  • このプロジェクトは、Python・Flask・Hugging Face Transformersライブラリを使って構築されたシンプルなチャットボットAPIです。
  • GPT-2モデルを使用して、ユーザーのメッセージに対して自動で返信を生成します。
  • PT-2はやや古いモデルで、対応言語は英語のみですが、処理が軽く、PCでも素早く動作するというメリットがあります。そのため、Pythonの学習用途として利用するにはちょうど良いと考え、今回このモデルを採用しました。

主な機能

  • Flaskで構築されたREST API
  • GPT-2を使った自然言語生成
  • CORS対応(他のドメインからもアクセス可能)
  • CPU環境で動作(GPU不要)
  • 応答生成のパラメータ調整可能(top_p、top_k、temperatureなど)

image.png

動作環境

  • Python 3.8以上
  • pip パッケージマネージャー

必要なPythonライブラリ

以下のコマンドで依存パッケージをインストールします:

pip install flask flask-cors transformers torch

ファイル構成

chatbot/
├── app.py         # Flask アプリ本体
└── README.md      # この説明ファイル

実行方法

    1. ライブラリのインストール
pip install flask flask-cors transformers torch
    1. Flaskサーバーの起動
# ドライブ直下に移動する
cd C:*****************\ai-chat-backend
# 仮想環境を作る
python -m venv venv 
# 仮想環境を有効化する
venv\Scripts\activate
# サーバー起動
python app.py

起動後、http://localhost:5000 でAPIが使用可能になります。

APIの使い方

    1. エンドポイント
POST /chat
    1. リクエストヘッダー
Content-Type: application/json
    1. リクエストボディの例
{
  "message": "hello"
}
    1. レスポンスボディの例
{
  "reply": "hello, I am fine..."
}

cmdで実行例

  • リクエスト
curl -X POST http://localhost:5000/chat -H "Content-Type: application/json" -d "{\"message\":\"hello\"}"
  • レスポンス
{
  "reply": "Hello! I'm a robot. AI is not the same as human, so let's get going on this one...Hello there (laughs). You can see that you"
}

## APIの使い方
```python
outputs = model.generate(
    input_ids,
    max_length=50,
    do_sample=True,
    top_p=0.8,
    top_k=30,
    temperature=0.7,
    no_repeat_ngram_size=2,
    early_stopping=True
)

top_p, top_k, temperature などを変更することで、出力の自然さや多様性を調整できます。

app.py ソースコード説明

from flask import Flask, request, jsonify
from flask_cors import CORS
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

app = Flask(__name__)
CORS(app)  # ここでCORS対応

model_name = "gpt2"  # GPT-2モデルを指定

# モデルとトークナイザーの準備
# GPT-2のモデルとトークナイザーをロード。
# to("cpu") により、GPUがない環境でも動くようにCPUで推論。
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
model = model.to("cpu")  # CPUで動かす場合

@app.route("/chat", methods=["POST", "OPTION"])
def chat():
    user_input = request.json.get("message", "")
    prompt = f"User: {user_input}\nAI:"
    # トークナイズしてモデルに渡す
    inputs = tokenizer(prompt, return_tensors="pt") # 入力をトークンに変換。
    inputs = {k: v.to(model.device) for k, v in inputs.items()}  # モデルのデバイス(この場合はCPU)に移動。
    # テキスト生成
    with torch.no_grad():
        outputs = model.generate(
            inputs["input_ids"],
            max_length=40,
            do_sample=True,
            top_p=0.8,
            top_k=30,
            temperature=0.7,
            no_repeat_ngram_size=2,
            repetition_penalty=1.2,
            early_stopping=True
        )
    # 出力トークンをテキストに変換。
    reply = tokenizer.decode(outputs[0], skip_special_tokens=True)
    # プロンプト部分を削除し、AIの返答だけを取り出す。
    reply = reply.replace(prompt, "").strip()

    return jsonify({"reply": reply})

# このPythonファイルを直接実行したときに、Flaskサーバーを起動。
if __name__ == "__main__":
    app.run(debug=True)

注意事項

  • gpt2 は英語モデルなので、日本語には適していません。
    日本語対応モデル(例:rinna/japanese-gpt-1b や ELYZA-japanese-Llama-2-7b-instruct)を使用することで、より自然な応答になります。

  • CPU環境では処理が重くなる場合があります。可能であればGPU環境を推奨します。

github リンク

ご指摘等ございましたら、ぜひコメントいただけたら嬉しいです!

3
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?