今天我們要讓 FastAPI 真的能提供推薦結果。
這意味著:
/recommend
API,接受動畫名稱列表,回傳推薦清單。前一天 (Day 21),我們建立了 FastAPI 基礎結構與 /health
API。
但那時只是確認 FastAPI 是否啟動成功。
👉 今天,我們讓 FastAPI 變成推薦服務層,
它會呼叫 MLflow Model Registry 裡的 Staging 模型,
並回傳即時推薦結果。
src/api/main.py
import mlflow
import mlflow.pyfunc
from fastapi import FastAPI
from pydantic import BaseModel
import pandas as pd
import os
app = FastAPI(
title="Anime Recommender API",
description="FastAPI + MLflow 企業級推薦系統",
version="2.0.0"
)
# === Health Check ===
@app.get("/health")
def health_check():
return {"status": "ok", "message": "FastAPI is running 🚀"}
class RecommendRequest(BaseModel):
anime_titles: list[str]
# === 載入模型 ===
mlflow.set_tracking_uri("http://mlflow:5000")
MODEL_URI = "models:/AnimeRecsysModel/Staging"
print(f"📦 Loading model from {MODEL_URI} ...")
model = mlflow.pyfunc.load_model(MODEL_URI)
print("✅ Model loaded successfully!")
# === 推薦 API ===
@app.post("/recommend")
def recommend(request: RecommendRequest):
try:
df_input = pd.DataFrame(request.anime_titles)
result = model.predict(df_input)
return {
"input": request.anime_titles,
"recommendations": result[0]
}
except Exception as e:
return {"error": str(e)}
在專案根目錄執行:
docker compose up -d fastapi
FastAPI 啟動後會自動載入 Staging 模型:
📦 Loading model from models:/AnimeRecsysModel/Staging ...
✅ Model loaded successfully!
curl -X POST http://fastapi:8000/recommend \
-H "Content-Type: application/json" \
-d '{"anime_titles": ["Naruto", "Bleach"]}'
Client (curl / Streamlit)
│
▼
FastAPI 8000 (我們剛才執行了 models:/AnimeRecsysModel/Staging)
│
▼
MLflow Server 5000 (Registry + Artifacts)
│
▼
Model Files (PopularTop10)
之後可以在 /recommend
加入: