1.1 FlaskまたはFastAPIを使ったAPIの基本設計
このセクションでは、Pythonフレームワークの Flask と FastAPI を使用して、LLM(大規模言語モデル)のAPIを設計・実装する方法を紹介します。基本的なAPIエンドポイントの作成から、リクエスト処理、エラーハンドリングまで、実践的な内容をカバーします。
ひとことで言うと
この節では、Python の FlaskとFastAPI を使い、LLM(大規模言語モデル)を呼び出す最小構成の API を、コード例と比較つきで実装します。
| 観点 | Flask | FastAPI |
|---|---|---|
| 実装のシンプルさ | ◎ | ○ |
| 非同期リクエスト | △ | ◎ |
| 入力バリデーション | 手書き | Pydanticで自動 |
| OpenAPI / Swagger UI | 拡張が必要 | 標準生成 |
| 想定ワークロード | 小〜中規模 | 中〜大規模/高並列 |
Flask版
from flask import Flask, request, jsonify
from transformers import pipeline
app = Flask(__name__)
llm = pipeline("text-generation", model="gpt2")
@app.route("/predict", methods=["POST"])
def predict():
data = request.json
input_text = data.get("text", "")
if not input_text:
return jsonify({"error": "Input text is required"}), 400
try:
result = llm(input_text, max_length=50, num_return_sequences=1)
return jsonify({"output": result[0]["generated_text"]})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
FastAPI版
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from transformers import pipeline
app = FastAPI()
llm = pipeline("text-generation", model="gpt2")
class InputText(BaseModel):
text: str
@app.post("/predict")
async def predict(input_data: InputText):
input_text = input_data.text
if not input_text:
raise HTTPException(status_code=400, detail="Input text is required")
try:
result = llm(input_text, max_length=50, num_return_sequences=1)
return {"output": result[0]["generated_text"]}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
解説
- Flask版は、シンプルで学習コストが低く、小規模なアプリケーションに適しています。
- FastAPI版は、非同期処理に対応しており、高速なAPIを構築できます。また、Pydanticを使用することで、リクエストのバリデーションも行えます。
どちらを選ぶべきか?
- 小規模なプロジェクトや、非同期処理が不要な場合は Flask が便利です。
- 高速なAPIが求められる場合や、非同期処理が必要な場合は FastAPI が適しています。
もっと詳しく
実運用ではリクエスト検証やエラーハンドリングに加えて、レート制限・認可・タイムアウト設計も重要になります。ここでは最小構成に集中し、後続の章でスケーリングやキャッシュを扱います。