Confronto modelli · llm-local · 21 luglio 2026

Qwen3.6 vs Ornith 1.0 — misurato sul nostro ferro

2× RTX 3090 (48 GB VRAM)  ·  sei task in italiano  ·  stessi prompt, stesso context, stessa seed

Esito Qwen3.6 resta il modello di produzione. Ornith non è utilizzabile così com'è: il suo ragionamento interno finisce dentro la risposta in 6 task su 6, e il codice che ha prodotto non passa il test.
Perché questo confronto

Ornith 1.0-35B è uscito a luglio 2026 con numeri dichiarati alti sui benchmark agentici (SWE-Bench Verified 75.6%, Terminal-Bench 64.2%) e licenza MIT. È uno dei pochi modelli recenti che sta dentro 48 GB di VRAM, quindi è un candidato reale a sostituire Qwen3.6 sulla nostra macchina.

I benchmark pubblici misurano task in inglese, quasi tutti di coding. Il nostro carico è diverso: italiano, estrazione dati da testo, sequenze di chiamate a strumenti. Questo documento riporta misure fatte sulla macchina che paghiamo, non numeri riportati da altri.

Come è stata fatta la misura
Qwen3.6 — in produzione
38 GB
qwen3.6:35b-a3b-q8_0  ·  MoE 35B, 3B attivi  ·  Q8_0
Ornith 1.0 — sfidante
37 GB
unsloth/Ornith-1.0-35B-GGUF:Q8_0  ·  MoE 256 esperti, 8 attivi  ·  Q8_0

Entrambi a Q8_0 di proposito: a quantizzazione diversa non si saprebbe se una differenza viene dal modello o dalla compressione. Parametri identici per tutti e dodici i giri: num_ctx 32768, temperature 0.6, seed 42. Un giro di riscaldamento per caricare i pesi in VRAM, non conteggiato. Motore: Ollama 0.32.1.

Le due schede sono state verificate sane prima di iniziare, e nessuno dei due modelli è mai andato in overflow su CPU: entrambi stanno interamente in VRAM alla lunghezza di contesto usata.

Velocità — nessuna differenza
90,8
Qwen tok/s medi
91,9
Ornith tok/s medi
+1,2%
scarto
88,9–95,2
intervallo osservato

I due modelli generano alla stessa velocità: la differenza rientra nella variabilità fra un giro e l'altro dello stesso modello. Sulla scelta fra i due, la velocità non è un criterio.

Un numero che tornava basso, e perché

Una prima misura su Qwen dava 59 tok/s contro gli 89 documentati a giugno, sullo stesso tipo di ferro. La causa è la lunghezza di contesto: quel giro girava a 262.144 token, che occupano 39,8 GB dei 48 disponibili. Riportando il contesto a 32.768 token la velocità torna a 90 tok/s.

Il costo del contesto lungo è quindi circa un terzo del throughput. È una leva da regolare in base al carico: chi ha bisogno di 256K lo paga in velocità, chi non ne ha bisogno recupera un terzo.

Il problema che decide il confronto
Ornith espone il proprio ragionamento nella risposta — 6 task su 6

I modelli con ragionamento esplicito producono prima una fase di pensiero, poi la risposta. Il motore dovrebbe separare le due cose e restituire soltanto la seconda. Con questo pacchetto GGUF non succede: la risposta di Ornith contiene tutta la deliberazione, comprese le autocorrezioni e i ripensamenti.

994
Qwen: caratteri emessi
994
Qwen: caratteri utili
71.840
Ornith: caratteri emessi
1.209
Ornith: caratteri utili

Sui sei task, Qwen consegna 994 caratteri e sono tutti risposta. Ornith ne consegna 71.840, di cui 1.209 sono la risposta: l'1,7%. Il resto è materiale di lavoro che un'applicazione a valle riceverebbe come se fosse l'output.

