🍺 Buy me a beer
🤖

IA On-Premises per Svogliati

Girare modelli AI sul tuo hardware senza pagare abbonamenti, senza mandare dati in cloud, e senza aspettarti miracoli.

Da "ho sentito che posso girare ChatGPT a casa" a "so scegliere il modello giusto per quello che mi serve"

"Un modello locale che risponde in 30 secondi è meglio di nessun modello. A volte. Dipende."

Capitolo 01

IA On-Premises: Che Significa?

No, non stai "girando ChatGPT". Ma qualcosa di interessante sì.

🎲 Analogia per Svogliati

I modelli AI in cloud (ChatGPT, Claude, Gemini) sono come un ristorante stellato dove puoi ordinare quello che vuoi, il cuoco è fantastico, ma ogni piatto costa, devi fare la fila, e il cuoco sente tutto quello che dici al tavolo. L'IA locale è come avere un cuoco a casa: più lento, meno bravo sui piatti difficili, ma sempre disponibile, gratuito dopo l'investimento iniziale, e non riporta niente a nessuno. La scelta dipende da cosa cucini e quanto ti importa della privacy.

Perché Farlo

  • Privacy totale — i dati non escono dalla tua rete
  • Costo zero a regime — nessun abbonamento, nessun token da pagare
  • Offline — funziona anche senza internet
  • Personalizzabile — fine-tuning, system prompt fissi, integrazione custom
  • Nessun rate limit — 1000 richieste al minuto? Fatti pure
  • Compliance — dati aziendali sensibili che non puoi mandare in cloud

Perché NON Farlo (o aspettarsi di meno)

  • Qualità inferiore — anche il migliore modello locale fatica contro GPT-4o o Claude Opus
  • Hardware costoso — per andare bene serve una GPU decente
  • Lento su hardware modesto — aspetti 2 minuti per una risposta? Si può fare di meglio
  • Configurazione — non è "scarica e funziona" al 100%
  • Aggiornamenti manuali — i modelli migliorano veloce, devi tenerti aggiornato
⚖ Locale vs Cloud — Il Quadro Completo
🏠 LOCALE (On-Premises) La tua app prompt Ollama / LM Studio + modello locale (Llama, Mistral...) ✅ Dati non escono dalla rete ✅ Costo zero dopo acquisto HW ✅ Offline, zero rate limit ❌ Più lento e meno capace ❌ Richiede GPU / RAM abbondante ☁️ CLOUD (API) La tua app prompt OpenAI / Anthropic GPT-4o / Claude Gemini... ✅ Qualità molto superiore ✅ Veloce, sempre aggiornato ✅ Nessun HW da comprare ❌ I tuoi prompt girano su server altrui ❌ Costo a consumo, rate limit
💡 La risposta giusta? Entrambi. I modelli locali per le task di tutti i giorni dove la privacy conta o la latenza non è critica. I modelli cloud per i task difficili che richiedono ragionamento complesso. Questo capitolo ti insegna a fare entrambe le cose e a capire quando usare quale.
Capitolo 02

L'Hardware — La Parte Scomoda

La GPU è tutto. La RAM è tutto. La CPU quasi non conta.

🎲 Analogia per Svogliati

Un modello AI è fondamentalmente una moltiplicazione di matrici enormi. La GPU è progettata per fare esattamente questo in parallelo — migliaia di core piccoli invece di pochi core grossi. La VRAM (memoria della GPU) è il vero collo di bottiglia: il modello deve starci tutto dentro. Se il modello non ci sta in VRAM, finisce in RAM di sistema, che è 10-50x più lenta. Se non ci sta nemmeno lì, va su disco: a quel punto vai a fare una passeggiata mentre aspetti la risposta.

📊 La Regola della VRAM

Regola pratica per stimare quanta VRAM serve un modello:

stima VRAM necessaria
# Quantizzazione = riduzione della precisione per risparmiare memoria
# Q4 = 4 bit per parametro (~50% di un float16), qualità ok
# Q8 = 8 bit per parametro, qualità quasi identica al pieno

VRAM (GB) ≈ (parametri in miliardi) × (bit / 8) + ~2GB overhead

Llama 3.1 8B  a Q4:  8 × 0.5  = ~5  GB VRAM  # RTX 3060 12GB: ✓
Llama 3.1 8B  a Q8:  8 × 1    = ~10 GB VRAM  # RTX 3080 10GB: ✓ (giusto)
Mistral 7B    a Q4:  7 × 0.5  = ~5  GB VRAM  # GTX 1660 6GB: ✗ (troppo corta)
Llama 3 70B   a Q4: 70 × 0.5  = ~38 GB VRAM  # solo RTX 4090 o più GPU
Llama 3 70B   a Q8: 70 × 1    = ~74 GB VRAM  # server grade (A100, H100)

# Se il modello non sta in VRAM, Ollama usa la RAM di sistema (molto più lento)
# Velocità approssimativa: VRAM >> RAM >>> Disco

🏦 I Tier di Hardware

💩 Tier: Quello che Hai

CPU-only / GPU vecchia

GPU: assente o < 6GB VRAM

