Un avvocato non cita una Cassazione senza numero di sentenza. Un medico non prescrive un farmaco senza foglietto illustrativo. Un ingegnere non firma un calcolo senza la norma di riferimento. Nessuno che fa un mestiere serio agisce su informazioni di cui non conosce l'origine.
Eppure tutta la prima generazione di chatbot aziendali ha normalizzato esattamente questo: un oracolo che risponde con sicurezza e senza bibliografia. Quando abbiamo iniziato a portare Celeris negli studi professionali, abbiamo capito subito che la feature più importante — più del modello stesso — era la capacità di risalire alla fonte.
Il problema non sono le allucinazioni
Quando si parla di RAG si dice sempre: "serve per ridurre le allucinazioni". È vero, ma è la metà della storia. Un buon retrieval riduce le allucinazioni statisticamente, ma non garantisce che il modello stia citando quel documento in quel punto.
Il vero problema è la verificabilità: anche se il modello dice la cosa giusta, se il tuo utente non può cliccare sul numero di riga e vedere il paragrafo originale, non lo userà mai per decisioni importanti. E a quel punto, hai costruito un giocattolo costoso.
Come lo facciamo tecnicamente
La pipeline in Celeris è volutamente semplice, perché la semplicità paga. Tre fasi.
Fase 1 — Chunking con metadata ricchi
Ogni documento viene spezzato in chunk di 400–600 token, ma ogni chunk viene memorizzato insieme a:
- Path completo del file sorgente (es.
/Contratti/2024/ACME_MSA_2024-03-15.pdf); - Numero di pagina (per PDF) o anchor strutturale (per DOCX/HTML);
- Data di ultima modifica, autore, dimensione — utili per disambiguare versioni;
- Un UUID stabile del chunk, così quando un documento cambia l'indice sa cosa invalidare.
Fase 2 — Retrieval con rerank
Prima passa un retrieval denso (embedding + BM25 ibrido, pesi 0.7/0.3). Poi un cross-encoder che rerank i top-50 e ne tiene solo 8. Questa fase costa poco ma aumenta la precisione in modo enorme: passiamo da un 63% di recall@5 a un 91%.
Fase 3 — Generazione con attribuzione forzata
Qui sta il trucco. Quando costruiamo il prompt per il modello, i chunk recuperati sono etichettati:
[DOC_1: contratto_ACME_2024.pdf p.12]
"La penale è stabilita in Euro 5.000 per ogni..."
[DOC_2: procedura_SL_007.pdf p.3]
"Il responsabile commerciale firma entro 48 ore..."
E istruiamo il modello a rispondere in un formato che deve contenere il tag [DOC_N] accanto a ogni affermazione. Il front-end poi intercetta quei tag e li sostituisce con link cliccabili al PDF originale, aperto sulla pagina giusta tramite #page=.
Il trucco di validazione
Nessun modello è perfettamente obbediente: prima o poi risponde senza citare. Per questo dopo la generazione facciamo un passaggio di validazione in un secondo modello più piccolo (un Llama 3.1 8B Instruct): "per ogni affermazione di questa risposta, la fonte citata la supporta davvero?".
Se il validator dice no, rigeneriamo con un prompt più stringente. Se dice sì parzialmente, marchiamo la risposta come "verifica manualmente" nell'UI — con un badge giallo — e mostriamo all'utente quali punti sono ritenuti incerti.
"La prima volta che ho visto la riga gialla che diceva 'questa parte il validator non la conferma', ho capito che non era un gadget. Era un sistema serio." — Un partner di studio legale, dopo due settimane di utilizzo reale.
Cosa succede nel dettaglio quando clicchi la citazione
L'esperienza utente è quella a cui puntiamo tutto: click sulla citazione → apre un pannello laterale con il PDF originale, scrollato al paragrafo giusto, con le parole rilevanti evidenziate in arancione. Niente redirect, niente download, niente "hai perso la tua conversazione".
Questo è possibile perché teniamo traccia, al momento del retrieval, del carattere iniziale e finale del chunk all'interno del PDF. Quando l'utente clicca, usiamo pdf.js lato client per renderizzare la pagina con un layer di highlight sopra.
Perché questo cambia tutto operativamente
Senza citazioni verificabili:
- L'AI è un suggerimento da ri-verificare a mano → raddoppia il lavoro invece di ridurlo.
- I professionali senior non la usano → resta un gadget per junior.
- Non puoi usarla per decisioni con responsabilità legale → utilità = zero.
Con citazioni verificabili:
- L'AI diventa un motore di ricerca spiegabile, non un oracolo.
- L'utente può fidarsi o non fidarsi in modo informato, caso per caso.
- Il sistema è auditable: puoi sempre ricostruire perché ha detto quello che ha detto.
Una nota finale su chi costruisce RAG
C'è una differenza enorme tra chi fa RAG come progetto interno, con qualche Python script, e chi lo porta in produzione con reale rigore. La differenza non sta nella tecnologia — tutti usiamo più o meno gli stessi componenti open source — sta nel fatto che qualcuno ha deciso che la citazione verificabile è un requisito non negoziabile, e qualcun altro la ha lasciata come nice-to-have.
Se stai valutando un fornitore di RAG aziendale, la domanda che spacca la categoria in due è semplice: quando clicco su un numero, cosa succede? Se la risposta è "beh, c'è un elenco di documenti consultati a fondo pagina", è un gadget. Se la risposta è "si apre il PDF alla pagina esatta con l'evidenziazione sopra il paragrafo", è un sistema professionale.
Per noi, non è una feature: è il prodotto.