Il problema è nel template del pacchetto GGUF, non nel modello. Il template apre il blocco di pensiero già nel prompt, quindi il modello emette solo il marcatore di chiusura e il motore non riconosce il blocco da rimuovere. Il parametro think: true di Ollama non lo risolve: restituisce comunque zero caratteri nel campo separato.

Conseguenza operativa

Ornith è escluso finché resta questo pacchetto. Le due vie per recuperarlo sono un Modelfile corretto a mano, oppure vLLM, dove la scheda del modello documenta un parser dedicato al ragionamento. La seconda è anche la direzione già prevista dal progetto per altre ragioni.

I sei task, uno per uno

Per Ornith, negli estratti qui sotto è riportata la risposta ripulita dal ragionamento, così il confronto sul merito resta leale. Il conteggio dei caratteri emessi indica invece quello che un'applicazione riceverebbe davvero.

01Italiano scritto Pari
"Scrivi un paragrafo di 4 righe sulla differenza fra un server dedicato e uno condiviso. Registro tecnico ma piano. Attenzione alle accentate."
Qwen3.6314 car. · 89,7 tok/s
Il server dedicato assegna risorse esclusive a un solo utente, garantendo stabilità e controllo completo. Il condiviso invece ripartisce CPU, memoria e storage tra più clienti, riducendo costi ma limitando autonomia e prestazioni sotto carico. La scelta dipende dal traffico previsto e dalle esigenze di sicurezza.
Ornith 1.010.844 car. emessi · 95,2 tok/s
Un server dedicato assegna tutte le risorse fisiche a un solo cliente, assicurando prestazioni stabili e isolamento completo dai vicini. Il server condiviso invece ripartisce CPU, RAM e spazio disco tra più utenti, abbattendo i costi ma introducendo variabilità nelle risposte. La scelta dipende dal carico applicativo […]

Italiano corretto in entrambi, accentate incluse. Qwen rispetta le quattro righe richieste, Ornith ne scrive cinque. Nessuno dei due sbaglia la lingua: il timore che un modello addestrato su coding inglese degradasse in italiano non trova conferma.

02Estrazione dati da testo libero Qwen
Da un messaggio in prosa: estrarre cliente, importo, scadenza e stato di pagamento in JSON. Il testo dice che è stato versato un acconto di 1.000 su 4.250 e che il saldo è aperto.
Qwen3.6112 car.
{
  "cliente": "Emisfera",
  "importo": "4250",
  "scadenza": "30 settembre",
  "stato": "Parzialmente pagato"
}
Ornith 1.05.944 car. emessi
{
  "cliente": "Emisfera",
  "importo": 4250,
  "scadenza": "30 settembre",
  "stato": "Aperto"
}

Ornith tipizza meglio l'importo, come numero anziché stringa. Qwen però coglie la sfumatura che conta: l'acconto versato rende lo stato "parzialmente pagato", mentre "aperto" perde l'informazione. In un flusso amministrativo quella sfumatura è il dato.

03Sequenza di chiamate a strumenti Pari
Dati tre strumenti (lista_dir, leggi_file, invia_mail): elencare la sequenza esatta di chiamate per mandare a un indirizzo il riepilogo dei preventivi di settembre presenti in una cartella.
Qwen3.6217 car.
lista_dir("/dati/preventivi/")
leggi_file("/dati/preventivi/settembre_2024.pdf")
leggi_file("/dati/preventivi/settembre_2024.csv")
invia_mail("[email protected]", "Riepilogo preventivi settembre", "[corpo_riepilogo]")
Ornith 1.014.674 car. emessi
lista_dir("/dati/preventivi/")
leggi_file("/dati/preventivi/prevettivo_settembre_01.txt")
leggi_file("/dati/preventivi/prevettivo_settembre_02.txt")
invia_mail("[email protected]", "Riepilogo preventivi settembre", "[Corpo riepilogativo generato]")