Funziona? Sì. È usabile? Dipende dalla tua soglia di dolore. Modelli piccoli (Phi-3 mini 3.8B, Gemma 2B) rispondono in 10-30 secondi su CPU decente. Utile per esperimentare.

  • Modelli consigliati: Phi-3 mini, Gemma 2B, Qwen2 1.5B
  • Token/sec attesi: 2-8 t/s su CPU
  • Adatto per: curiosità, test, task non urgenti
🟡 Tier: Si Fa

GPU con 8-12 GB VRAM

RTX 3060 12GB / RTX 3080 10GB / RX 6700 XT

Il sweet spot per cominciare seriamente. Llama 3.1 8B a Q4 ci sta comodamente. Risposte in 20-40 t/s: abbastanza fluido per uso quotidiano.

  • Modelli consigliati: Llama 3.1 8B, Mistral 7B, Gemma2 9B
  • Token/sec attesi: 20-50 t/s
  • Adatto per: uso quotidiano, coding assist, chat
🟢 Tier: Si Va Bene

GPU con 16-24 GB VRAM

RTX 3090 / RTX 4090 / RTX 4080 / RX 7900 XTX

Qui si fa sul serio. La RTX 4090 con 24GB di VRAM è il riferimento per uso consumer-enthusiast. Puoi girare modelli da 13B a qualità piena o 34B quantizzati.

  • Modelli consigliati: Llama 3 70B Q4 (parziale), Mistral 22B, DeepSeek-R1 14B
  • Token/sec attesi: 50-100+ t/s su 8B
  • Adatto per: tutto il quotidiano + RAG serio
🟣 Tier: Dio Della Guerra

Multi-GPU / Apple Silicon M-series

2× RTX 4090 / Mac Studio M2 Ultra / Mac Pro M2

Due RTX 4090 = 48GB VRAM: Llama 70B a qualità piena. In alternativa: Mac Studio M2 Ultra con 192GB di memoria unificata copre qualsiasi cosa con la banda memoria del SoC. Non economico, ma impressionante.

  • Modelli: qualunque cosa, Llama 70B, Mixtral 8x22B
  • Token/sec attesi: 30-60 t/s anche su 70B
  • Adatto per: sviluppo serio, RAG aziendale, fine-tuning
🍎 Il segreto di Apple Silicon: i Mac con chip M-series (M1/M2/M3/M4) usano memoria unificata condivisa tra CPU e GPU. Un MacBook Pro M3 Max con 96GB di RAM le usa tutte come VRAM. Risultato: giri Llama 70B su un laptop. La velocità non è da RTX 4090, ma è sorprendentemente utilizzabile. È diventato l'hardware preferito per chi vuole IA locale senza un gaming PC da 3000€.

📊 Confronto Rapido: Token al Secondo

HardwareModelloToken/secUsabilità
CPU moderna (no GPU)Phi-3 mini 3.8B Q4~5-10 t/slento
RTX 3060 12GBLlama 3.1 8B Q4~35-50 t/sok
RTX 3090 24GBLlama 3.1 8B Q8~80-100 t/sfluido
RTX 4090 24GBLlama 3.1 8B Q8~120-150 t/sveloce
M3 Pro 36GBLlama 3.1 8B Q8~60-80 t/sfluido
M3 Max 96GBLlama 3.3 70B Q4~25-35 t/sok
RTX 4090 (VRAM overflow in RAM)Llama 3 70B Q4~3-8 t/sdoloroso

Per riferimento: leggere testo a schermo comodamente richiede ~15-20 t/s. Sotto quella soglia senti la latenza.

⚠️ Attenzione al consumo energetico: una RTX 4090 consuma fino a 450W sotto carico. Se usi l'IA locale intensamente h24, il conto della luce lo senti. Fai i conti: 450W × 8h/giorno × 30 giorni × 0.25€/kWh = ~27€/mese solo di corrente per la GPU. Non è trascurabile.
Capitolo 03

I Modelli — Chi Scegliere

L'ecosistema open-weight cresce ogni settimana. Qui le scelte sensate.

💡 "Open source" vs "open weight": la maggior parte dei modelli "open" rilascia solo i pesi (i parametri addestrati), non il codice di training né i dati. Puoi usarli, ridistribuirli (spesso con limiti commerciali), ma non sai esattamente come sono stati addestrati. È comunque molto meglio di un modello chiuso.

🎯 Per uso Generale

Llama 3.1 / 3.2 / 3.3 consigliato

Meta — 8B / 70B / 405B

Il riferimento open-weight per uso generale. Llama 3.1 8B è il punto di partenza perfetto: gira su hardware modesto, risponde in italiano discretamente, ottimo per coding e chat. Il 70B è significativamente migliore ma richiede hardware serio.

8B / 70B / 405B 128K context multilingual tool use

Mistral / Mixtral

Mistral AI — 7B / 22B / 8×7B / 8×22B

Il team francese ha prodotto modelli storicamente efficienti per le dimensioni. Mistral 7B è compatto e veloce. Mixtral 8×7B usa Mixture-of-Experts (attiva solo 2 expert per token): qualità da 47B con costi da 13B.

7B / 22B / MoE 32K context molto veloce

