MODULO 06 · CLASSE QUINTA

API RESTful per Modelli di IA

Esporre un modello con FastAPI: dal socket "grezzo" della Quarta a un servizio HTTP standard

🎯 Obiettivi del modulo

1. Da socket a REST: perché fare il salto

In 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)
ProtocolloDefinito da noiHTTP standard
Formato datiTesto liberoJSON strutturato
Client possibiliSolo Python su misuraBrowser, JS, curl, app mobile...
DocumentazioneManualeGenerata automaticamente

2. Prima API con FastAPI

# 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/docs
Pydantic: la classe DatiInput valida automaticamente i dati in ingresso — se il client invia un tipo sbagliato, FastAPI risponde con un errore chiaro senza bisogno di controlli manuali.

3. Esporre un modello vero (Decision Tree / Rete Neurale)

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.

4. Alternativa più semplice: Flask

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.

💪 Esercizi

  1. Facile: crea un'API con un solo endpoint /predict che riceve un numero e restituisce il risultato del modello di regressione della Quarta.
  2. Medio: esponi il classificatore Decision Tree/Random Forest della Quinta con FastAPI, gestendo 4 feature numeriche in input.
  3. Difficile: aggiungi un endpoint /predict-batch che accetta una lista di osservazioni e restituisce una lista di previsioni in un'unica richiesta.

📌 Riepilogo

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.

← Modulo 05: Python & MySQL Modulo 07: Integrazione Web (JS) →