Stessa struttura corretta: prima elencare, poi leggere, poi inviare. Entrambi inventano i nomi dei file invece di attendere l'esito di lista_dir, che è l'errore tipico quando si chiede una sequenza senza poterla eseguire. Ornith scrive "prevettivo" al posto di "preventivo" in entrambi i nomi. Il task è a pari merito, ed è quello in cui Ornith dovrebbe primeggiare secondo i benchmark dichiarati.

04Codice — validazione di un codice fiscale Qwen
"Scrivi una funzione PHP che valida un codice fiscale italiano (solo formato, non il carattere di controllo). Solo codice."

Questo è l'unico task con una risposta verificabile: le due espressioni regolari sono state estratte ed eseguite su cinque casi di prova, tre validi e due da respingere.

Caso di provaAttesoQwen3.6Ornith 1.0
RSSMRA85M01H501Z — valido, mese agostoaccettacorrettorespinge
VRDLGU90D15F205X — valido, mese aprileaccettarespingerespinge
BNCGVN75A41L219K — valido, mese gennaioaccettacorrettorespinge
RSSMRA85M01H501 — 15 caratterirespingecorrettoaccetta
RSSMRA85Z01H501Z — lettera mese inesistenterespingecorrettocorretto
Totale4 su 51 su 5

Dove sbaglia Ornith

/^[A-Za-z]{6}\d{2}[ABCDEHLMPRST]\d{2}[A-Z0-9]{4}$/i
   └── 6 ── └─ 2 ─┘ └──── 1 ────┘ └─ 2 ─┘ └─── 4 ───┘   =  15 caratteri

Un codice fiscale ne ha sedici: manca il carattere di controllo finale. L'espressione respinge quindi ogni codice valido e accetta un troncato. È l'errore più costoso possibile in una funzione di validazione, perché in produzione blocca tutti gli inserimenti corretti.

Ornith ci è arrivato dopo 10.434 token di ragionamento, contro i 4.870 di Qwen: più del doppio dello sforzo per un risultato che non regge il primo caso di prova.

Dove sbaglia Qwen

/^[BCDFGHJKLMNPQRSTVWXYZ]{3}[A-Z]{3}\d{2}[ABCEHLMPRSTX]\d{2}[A-Z0-9]{4}[A-Z]$/i
                                                └── manca la D, c'è una X di troppo

La lunghezza è giusta e la struttura pure, ma l'insieme delle lettere-mese è sbagliato: contiene X, che non è un mese, e non contiene D, che è aprile. La funzione respinge chiunque sia nato in aprile.

Nessuno dei due codici è pubblicabile

Entrambe le funzioni hanno un difetto che supera una lettura distratta e cade al primo test. La differenza è la gravità: Qwen sbaglia un dodicesimo dei casi, Ornith li sbaglia tutti. Il codice generato va eseguito su casi di prova prima di essere accettato, indipendentemente dal modello.

05Calcolo di pareggio Pari
"Un server costa 349 euro al mese. Il cloud a token costa 0,80 euro per utente al mese più 120 euro fissi. Sopra quanti utenti conviene il server? Mostra il calcolo in due righe."
Qwen3.6134 car.
349 = 120 + 0,8N → N = (349 - 120) / 0,8
    = 229 / 0,8 = 286,25
Conviene il server per N > 286,25,
quindi a partire da 287 utenti.
Ornith 1.04.833 car. emessi
(349 - 120) / 0,80 = 286,25
→ Conviene il server sopra i 287 utenti.

Stesso risultato corretto, compreso l'arrotondamento all'intero successivo. Entrambi rispettano il vincolo delle due righe. È il calcolo che decide fra ferro e noleggio, e nessuno dei due lo sbaglia.

06Aderenza a un vincolo di forma Pari
"Rispondi con esattamente tre parole, tutte minuscole, separate da virgola, che descrivano cosa fa una GPU."
Qwen3.626 car.
elabora,calcola,renderizza
Ornith 1.05.009 car. emessi
elabora, visualizza, calcola