Gemma 2 / Gemma 3

Google — 2B / 9B / 27B

I modelli di Google per uso locale. Gemma 2 2B è eccezionale per le dimensioni: gira su qualsiasi cosa e batte modelli più grandi di altri in molti benchmark. Gemma 3 27B multimodale (testo + immagini).

2B / 9B / 27B multimodale (v3) efficiente

Qwen 2.5 / QwQ

Alibaba — 0.5B → 72B

La famiglia Qwen di Alibaba ha sorpreso tutti con qualità eccellente per le dimensioni e ottimo supporto multilingua (cinese + italiano molto buono). QwQ-32B è specializzato in ragionamento con risultati vicini ai top cloud su math/coding.

0.5B → 72B italiano ottimo coding forte

💻 Per Coding

DeepSeek-Coder-V2 / DeepSeek-R1 top

DeepSeek — 7B / 16B / 236B

DeepSeek ha scosso il mercato con modelli che battono GPT-4 su coding a una frazione del costo. DeepSeek-R1 ragiona step-by-step come o1. La versione distillata 14B locale è impressionante. Nota: è cinese, valuta le implicazioni privacy.

7B / 14B / 236B reasoning coding eccellente

Qwen2.5-Coder

Alibaba — 1.5B / 7B / 32B

Specializzato su coding, batte Llama e Mistral sul codice a pari dimensioni. Il 7B è ideale come modello di autocomplete locale (tipo Copilot ma privato). Il 32B è tra i migliori modelli locali per codice.

1.5B / 7B / 32B fill-in-middle 100+ linguaggi

Phi-4 / Phi-3.5

Microsoft — 3.8B / 14B

Microsoft ha dimostrato che dimensioni ridotte + dati di training curati = risultati notevoli. Phi-4 14B batte molti modelli più grandi su math e coding. Ottimo per chi ha hardware limitato ma vuole risultati decenti.

3.8B / 14B math forte efficiente

🎨 Multimodali (Testo + Immagini)

LLaVA / BakLLaVA

Haotian Liu et al. — 7B / 13B / 34B

I pionieri del multimodale open-source. Descrivi immagini, fai domande su screenshot, analizza diagrammi. Non è al livello di GPT-4V ma funziona localmente.

vision7B / 13B

Gemma 3 27B consigliato

Google — 27B

Il modello multimodale locale più completo al momento. Analizza immagini, documenti, screenshot con qualità superiore ai predecessori. Richiede ~20GB VRAM a Q4.

vision27B128K context
🕑 Il mondo dei modelli cambia ogni settimana. Quello che è scritto qui è valido ad aprile 2025. Probabilmente fra 3 mesi ci saranno modelli migliori. Per tenersi aggiornati: lmsys.org/chat (benchmark arena), huggingface.co/spaces/open-llm-leaderboard, e il subreddit r/LocalLLaMA (la comunità più attiva).
Capitolo 04

Ollama — Il Modo Svogliato per Cominciare

Un comando per installare, uno per scaricare un modello, uno per usarlo. Fine.

🎲 Analogia per Svogliati

Ollama è il Docker dei modelli AI. Come Docker astrae la complessità di far girare container, Ollama astrae la complessità di far girare modelli GGUF (il formato quantizzato). Gestisce il download, la quantizzazione, l'accelerazione GPU, il server HTTP, e l'interfaccia CLI. Tu scrivi ollama run llama3.1 e lui fa tutto il resto.

⚙️ Installazione in 3 Comandi

installazione (macOS / Linux)
# macOS
brew install ollama
# oppure dal sito: curl -fsSL https://ollama.com/install.sh | sh

# Linux (una riga, fa tutto)
curl -fsSL https://ollama.com/install.sh | sh

# Windows: installer .exe da ollama.com

# Verifica che funzioni
ollama --version
ollama version is 0.x.x

# Ollama gira come servizio in background su :11434
ollama serve   # solo se non parte in automatico

📥 Scaricare e Usare un Modello

uso base di ollama
# Scarica e avvia in chat interattiva
ollama run llama3.1              # 8B, ~5GB download
ollama run llama3.1:70b          # 70B, ~40GB download
ollama run mistral               # Mistral 7B
ollama run qwen2.5-coder:7b      # per coding
ollama run deepseek-r1:14b       # reasoning locale
ollama run phi4                  # Microsoft Phi-4 14B
ollama run gemma3:27b            # Google Gemma 3, multimodale

# Una domanda singola senza chat interattiva
ollama run llama3.1 "traduci in italiano: hello world"

# Lista modelli scaricati
ollama list

# Rimuovi un modello (libera spazio)
ollama rm mistral

# Vedi quanto VRAM/RAM sta usando
ollama ps

🌐 L'API HTTP — Integra con Qualsiasi Cosa

Ollama espone un'API REST compatibile (in gran parte) con OpenAI. Qualsiasi app che parla con OpenAI può puntare a Ollama cambiando solo l'URL.

api rest di ollama
# Chiamata base all'API (endpoint /api/generate)
curl http://localhost:11434/api/generate \
  -d '{"model":"llama3.1","prompt":"spiega kubernetes in 2 righe","stream":false}'

