Puntata 234
Puntata 234 — TEST: deploy di un mini-modello in uno Space gratis
Livello: 🧙 Maestro Yoda · Capitolo 21 · Open source e HuggingFace
Le 11 puntate precedenti sono teoria spiegata bene. Questo TEST è l’opposto: 30 minuti, due file, un git push, e hai un mini-prodotto AI pubblico, gratis, con URL condivisibile. Il punto del TEST non è “imparare”, è dimostrare a te stesso che lo stack open ti basta.
Cosa costruirai
Una demo chatbot Gradio che usa Qwen2.5-0.5B-Instruct (o equivalente piccolo) servito tramite HuggingFace Inference API gratis, hostato in uno Space pubblico con URL huggingface.co/spaces/<tuo-username>/mini-chat-italian.
Specs:
- 2 file:
app.py+requirements.txt(e unREADME.mdper il frontmatter Space). - Tempo totale: 20-30 minuti dal primo
git initalla URL live. - Costo: 0 €.
- Hardware Space: CPU free tier (2 vCPU, 16 GB RAM). Il modello gira via Inference API, non sul container Space.
Step 0 — Prerequisiti
- Account HuggingFace (huggingface.co).
- Token utente con scope write: Settings → Access Tokens → “New token” → write.
- Git installato +
huggingface-cli(pip install huggingface_hub[cli]). - 30 minuti di tempo continuo.
huggingface-cli login # incolla il token
Step 1 — Crea lo Space
Sul sito:
- Vai a huggingface.co/new-space.
- Owner: tuo username.
- Space name:
mini-chat-italian(o quello che vuoi). - SDK: Gradio.
- Hardware: CPU basic (free).
- Visibility: Public.
- Click “Create Space”.
HF crea un repo git inizializzato con file di esempio.
Step 2 — Clona localmente
git clone https://huggingface.co/spaces/<tuo-username>/mini-chat-italian
cd mini-chat-italian
Vedi 3 file: README.md, app.py (template), requirements.txt (vuoto o minimal).
Step 3 — app.py
Sovrascrivi con questo (~40 righe):
import os
import gradio as gr
from huggingface_hub import InferenceClient
MODEL_ID = "Qwen/Qwen2.5-0.5B-Instruct"
SYSTEM_PROMPT = (
"Sei un assistente conversazionale in italiano. "
"Rispondi in modo conciso, chiaro, leggermente ironico, "
"ma sempre rigoroso sui fatti. Mai inventare date o numeri."
)
client = InferenceClient(model=MODEL_ID, token=os.environ.get("HF_TOKEN"))
def chat_fn(message, history):
messages = [{"role": "system", "content": SYSTEM_PROMPT}]
for user_msg, ai_msg in history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": ai_msg})
messages.append({"role": "user", "content": message})
response = ""
for chunk in client.chat_completion(
messages=messages,
max_tokens=512,
temperature=0.7,
stream=True,
):
delta = chunk.choices[0].delta.content or ""
response += delta
yield response
demo = gr.ChatInterface(
fn=chat_fn,
title="Mini Chat Italian — powered by Qwen 0.5B",
description="Demo del Capitolo 21 di **AI per Babbani**. "
"Modello open, infra gratuita, italiano nativo.",
examples=[
"Spiegami in 3 frasi cos'è un Transformer.",
"Scrivi un haiku sulla domenica delle Palme.",
"Quali sono i 3 modi più rapidi per riscaldare la pasta avanzata?",
],
)
if __name__ == "__main__":
demo.launch()
Punti chiave:
InferenceClientparla con l’Inference API gratuita di HF. Rate-limited ma sufficiente per demo.HF_TOKENletto da env var (settato nei Secrets dello Space, vedi step 5).- Streaming con
yield response→ tipico UX chatbot. gr.ChatInterface= 1 riga per UI completa con history, examples, retry.
Step 4 — requirements.txt
gradio>=4.44.0
huggingface_hub>=0.26.0
(Versioni più nuove vanno bene; queste sono minimi testati.)
Step 5 — README.md (frontmatter Space)
---
title: Mini Chat Italian
emoji: 🤖
colorFrom: blue
colorTo: red
sdk: gradio
sdk_version: 4.44.0
app_file: app.py
pinned: false
license: apache-2.0
---
# Mini Chat Italian
Demo del Capitolo 21 di [AI per Babbani](https://aiperbabbani.it).
Mostra come servire un piccolo modello open (Qwen 2.5 0.5B Instruct)
tramite Gradio + HF Inference API, hostato su Space gratis.
## Stack
- Modello: `Qwen/Qwen2.5-0.5B-Instruct` (Apache 2.0)
- UI: Gradio 4.x
- Inference: HuggingFace Inference API
- Hardware: CPU basic (free tier)
Step 6 — Settare il Secret HF_TOKEN
Senza token, l’Inference API ha quota più bassa. Con il tuo personal token, hai la quota piena del tuo account.
Nel sito dello Space:
- Tab Settings dello Space.
- Sezione Variables and secrets.
- New secret: name
HF_TOKEN, value il tuo token (lo stesso usato perhuggingface-cli login). - Save. Lo Space si riavvia.
Il codice legge os.environ.get("HF_TOKEN") e lo passa al client.
Step 7 — Push
git add app.py requirements.txt README.md
git commit -m "Initial Mini Chat Italian"
git push
Lo Space rileva il push, builda l’immagine Docker, installa requirements, avvia app.py. Tempo build tipico: 60-180 secondi.
Stato del build visibile su https://huggingface.co/spaces/<tuo-username>/mini-chat-italian nella tab Logs.
Se vedi “Running”:
- Apri l’URL principale dello Space.
- Vedi l’interfaccia Gradio.
- Scrivi una domanda. Vedi lo streaming della risposta.
Step 8 — Condividi e itera
Hai una URL pubblica: condividila ai colleghi, agli amici, sul tuo CV.
Iterazioni veloci
Modifichi app.py localmente, git push, lo Space si ribuilda automaticamente. ~60 secondi di downtime.
Cosa puoi migliorare
- Cambia modello con uno più capace:
meta-llama/Llama-3.2-3B-Instruct(gated, accetta la license prima),mistralai/Mistral-7B-Instruct-v0.3,Qwen/Qwen2.5-7B-Instruct. Solo 1 riga:MODEL_ID = "...". - Aggiungi RAG su un PDF tuo: vedi puntata 246 (TEST agente RAG).
- Persistent chat memory in un DB SQLite locale dentro lo Space.
- Più voice/tones con dropdown system prompt.
- Upgrade a ZeroGPU (free per quota): permette modelli più grandi con GPU on-demand. Aggiungi
sdk: gradio+ tagzero-gpunel README e installaspaces.
Errori comuni (e fix)
a) “Model not found” o 404
Verifica MODEL_ID esatto. Se gated (Llama, Gemma), accetta la license sul sito HF (huggingface.co/<modello>) prima.
b) Streaming non funziona
Verifica gradio>=4.0 e che la funzione usi yield (generator), non return.
c) Build fails con “module not found”
Versioni nel requirements.txt mancanti o incompatibili. Apri Logs, leggi l’errore esatto, aggiusta.
d) “Rate limit exceeded”
Hai esaurito la quota free senza token. Setta HF_TOKEN nei Secrets (Step 6).
e) Risposta vuota
Modello non instruction-tuned (es. base model). Usa *-Instruct o *-Chat versions.
f) Build lento (>5 min)
Normale alla prima build (deps pip da installare). Le successive sono cached.
Bonus: aggiungere un endpoint API
Gradio espone già un’API REST auto-generata. Visita <space-url>/?view=api per la doc.
Chiamabile via Python:
from gradio_client import Client
client = Client("<tuo-username>/mini-chat-italian")
result = client.predict(
message="Ciao", history=[], api_name="/chat"
)
print(result)
Significa: il tuo Space è anche un mini-backend AI, gratis. Puoi usarlo da uno script Python, un bot Telegram, un’app Next.js.
Cosa hai dimostrato
Completando questo TEST hai dimostrato a te stesso che:
- Servire un modello open è banale (40 righe Python).
- HF Inference API + Spaces ti danno hosting gratis per demo serie.
- Lo stack open scala da 0 € a milioni di richieste cambiando solo il backend (Inference Endpoints, vLLM, ecc.) senza riscrivere il client.
- Il “vendor lock-in” è una scelta, non un destino: puoi cambiare modello con una riga.
Per chi viene dal mondo “uso solo le API di OpenAI”: è il momento “ma allora era possibile da sempre”. Sì, era possibile da sempre. Adesso è anche facile.
Diploma del Capitolo 21
Se hai completato:
- Hai scaricato/usato modelli da HF Hub (puntate 223-225).
- Capito la differenza open weight vs open source (226).
- Quantizzato un modello (227).
- Eseguito un modello locale con Ollama/LM Studio/vLLM (228).
- Misurato latenza/throughput (229).
- Fine-tunato un open model (230 + ripasso 222).
- Pubblicato un modello su HF Hub (231).
- Scelto la license giusta (232).
- Composto uno stack end-to-end (233).
- Deployato uno Space pubblico (234).
Hai il toolkit completo per costruire prodotti AI senza alcuna dipendenza da API closed. È la libertà operativa più sottovalutata del 2026.
Glossario lampo
InferenceClient— client Python ufficiale di HF per chiamare l’Inference API (managed) o Inference Endpoints (dedicati). Supporta tutti i task: chat, embeddings, image, audio.- Space Secrets — variabili d’ambiente cifrate visibili solo al runtime dello Space. Tipico uso: API token.
- ZeroGPU — feature HF che alloca on-demand GPU H200 per Space, condivisa fra utenti. Free tier ha quota giornaliera; utile per modelli più grandi.
gradio_client— SDK Python che permette di chiamare uno Space Gradio come API REST programmaticamente.
Take-away
Hai appena messo online una piccola applicazione AI usando solo strumenti open, gratis, in mezz’ora. Niente carte di credito, niente fatture, niente lock-in. La barriera tecnica all’AI è scesa a un punto in cui chi non costruisce qualcosa nel 2026 sceglie deliberatamente di non farlo. Il prossimo Capitolo (22) ti porta dal modello solitario all’agente che usa tool, esegue codice, fa retrieval — il livello successivo.
➡️ Prossima puntata: cos’è un agente AI — perception-action loop e tool use (apre Capitolo 22).