Tre parole minuscole separate da virgola in entrambi i casi. Qwen omette lo spazio dopo la virgola, che è una lettura ammissibile della consegna. Da notare il costo: per arrivare a ventotto caratteri Ornith ne ha emessi cinquemila, con una deliberazione che cambia idea quattro volte fra renderizza, visualizza e processa prima di fermarsi.

Quadro complessivo
CriterioQwen3.6Ornith 1.0
Velocità media90,8 tok/s91,9 tok/s
Occupazione su disco38 GB37 GB
Ragionamento separato dalla rispostasì, 6 task su 6no, 0 task su 6
Quota utile dell'output100%1,7%
Italiano e accentatecorrettocorretto
Estrazione daticoglie il pagamento parzialeperde la sfumatura
Sequenza di strumenticorretta, nomi inventaticorretta, nomi inventati
Codice eseguito su casi di prova4 su 51 su 5
Calcolo di pareggiocorrettocorretto
LicenzaApache 2.0MIT
Costo mensile del ferro349 euro, condiviso — entrambi girano sulla stessa macchina
Cosa tiene in piedi Qwen3.6
  • Output pulito, utilizzabile da un'applicazione senza ripulitura
  • Coglie sfumature che contano nell'estrazione dati
  • Il codice generato regge quattro casi di prova su cinque
  • Già in produzione, comportamento noto da giugno
  • Insieme delle lettere-mese sbagliato nella regex
  • Inventa nomi di file invece di attendere l'esito dello strumento
Cosa ferma Ornith 1.0
  • Licenza MIT, la più permissiva delle due
  • Italiano corretto, nessun degrado linguistico
  • Tipizzazione JSON più pulita
  • Il ragionamento finisce nella risposta in tutti i task
  • Regex del codice fiscale lunga quindici caratteri anziché sedici
  • Più del doppio dei token sul task di codice, per un esito peggiore
Conclusioni

Qwen3.6 resta in produzione. Ornith non perde sul merito: perde perché il pacchetto con cui è distribuito non separa il ragionamento dalla risposta, e perché l'unico task verificabile eseguendo il codice lo ha superato una volta su cinque.

La distanza fra i benchmark dichiarati e questa misura merita attenzione. Ornith dichiara 75,6% su SWE-Bench Verified, un risultato alto. Sul nostro unico test di codice eseguito davvero ha prodotto una funzione che respinge ogni input valido. Le due cose non si contraddicono: SWE-Bench misura la risoluzione di problemi su repository reali, con più tentativi e strumenti a disposizione, non la scrittura di una funzione al primo colpo. Sono abilità diverse, e la seconda è quella che serve nel nostro uso quotidiano.

Cosa fare

Ornith non è archiviato. Il difetto che lo esclude è di confezionamento, e la scheda del modello documenta un parser dedicato al ragionamento su vLLM. Il passaggio a vLLM era già in programma per il carico multi-utente, per il raggruppamento continuo delle richieste e il riuso del prompt condiviso. Il modo giusto di riprovare Ornith è quel passaggio, non un altro giro su Ollama.

Sui modelli grandi usciti a luglio

Qwen3.8 (2,4 mila miliardi di parametri, annunciato il 19 luglio) e Kimi K3 (2,8 mila miliardi, pesi attesi per il 27 luglio) sono fuori portata per questa macchina di uno-due ordini di grandezza. Kimi K3 in particolare si colloca quarto fra tutti i modelli di frontiera nelle valutazioni indipendenti, davanti a modelli commerciali chiusi, e i suoi pesi sono pubblici.

Il dato rilevante non è quindi se i modelli aperti reggano il confronto — al vertice lo reggono — ma quanto ferro serve per toccarli. È esattamente la domanda che il confronto con lo studio Travaglini lascia aperta, e questa misura non la risolve: dice soltanto che nella fascia che entra in 48 GB il candidato più recente non ha superato quello che abbiamo già.