# Endpoint compatibile OpenAI (per drop-in replacement)
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.1",
    "messages": [{"role":"user","content":"ciao, come stai?"}]
  }'

# Python con libreria ollama
pip install ollama

# client.py
import ollama

response = ollama.chat(model='llama3.1', messages=[
    {'role': 'user', 'content': 'Spiega Docker in 3 righe'}
])
print(response['message']['content'])

# Oppure con libreria openai, cambiando solo base_url
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
response = client.chat.completions.create(model="llama3.1", ...)

📄 Modelfile — Personalizza il Tuo Modello

Come il Dockerfile per i container, il Modelfile ti permette di creare versioni personalizzate di un modello con system prompt fissi, parametri custom, template diversi.

Modelfile esempio
# Modelfile
FROM llama3.1

# Temperatura: 0.0 = deterministico, 1.0 = creativo
PARAMETER temperature 0.2

# Context window
PARAMETER num_ctx 8192

# System prompt fisso
SYSTEM """
Sei un assistente tecnico per sistemisti. Rispondi sempre in italiano.
Sii conciso e diretto. Se non sai qualcosa, dillo chiaramente.
Quando mostri comandi, usa blocchi di codice.
"""

# Crea il modello custom
ollama create mio-assistente -f Modelfile
ollama run mio-assistente
💡 Trucco: Ollama supporta anche modelli da Hugging Face in formato GGUF direttamente: ollama run hf.co/bartowski/Llama-3.1-8B-Instruct-GGUF. Se un modello non è nel registry ufficiale di Ollama, cercalo su Hugging Face con il tag GGUF.
Capitolo 05

Altri Tool — L'Ecosistema

Ollama è il motore. Questi sono i sedili, il volante e il cruscotto.

👔 LM Studio GUI

L'interfaccia grafica per chi vuole tutto incluso senza terminale. Scarica modelli da Hugging Face con una ricerca, li gestisce, li gira con un click, e include una chat integrata + server API. Disponibile per Mac, Windows, Linux.

  • Ottimo per cominciare senza CLI
  • Supporta più modelli contemporaneamente
  • Server compatibile OpenAI integrato
  • Gestione automatica della quantizzazione
💡 LM Studio è free per uso personale. Per uso commerciale serve licenza a pagamento.

🌎 Open WebUI web

Un'interfaccia web tipo ChatGPT da girare localmente sopra Ollama (o qualsiasi backend compatibile). Docker compose e sei operativo in 2 minuti. Features: chat con più modelli, gestione conversazioni, RAG integrato, image generation, multi-user.

avvio con docker
docker run -d \
  -p 3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  -v open-webui:/app/backend/data \
  --name open-webui \
  ghcr.io/open-webui/open-webui:main

# Poi vai su http://localhost:3000

🧰 AnythingLLM

La soluzione all-in-one per RAG (Retrieval Augmented Generation) locale. Carica PDF, Word, pagine web, codice — lui li indicizza e puoi farci domande. Supporta Ollama come backend, ha UI desktop e versione server. Ideale per "parla con i tuoi documenti" senza mandare niente in cloud.

🔧 LocalAI

Il progetto più "infrastrutturale": drop-in replacement dell'API OpenAI, supporta modelli GGUF, diffusion models, TTS, STT. Pensato per chi vuole sostituire OpenAI nelle proprie applicazioni senza toccare il codice. Più complesso da configurare ma più flessibile.

💻 Continue.dev IDE

Plugin per VS Code e JetBrains che usa modelli locali (o cloud) come Copilot alternativo. Autocomplete, chat nel contesto del codice, refactoring, generazione di test. Con Ollama + qwen2.5-coder ottieni un Copilot privato gratuito.

config.json di Continue
{
  "models": [{
    "title": "Llama locale",
    "provider": "ollama",
    "model": "llama3.1"
  }],
  "tabAutocompleteModel": {
    "title": "Qwen coder",
    "provider": "ollama",
    "model": "qwen2.5-coder:7b"
  }
}

🔍 llm (Simon Willison)

Tool CLI di Simon Willison per interagire con qualsiasi LLM (locale e cloud) da terminale. Ottimo per scripting, pipe, automazioni. cat file.txt | llm "riassumi" è tutto quello che devi sapere per capire il potenziale.

llm cli
pip install llm llm-ollama
llm install llm-ollama

# Usa modello ollama
llm -m ollama/llama3.1 "spiega il CAP theorem"

# Pipe dal terminale
git diff | llm -m ollama/llama3.1 "scrivi un commit message"
cat error.log | llm "cosa significa questo errore?"
Capitolo 06

Cosa Si Riesce a Fare

I task dove i modelli locali rendono bene. Aspettative realistiche incluse.

💻

Coding Assist

Autocomplete, spiegazione di codice, refactoring, docstring. Con un 8B decente: buono. Con 32B+: molto buono. Alternativa reale a Copilot per uso privato.

📋

RAG su Documenti

Fai domande su PDF, manuali, documentazione interna. Funziona bene se i documenti sono in italiano e le domande sono precise. Non è magia, è un motore di ricerca intelligente.

📝

