Esporre un modello con FastAPI: dal socket "grezzo" della Quarta a un servizio HTTP standard
/predict che riceve dati e restituisce una previsioneIn Classe Quarta hai costruito un server con il modulo socket: funziona, ma richiede un protocollo "fatto in casa" — sia client che server devono sapere esattamente come interpretare i byte scambiati. Un'API REST standardizza tutto questo usando HTTP: metodi noti (GET, POST), formato dati noto (JSON), e strumenti di test già pronti (browser, Postman, JavaScript).
| Socket (Quarta) | API REST (Quinta) | |
|---|---|---|
| Protocollo | Definito da noi | HTTP standard |
| Formato dati | Testo libero | JSON strutturato |
| Client possibili | Solo Python su misura | Browser, JS, curl, app mobile... |
| Documentazione | Manuale | Generata automaticamente |
# pip install fastapi uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(title="API Modello IA")
class DatiInput(BaseModel):
valore: float
@app.get("/")
def home():
return {"messaggio": "API attiva. Usa /predict per una previsione."}
@app.post("/predict")
def predict(dati: DatiInput):
previsione = dati.valore * 2 + 1 # placeholder, sostituito dal modello vero
return {"input": dati.valore, "previsione": previsione}# Avvio del server (da terminale):
# uvicorn main:app --reload
#
# Documentazione automatica disponibile su:
# http://127.0.0.1:8000/docsDatiInput valida automaticamente i dati in ingresso — se il client invia un tipo sbagliato, FastAPI risponde con un errore chiaro senza bisogno di controlli manuali.
from fastapi import FastAPI
from pydantic import BaseModel
import pickle
import numpy as np
app = FastAPI(title="API Classificatore")
with open("modello_albero.pkl", "rb") as f:
modello = pickle.load(f)
class Caratteristiche(BaseModel):
feature1: float
feature2: float
feature3: float
feature4: float
@app.post("/predict")
def predict(dati: Caratteristiche):
X = np.array([[dati.feature1, dati.feature2, dati.feature3, dati.feature4]])
classe = modello.predict(X)[0]
probabilita = modello.predict_proba(X)[0].tolist()
return {"classe_prevista": str(classe), "probabilita": probabilita}Con pochissime righe, il modello addestrato nei moduli precedenti diventa un servizio raggiungibile da qualunque client HTTP — incluso il browser, come vedrai nel prossimo modulo.
Se preferisci una sintassi ancora più minimale (utile per capire i concetti base prima di FastAPI):
# pip install flask
from flask import Flask, request, jsonify
import pickle
import numpy as np
app = Flask(__name__)
with open("modello_albero.pkl", "rb") as f:
modello = pickle.load(f)
@app.route("/predict", methods=["POST"])
def predict():
dati = request.get_json()
X = np.array([[dati["feature1"], dati["feature2"], dati["feature3"], dati["feature4"]]])
classe = modello.predict(X)[0]
return jsonify({"classe_prevista": str(classe)})
if __name__ == "__main__":
app.run(debug=True)FastAPI offre validazione automatica e documentazione integrata; Flask è più minimale e didattico per capire il flusso richiesta → risposta.
/predict che riceve un numero e restituisce il risultato del modello di regressione della Quarta./predict-batch che accetta una lista di osservazioni e restituisce una lista di previsioni in un'unica richiesta.Un'API REST standardizza la comunicazione client-server usando HTTP e JSON, superando i limiti del socket "fatto in casa" della Quarta. FastAPI (o Flask) permette di esporre in poche righe un modello già addestrato tramite un endpoint come /predict, pronto per essere chiamato da qualunque client — incluso il browser, come vedremo nel Modulo 07.