Protocollo 4B v0.1
Un modello aperto che protocolla la posta di un'azienda italiana: PEC, fatture elettroniche, F24, avvisi del Fisco, atti, mail dei clienti, truffe. Gira in locale, anche senza GPU.
Non scrive testo: per ogni documento risponde a domande a scelta chiusa con le probabilità di ogni risposta. Che tipo di documento è? A quale ufficio va? Cosa bisogna fare? C'è una scadenza, e fra quanti giorni? Che rischio c'è? È una truffa? Contiene dati sensibili?
È Rizzo Flow 4B con un adapter LoRA addestrato sui documenti italiani di protocollo-dati. Codice, dati e prove: github.com/dacso-ai/protocollo.
Smista e segnala, non sostituisce il commercialista o l'avvocato. Le probabilità non sono calibrate su posta reale: i documenti con una possibile scadenza o una possibile truffa vanno sempre visti da una persona.
File
| File | Dimensione | Uso |
|---|---|---|
protocollo-4b-v01-q8_0.gguf |
4,1 GB | consigliato; è la versione misurata qui sotto |
protocollo-4b-v01-q4_k_m.gguf |
2,4 GB | per PC con poca memoria; non ancora misurata |
lora/ |
124 MB | l'adapter LoRA (r 16, alpha 32) da applicare a rizzoaiacademy/rizzo-flow rev 55633c8 |
training/storia.json |
loss e valutazioni dell'addestramento |
I GGUF sono prodotti con llama.cpp b11081 da addestramento/esporta.py. La stessa catena, applicata con un adapter vuoto, riproduce byte per byte il GGUF Q8_0 ufficiale di Rizzo Flow.
Come si usa
Con il server di Rizzo Flow (llama.cpp, su CPU, Apple, NVIDIA o AMD):
uv run rizzo serve --model protocollo-4b-v01-q8_0.gguf
Le domande sono in protocollo/domande.json e vanno inviate a POST /v1/decisions così come sono. Lo stato è il testo del documento, con in testa la riga "Ricevuto il ...", che serve a contare i giorni alla scadenza:
curl http://127.0.0.1:8017/v1/decisions -H 'Content-Type: application/json' -d '{
"state": "Ricevuto il 30/10/2026 via mail da amministrazione@fornitore-srl.com\nSpett.le cliente, il nostro conto è cambiato: pagate le fatture aperte sul nuovo IBAN LT12 ... Non contattate la banca.",
"questions": {"phishing": {"type": "boolean", "instructions": "È una truffa? Per esempio un finto ente, una finta fattura con un link da cliccare, un fornitore che chiede di pagare su un IBAN nuovo."}}
}'
Il modello è stato addestrato con quelle domande e con quel prompt (compilato da Rizzo Flow, spark-decisions-v3). Con domande diverse funziona come Rizzo Flow, ma non è stato misurato.
Risultati
Prova zero: 50 documenti (28 dal generatore, 22 scritti a mano), 399 decisioni, stesso server per tutti e due i modelli (Q8_0, Mac Pro, solo CPU).
| Rizzo Flow 4B | Protocollo 4B v0.1 | |
|---|---|---|
| Decisioni giuste | 328/399 (82%) | 394/399 (99%) |
| Documenti scritti a mano | 121/157 (77%) | 154/157 (98%) |
| Scadenze mancate | 0 su 25 | 0 su 25 |
| Truffe non viste | 1 su 3 | 0 su 3 |
| Documento | Rizzo Flow | Protocollo v0.1 |
|---|---|---|
| Nota di credito | fattura, da pagare | nota di credito, archiviare |
| Decreto ingiuntivo (40 giorni) | da pagare | all'avvocato |
| Cambio IBAN da un dominio simile | rispondere, non è una truffa | truffa, cestinare |
Come leggere questi numeri. Sono un buon segnale, non ancora una prova indipendente. I documenti generati vengono dallo stesso generatore dell'addestramento, anche se con semi diversi. Quelli scritti a mano li ha scritti chi ha disegnato anche gli scenari del dataset. Le risposte di procedura (per esempio "inoltrare" un avviso bonario al commercialista) sono scelte nostre, e il modello le ha imparate. La misura indipendente sarà un benchmark etichettato da commercialisti, avvocati e amministrativi su documenti che non abbiamo scritto noi.
Sulle 800 domande di controllo del dataset l'accuratezza è passata da 0,74 a 0,99 durante l'addestramento.
Addestramento
- Base:
rizzoaiacademy/rizzo-flow, revisione55633c8(Spark-X2.5-4B con il LoRA di Rizzo Flow già unito, Apache-2.0). - LoRA r 16, alpha 32, dropout 0,05 su
q_k_v_proj,g_proj,out_proj,gate_proj,up_proj,down_proj; 32,4 M parametri addestrabili. - Loss: cross-entropy morbida sulle sole lettere di risposta all'ultima posizione del prompt, come Rizzo Flow. Nessun testo generato.
- Dati: 13.082 domande da protocollo-train-righe, una passata. AdamW, lr 5e-5 con coseno, 16 domande per passo, 765 passi.
- Hardware: una NVIDIA T4 gratuita di Kaggle, fp16 con GradScaler, 9,4 ore. Notebook: protocollo_lora_kaggle.ipynb.
Limiti
- Dati di addestramento sintetici: la posta vera è più disordinata (scansioni, allegati, inoltri a catena).
- Prompt di più di 2.048 token esclusi dall'addestramento: le fatture XML molto lunghe sono poco rappresentate.
- Sulla CPU (Xeon a 16 core) risponde in circa 20 secondi a documento con 8-12 domande. Con una GPU, secondo i numeri di Rizzo Flow, i tempi scendono a frazioni di secondo.
- Gli errori rimasti nella prova zero: un acconto letto come TD01, due conteggi di giorni sbagliati, un reclamo per ritardo mandato al commerciale, una conferma d'ordine segnata come "da pagare".
Licenza e crediti
Apache-2.0, come il modello base. L'idea dei modelli "System One" è di TypeSafe (Jev). Modello base, prompt e server sono di Rizzo Flow (Rizzo AI Academy), a sua volta basato su Spark-X2.5 e ispirato a SemIf. Protocollo non è affiliato a nessuno di questi progetti.
Un progetto di DACSO, Crema.