Riassunti & Sintesi

Riassumere testi lunghi, estrarre punti chiave, trasformare bullet point in testo. Task semplice dove anche 7B funziona bene.

🌐

Traduzione

EN→IT e IT→EN funzionano bene anche sui modelli piccoli. Lingue meno comuni: risultati variabili. Non al livello di DeepL ma accettabile per uso interno.

📂

Classificazione Testi

Categorizzare ticket di supporto, email, feedback. Ottimo caso d'uso per automazione: nessun dato esce, costo zero, basta un 7B.

🔨

Generazione Template

Email, report, documentazione tecnica, YAML di configurazione. Dato un contesto chiaro, i modelli locali producono output utile anche in italiano.

🔌

Estrazione Dati

Da testo non strutturato a JSON. "Estrai nome, data e importo da questa fattura" funziona sorprendentemente bene anche su 7B con un buon prompt.

🤖

Chatbot Interno

FAQ aziendale, primo livello di supporto, assistente per documentazione interna. Combinato con RAG: soluzione utile e completamente privata.

⚙️

Automazione Script

Generare script bash/python per task ripetitivi, convertire comandi tra sistemi operativi, debug di regex. I coding model da 7B ci riescono spesso al primo colpo.

🏆 Il Test del Fuoco: Cosa Aspettarsi da un 8B

Un benchmark pratico e onesto di Llama 3.1 8B Q4 su hardware tipico (RTX 3060 12GB):

TaskQualitàNote
Spiegare codice esistentebuonaMolto utile, raramente sbaglia il senso
Scrivere funzione semplicebuonaPython/JS funzionano bene, assembly no
Scrivere funzione complessavariabileSpesso funziona, a volte inventa API che non esistono
Debug di erroribuonaOttimo se gli dai l'errore completo + contesto
Riassumere documentibuonaAffidabile, un po' meccanico
Ragionamento matematicomediocreAritmetica ok, algebra/calcolo: ci sbaglia spesso
Ragionamento complesso multi-stepdeboleUsa DeepSeek-R1 o i modelli cloud per questo
Rispondere in italiano correttoaccettabileSi difende, qualche errore di concordanza
Generare codice sicurovariabileSempre revisionare manualmente
Capitolo 07

Cosa NON Si Riesce a Fare

Le aspettative irrealistiche che uccidono i progetti locali.

🚨 Il gap qualitativo è reale. Un Llama 3.1 8B locale non è "quasi uguale a GPT-4". Su compiti semplici ci si avvicina. Su compiti complessi il divario è enorme. Non è una scusa per non usare i modelli locali — è informazione per usarli dove hanno senso.

✅ Il Locale Lo Fa Bene

  • Task ripetitivi e ben definiti
  • Domande con risposta in documenti forniti (RAG)
  • Generazione di testi con template chiari
  • Coding di routine su linguaggi comuni
  • Classificazione e estrazione dati strutturati
  • Traduzione di testi tecnici
  • Riassunti di documenti lunghi

❌ Il Locale Fatica

  • Ragionamento complesso multi-step (usa DeepSeek-R1 almeno)
  • Matematica avanzata e dimostrazioni formali
  • Conoscenza aggiornata (training cutoff fisso)
  • Creatività sofisticata e scrittura di qualità letteraria
  • Compiti che richiedono buon senso su situazioni nuove
  • Comprensione di contesti impliciti culturali italiani
  • Long context su documenti enormi (>32K token sui piccoli)

😰 Le 4 Illusioni più Comuni

1

"Giro Llama 70B e ho GPT-4 gratis"

Llama 70B è eccellente ma non è GPT-4o, e tantomeno Claude 3.5 Sonnet. Su benchmark standard ha un gap misurabile. Per molti task quotidiani non importa. Per task complessi, importa eccome.

2

"La mia GPU da gaming basta per tutto"

Una RTX 3060 12GB è ottima per modelli fino a 8B. Per il 70B devi mettere la mano al portafoglio o usare l'architettura ibrida. Girare un 70B con overflow in RAM non è un'esperienza piacevole.

3

"Sostituisco completamente i modelli cloud"

Probabilmente no, a meno che i tuoi task siano molto specifici e ben definiti. L'approccio più efficace è ibrido: locale per il 70-80% del lavoro di routine, cloud per il 20% che richiede qualità superiore.

4

"Il modello risponde sempre in italiano corretto"

I modelli open-weight sono addestrati prevalentemente in inglese. Rispondono in italiano ma commettono più errori, usano costruzioni anglicizzate, e a volte switching di lingua. Migliora con Qwen (ha più dati multilingua) ma non sparisce.

Capitolo 08

L'Approccio Ibrido — Il Meglio dei Due Mondi

Non è locale vs cloud. È locale + cloud al posto giusto.

🎲 Analogia per Svogliati

Immagina di avere un assistente locale sempre disponibile per le banalità quotidiane (rispondi a email semplici, trova info nel manuale, formatta questo CSV) e un consulente esterno che chiami quando hai bisogno di qualcosa di vero (strategia complessa, problema non banale, documento critico). Non mandi tutto al consulente perché costa. Non affidi tutto all'assistente perché sbaglia sui task difficili. Usi entrambi in modo intelligente.

⚖ Architettura Ibrida — Come Decidere
TASK / RICHIESTA Il tuo prompt Dati sensibili? Task complesso? Sì / semplice OLLAMA Locale, privato gratuito Risposta locale Privacy garantita No / complesso API CLOUD GPT / Claude Gemini... Risposta cloud Qualità superiore

🎯 Criteri di Routing — Quando Usare Cosa

CriterioUsa LocaleUsa Cloud
DatiDati sensibili, confidenziali, PIIDati pubblici o non critici
ComplessitàTask semplici e ripetitiviRagionamento complesso, multistep
VolumeTante richieste, costo sarebbe altoPoche richieste critiche
LatenzaQuando il delay è accettabileQuando serve risposta rapida
ConnettivitàOffline, VPN aziendale rigidaCon internet disponibile
LinguaInglese o lingue con molti datiItaliano di qualità, dialetti

📈 LiteLLM — Il Proxy Universale

Uno strumento che espone un'unica API OpenAI-compatibile e smista le chiamate verso qualsiasi backend: Ollama locale, OpenAI, Anthropic, Gemini. Cambi il backend nel config, non nel codice.

config.yaml di LiteLLM
model_list:
  - model_name: fast-local
    litellm_params:
      model: ollama/llama3.1
      api_base: http://localhost:11434

  - model_name: smart-cloud
    litellm_params:
      model: claude-sonnet-4-6
      api_key: sk-ant-...

  - model_name: coding
    litellm_params:
      model: ollama/qwen2.5-coder:7b
      api_base: http://localhost:11434

# La tua app chiama sempre localhost:4000
# LiteLLM smista in base al model scelto

💪 Ollama come Fallback

Un pattern utile: prova prima il cloud (risultato migliore), in caso di errore/rate limit/offline usa il locale come fallback. Implementabile con qualsiasi SDK OpenAI-compatibile.

fallback pattern (python)
def ask(prompt, prefer_cloud=True):
    if prefer_cloud:
        try:
            return openai_client.chat(prompt)
        except (RateLimitError, APIError):
            pass  # fallback al locale

    return ollama_client.chat(prompt)

# Oppure con LiteLLM fallback nativo:
completion(
    model="claude-sonnet-4-6",
    fallbacks=["ollama/llama3.1"],
    messages=[...]
)
Capitolo 09

Casi d'Uso Pratici

Esempi concreti da implementare oggi, non ipotesi astratte.

💻 Copilot Privato con Continue.dev + Ollama

Il caso d'uso più immediato: sostituire GitHub Copilot con un modello locale per il 90% dell'autocomplete quotidiano. Zero dati che escono, zero abbonamento.

1

Installa Ollama e scarica il modello di coding

ollama pull qwen2.5-coder:7b — è il miglior rapporto qualità/velocità per autocomplete.

2

Installa Continue nel tuo IDE

Plugin per VS Code o JetBrains. È gratuito, open source. Configura il model provider come "Ollama" e il tab autocomplete model.

3

Aggiungi un modello cloud per le chat difficili

Nel config di Continue aggiungi Claude o GPT-4 per quando hai bisogno di ragionamento complesso. Tab = locale, chat = scegli tu.

4

Usa @codebase per dare contesto

Continue indicizza il tuo repo locale. Con @codebase nel prompt, il modello vede l'intero progetto. Domande tipo "come funziona il sistema di autenticazione in questo progetto" diventano utili.

📋 RAG su Documentazione Interna

Il caso d'uso killer per le aziende: "parla con i nostri manuali/procedure/contratti" senza mandare niente a OpenAI.

stack RAG locale minimale (python)
pip install langchain-community langchain-ollama chromadb pymupdf

# rag_locale.py
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 1. Carica i tuoi documenti
loader = PyMuPDFLoader("manuale_aziendale.pdf")
docs = loader.load()

# 2. Spezzali in chunk
splitter = RecursiveCharacterTextSplitter(chunk_size=500)
chunks = splitter.split_documents(docs)

# 3. Crea embeddings locali (nomic-embed-text)
embeddings = OllamaEmbeddings(model="nomic-embed-text")
db = Chroma.from_documents(chunks, embeddings, persist_directory="./db")

# 4. Fai domande
llm = OllamaLLM(model="llama3.1")
qa = RetrievalQA.from_chain_type(llm=llm, retriever=db.as_retriever())

risposta = qa.invoke("Qual è la procedura per le ferie?")
print(risposta["result"])

# Scarica anche il modello di embedding
ollama pull nomic-embed-text

📋 Pipeline di Elaborazione Testi

Classificare ticket di supporto, estrarre entità da email, taggare documenti. Con un 7B e lo stesso loop:

classificazione ticket
import ollama, json

def classifica(testo):
    resp = ollama.chat(
        model="llama3.1",
        messages=[{
            "role": "user",
            "content": f"""Classifica questo ticket.
Rispondi SOLO con JSON valido.
Categorie: bug, feature, billing, other
Priorità: low, medium, high

Ticket: {testo}

Risposta JSON:"""
        }],
        format="json"
    )
    return json.loads(resp["message"]["content"])

print(classifica("Il login non funziona da stamattina"))
# → {"categoria": "bug", "priorità": "high"}

📸 Analisi di Immagini Locale

Con modelli multimodali (LLaVA, Gemma 3) puoi analizzare screenshot, diagrammi, foto di errori — localmente.

analisi immagine con ollama
# Scarica un modello con visione
ollama pull llava:13b
# oppure: ollama pull gemma3:27b (migliore)

import ollama, base64

with open("screenshot_errore.png", "rb") as f:
    img = base64.b64encode(f.read()).decode()

resp = ollama.chat(
    model="llava:13b",
    messages=[{
        "role": "user",
        "content": "Cosa mostra questo screenshot? C'è qualche errore?",
        "images": [img]
    }]
)
print(resp["message"]["content"])
Capitolo 10

Privacy & Compliance — Il Vero Vantaggio

Il motivo per cui molte aziende stanno guardando a questo con interesse.

🔐 Cosa Succede ai Tuoi Prompt in Cloud

Mandare prompt a un'API cloud significa (a seconda del fornitore e dei termini):

🔒 IA Locale

  • I dati non escono dalla tua macchina/rete
  • Nessun termine di servizio che impatta i tuoi dati
  • GDPR: non c'è trasferimento a terzi da gestire
  • Puoi processare dati sensibili: PII, contratti, codice proprietario
  • Nessun rischio di data breach lato fornitore
  • Funziona in ambienti air-gapped

☁️ IA Cloud (da leggere bene)

  • I prompt viaggiano su server di terze parti (US o EU)
  • Alcuni piani usano i prompt per il training (verifica i TOS)
  • GDPR richiede DPA (Data Processing Agreement) con il fornitore
  • Dati sensibili in chat = possibile violazione normativa interna
  • In caso di breach del fornitore, i tuoi dati potrebbero essere esposti
⚠️ OpenAI, Anthropic, Google hanno tutti policy che, per i piani gratuiti e molti piani a pagamento, includono l'uso delle conversazioni per il miglioramento dei modelli. Il piano API con data retention disabilitata è diverso dalla chat gratuita. Leggi i TOS del piano che usi, non quello generico.
🏢

Dati Aziendali

Codice proprietario, contratti, comunicazioni interne. L'IA locale è l'unica opzione sensata senza un accordo enterprise con il fornitore cloud.

🤶

Dati Sanitari

HIPAA (USA), GDPR (EU): processare dati sanitari richiede accordi specifici. Locale elimina il problema alla radice.

📄

Dati Legali

Contratti, atti, comunicazioni avvocato-cliente. Molti ordini professionali vietano o limitano il cloud per questi dati.

Capitolo 11

SOS — Problemi Comuni

I problemi che incontrerai quasi certamente. Con le soluzioni.

📵 Ollama risponde lentissimo (2-5 token/secondo)

Causa probabile: il modello non sta in VRAM e sta girando su RAM di sistema (o disco).

Verifica: esegui ollama ps mentre il modello gira. Controlla la colonna "SIZE" e se dice "100% GPU" o meno.

Soluzioni:

1. Usa un modello più piccolo o più quantizzato: ollama pull llama3.1:8b-instruct-q4_K_M invece della versione Q8.

2. Su Linux/Windows con GPU NVIDIA: verifica che CUDA sia installato correttamente e che Ollama usi la GPU (nvidia-smi durante una generazione deve mostrare utilizzo GPU).

3. Chiudi altre applicazioni che usano VRAM (giochi, altre istanze di modelli).

4. Su macOS con Apple Silicon: Ollama usa automaticamente la memoria unificata, dovrebbe andare bene nativamente.

📷 La GPU non viene usata (rimane tutto su CPU)

Su NVIDIA: verifica che CUDA Toolkit sia installato. nvidia-smi deve funzionare. Se Ollama non trova CUDA, usa la CPU come fallback silenzioso.

nvidia-smi
ollama run llama3.1 "ciao"
# In un altro terminale durante la generazione:
watch -n 0.5 nvidia-smi # deve mostrare utilizzo GPU

Su AMD (Linux): installa ROCm. Ollama supporta AMD su Linux tramite ROCm ma la configurazione è più complessa.

Su AMD (Windows): supporto parziale tramite DirectML. Risultati variabili, controlla le release notes di Ollama.

Su Intel Arc: supporto sperimentale tramite SYCL/oneAPI. Ancora acerbo.

😵 Il modello risponde solo in inglese

I modelli tendono a rispondere nella lingua in cui sono stati addestrati prevalentemente (inglese). Per forzare l'italiano:

Soluzione 1 - System prompt: crea un Modelfile con SYSTEM "Rispondi sempre e solo in italiano. Non usare mai l'inglese."

Soluzione 2 - Nel prompt: inizia il prompt con "Rispondimi in italiano:" o terminalo con "(rispondi in italiano)".

Soluzione 3 - Cambia modello: Qwen2.5 e Qwen2.5-Coder hanno dati di training multilingua più bilanciati e si comportano meglio in italiano rispetto a Llama.

Realtà: su modelli piccoli (7B) il comportamento in italiano è meno affidabile. Con modelli da 14B+ migliora significativamente.

💀 Il modello "allucia" e inventa informazioni

Le allucinazioni sono più frequenti sui modelli locali rispetto ai top cloud. Non spariscono mai completamente, ma si riducono con queste pratiche:

1. Fornisci il contesto: "Basandoti SOLO sul seguente testo, rispondi a..." riduce l'invenzione di informazioni.

2. Chiedi incertezza: aggiungi al system prompt "Se non sei sicuro, di' esplicitamente 'Non lo so' invece di inventare".

3. Abbassa la temperatura: PARAMETER temperature 0.1 nel Modelfile rende le risposte più conservative e meno creative (anche meno allucinate).

4. Usa RAG per i fatti: se hai bisogno di informazioni precise da documenti, usa RAG invece di affidarti alla memoria del modello.

5. Accetta il limite: per task che richiedono fatti precisi (leggi, dati storici, documentazione tecnica), usa il cloud o il RAG. Non fidarti della memoria del modello locale.

💸 Open WebUI non si connette a Ollama

Il problema classico Docker: il container non riesce a raggiungere Ollama che gira sull'host.

# Su Linux: usa --add-host
docker run -d --add-host=host.docker.internal:host-gateway ...

# Su macOS/Windows: host.docker.internal funziona già

# Imposta OLLAMA_BASE_URL nelle variabili del container
-e OLLAMA_BASE_URL=http://host.docker.internal:11434

Se Ollama gira in un container separato nello stesso docker network, usa il nome del container come host invece di localhost.

📷 "Error: model requires more system memory"

Il modello richiede più memoria di quella disponibile (RAM + VRAM combinata).

Soluzioni:

1. Scarica una versione più quantizzata: invece di :latest usa :8b-instruct-q4_0 (la versione più leggera).

2. Prova un modello più piccolo: da 7B a 3B, da 13B a 7B.

3. Su macOS: chiudi le app che usano molta memoria (browser con molte tab, Xcode, ecc.).

4. Aumenta la swap/page file (aiuta ma rallenta molto).

5. Verifica la stima VRAM con la formula: parametri × quantizzazione + 2GB overhead.

Capitolo 12

Cheat Sheet

Tutto quello che devi ricordare in una pagina. Stampala, appendila.

📥 Comandi Ollama Essenziali
ollama run <model>Avvia chat interattiva
ollama pull <model>Scarica un modello
ollama listLista modelli scaricati
ollama psModelli in esecuzione + VRAM usata
ollama rm <model>Rimuovi un modello
ollama show <model>Info dettagliate su un modello
ollama create -f <file>Crea modello da Modelfile
ollama cp <src> <dst>Copia un modello
ollama serveAvvia server manualmente (:11434)
🤖 Modelli Consigliati per Scenario
Uso generale (8GB VRAM)llama3.1:8b
Uso generale (24GB VRAM)qwen2.5:32b
Coding autocompleteqwen2.5-coder:7b
Coding qualitàdeepseek-r1:14b
Hardware minimo (<6GB)phi4:mini / gemma3:1b
Multimodale (immagini)gemma3:27b / llava:13b
Ragionamentodeepseek-r1:14b / qwq:32b
Embedding per RAGnomic-embed-text
Mac M-series (qualsiasi)llama3.3:70b (se >48GB)
📊 Stima VRAM Rapida
Formula Q4Params(B) × 0.5 + 2 GB
Formula Q8Params(B) × 1 + 2 GB
3B Q4~3.5 GB VRAM
7B Q4~5.5 GB VRAM
8B Q4~6 GB VRAM
13B Q4~8.5 GB VRAM
14B Q4~9 GB VRAM
32B Q4~18 GB VRAM
70B Q4~37 GB VRAM
🍽 Modelfile Parametri Utili
temperature 0.0Deterministico, sempre uguale
temperature 0.7Default bilanciato
temperature 1.2Creativo, meno prevedibile
num_ctx 4096Finestra di contesto (default)
num_ctx 32768Context lungo (+ VRAM)
num_predict 512Max token in output
top_p 0.9Nucleus sampling
repeat_penalty 1.1Penalizza ripetizioni
🏠 Stack Locale Completo
RuntimeOllama
GUI desktopLM Studio
Web UIOpen WebUI (Docker)
IDE codingContinue.dev
RAGAnythingLLM / LangChain
Proxy unificatoLiteLLM
CLI universalellm (Simon Willison)
Monitoringollama ps + nvidia-smi
Aggiornamenti modellir/LocalLLaMA, HF leaderboard
📷 Variabili d'Ambiente Ollama
OLLAMA_HOST0.0.0.0:11434 (accetta connessioni esterne)
OLLAMA_MODELSPath cartella modelli custom
OLLAMA_NUM_PARALLELRichieste parallele (default 1)
OLLAMA_MAX_LOADED_MODELSModelli in memoria contemporanei
OLLAMA_KEEP_ALIVETempo keep alive modello (es. 30m)
CUDA_VISIBLE_DEVICESQuale GPU usare (multi-GPU)
OLLAMA_DEBUG1 per log dettagliati