Luca Morelli
Software engineer e analista
Team lead

Interrogare i dati aziendali con l'IA: quando la risposta deve essere esatta.

Sto sviluppando un'applicazione che permette di interrogare i dati aziendali in linguaggio naturale, a partire dai documenti di consegna importati. Combina ricerca sui dati, modelli linguistici e codice tradizionale (in gergo, è un sistema RAG): il modello aiuta a interpretare le richieste, mentre conteggi e somme sono calcolati dal database. Il requisito guida è la precisione: se chiedete quali sono i prodotti più venduti in un periodo, il risultato deve coincidere con quello del gestionale. Il progetto è attualmente in fase di sviluppo e test.

Il dato deve coincidereCon quello del gestionale, non somigliargli.
In fase di sviluppo e testUna competenza in crescita, non una specializzazione consolidata: le tecnologie cambiano rapidamente.
RAGPythonPostgreSQLQdrantModelli open

Da quale prospettiva scrivo

Studio machine learning dal 2020 circa, poi deep learning, IA generativa e modelli linguistici, attraverso corsi, documentazione e sperimentazione: è la base su cui lavoro. L'esperienza diretta su progetti reali è molto più recente, e con grandi piattaforme di IA generativa in produzione è ancora limitata.

Queste osservazioni nascono dall'incontro tra quello studio e quasi trent'anni di sviluppo di software reale. Guardo soprattutto alla sostenibilità: un sistema deve offrire valore sufficiente a giustificare sviluppo, verifica e gestione nel tempo.

Cosa significa per chi commissiona il progetto

Una prima versione che risponde in modo plausibile si costruisce in fretta. Un sistema che dà il numero giusto è un altro lavoro: il modello linguistico, da solo, non garantisce l'esattezza, e va affiancato da codice tradizionale che calcola e controlla. Lo sforzo cresce molto più della precisione che si ottiene.

Le domande si raccolgono prima

Lo sviluppo è guidato da una serie di domande realistiche raccolte con voi. In questo scenario non credo si possa dire "chiedi quello che vuoi e ti risponderà".

Ogni passaggio è verificato

Ogni fase ha un proprio controllo, fin dall'inizio: si sa sempre in quale punto un risultato smette di essere corretto. Altrimenti l'errore si scopre alla fine, senza capire dove nasce.

Meglio nessuna risposta che una inventata

Quando la domanda non è chiara il sistema chiede un chiarimento; quando un controllo non passa, la richiesta fallisce invece di restituire una risposta dubbia.

Come funziona, in breve

Il modello linguistico interviene al massimo in tre punti; tutto ciò che è numero resta codice.

  1. Il codice riconosce nella domanda nomi, codici e quantità che esistono davvero nei dati.
  2. Le domande più frequenti seguono percorsi fissi, senza passare da un modello.
  3. Per le altre, il modello propone come cercare; il codice controlla la proposta prima di eseguirla.
  4. Conteggi e somme li calcola il database; il modello scrive solo il testo delle risposte di ricerca, citando dati che il sistema ha verificato.

Cosa non viene mai lasciato al modello

  • I limiti indicati da chi pone la domanda, come un periodo o un cliente, prevalgono su qualunque proposta del modello.
  • Il modello non interroga mai direttamente il database: propone, in un formato controllato, e il codice decide.
  • Conteggi, somme e analisi li calcola il database e li presenta il codice: non passano mai dal modello che scrive la risposta.
  • La ricerca per somiglianza trova solo candidati; il database conferma quelli che appartengono ai dati in uso.
  • La risposta può citare solo dati forniti dal sistema, e ogni citazione viene ricontrollata.

Dove ho sbagliato e cosa ne ho ricavato

Quattro errori di questo progetto, ancora in sviluppo e test. Gli esempi sono costruiti per illustrare l'errore, non sono domande o dati reali.

1. La domanda letta male, in silenzio

L'errore. Il cliente Rossi, nella chat sul sito dell'azienda, chiede: "Quanto mi avete consegnato nel 2025?". Il programma compone la richiesta e la manda al motore. Se il modello perde il nome del cliente, il sistema risponde con il totale dell'azienda: Rossi vede dati che non sono suoi. Il numero è vero e nessun controllo scatta: non è un errore, è un risultato plausibile. Questo scenario è possibile, non è un uso attuale del progetto, ma il rischio non dipende dal tipo di dato né da chi chiede.

Vale anche dentro l'azienda: un collaboratore che chiede "il budget del mio reparto" e riceve quello di tutti, o che vede i risultati dei singoli agenti commerciali. Succede anche in altri modi: il modello ignora un periodo o un prodotto, oppure il programma applica un valore predefinito anche se la richiesta ne indicava uno. Basta anche una parola: "ordini a giugno 2025" e "ordini fino a giugno 2025" indicano un mese e un intervallo. Il modello lo legge bene il più delle volte, talvolta no, e un errore raro non si vede in una dimostrazione.

Come ci si accorge. Il perimetro di chi può vedere cosa lo applica il codice, a partire da chi sta chiedendo, e non dipende da come il modello legge la domanda: un'istruzione al modello può essere aggirata. Poi chiedo al modello non solo cosa ha capito, ma quali parole della domanda ha usato e dove. Il codice rilegge la domanda: se prima di "a giugno 2025" c'era "fino", il modello l'ha escluso e il codice corregge l'interpretazione. Le parole di chi chiede prevalgono su ciò che il modello propone.

Esiste anche l'errore opposto: il modello rifiuta la domanda perché la giudica non abbastanza univoca. Non espone dati, ma chi chiede resta senza risposta, e lo conto come errore.

Cosa chiedere a chi sviluppa. Cosa impedisce a un utente di vedere dati non suoi: il modo in cui il modello legge la domanda, o un controllo che non dipende da quello? Cosa fa il sistema quando una parte della domanda non risulta spiegata da ciò che ha interpretato?

Sicurezza: a quali dati può arrivare il sistema

2. La precisione si misura, non si sente

L'errore. Giudicare il sistema da qualche domanda provata a mano. Funziona sulle domande che ci si ricorda e sbaglia quelle che nessuno ha provato.

Come ci si accorge. Una serie di domande di riferimento, ciascuna con la risposta attesa scritta e approvata da una persona: da qualche decina a circa 150, a seconda che si verifichi una singola modifica o si qualifichi l'intera procedura. A ogni esecuzione conto le interpretazioni sbagliate (periodo, cliente o prodotto ignorato, valore predefinito al posto di quello indicato), i rifiuti per ambiguità e le differenze tra due esecuzioni della stessa domanda: anche a parità di prompt, la stessa domanda può dare risposte diverse. La messa a punto la faccio su una parte delle domande, la verifica su un'altra, e non scrivo mai nel codice le parole di una domanda di prova.

Cosa chiedere a chi sviluppa. Chi ha scritto e chi ha approvato le risposte attese? Quante sono, e cosa succede alle domande a cui il sistema non risponde? Le risposte attese le devono scrivere e approvare persone dell'azienda: è tempo da mettere in conto.

3. Un modello alla volta

L'errore. Provare più modelli insieme. Oltre a Qwen3.8-27B ho provato Gemma 4 nelle versioni 26B e 31B: davano più interpretazioni sbagliate, dello stesso tipo di quelle viste sopra. Probabilmente richiederebbero un prompt messo a punto per ciascun modello. Con tre modelli non distinguevo il difetto del modello da quello del codice.

Come ci si accorge. Mi sono fermato su un modello, fino a una baseline che funziona e si misura. Provare gli altri per vedere le differenze è il passo successivo, non ancora fatto. Cambiare modello non è una sostituzione: è un nuovo lavoro di prova.

Cosa chiedere a chi sviluppa. Su quanti modelli è stato provato il sistema? Cosa cambia, e cosa resta uguale, se si cambia modello?

Non restare legati a un fornitore

Cambiare modello: solo con prove

4. Una regola per problema, non una toppa per caso

L'errore. Una revisione trova un problema e lo correggo. La revisione successiva ne trova un altro, diverso ma nella stessa area della procedura: spesso un altro aspetto dello stesso problema, talvolta una conseguenza della correzione precedente. Ogni correzione, presa da sola, è giusta; ma procedere un punto alla volta non chiude la serie, perché non si interviene sulla regola da cui dipende tutta l'area. Esempio costruito: aggiungo il filtro per cliente alla ricerca; la revisione successiva trova che, quando il filtro non si può applicare, la ricerca ricade su un valore predefinito; quella dopo trova lo stesso punto debole nell'esportazione.

Come ci si accorge. Quando due revisioni trovano problemi diversi nella stessa area, non correggo il terzo punto. Per ogni problema adotto una sola regola, scritta in modo che nel dubbio blocchi: se il sistema non può dimostrare che una risposta è consentita, non la dà. La regola la verifico con un test generato su molti casi, non con pochi esempi scritti a mano. Un caso nuovo si aggiunge ai casi generati, non diventa una correzione a parte.

Cosa chiedere a chi sviluppa. Quando una revisione trova un altro problema nella stessa area, cosa cambia: un'altra correzione o una regola? Il test copre i casi possibili o solo quelli già visti? Nel dubbio, il sistema risponde o si ferma?

Quanto costa farlo funzionare

Il metodo serve anche perché il risultato dipende molto dal modello usato, e nessuna delle due strade è gratuita.

Servizi online

Nelle prove del progetto descritto, i servizi online offrono prestazioni migliori della configurazione locale; vanno comunque considerati questi aspetti:

  • il costo dipende dal consumo del servizio, e con un carico elevato può crescere rapidamente;
  • la privacy dipende da cosa arriva al modello: esistono contratti con elaborazione in Europa e senza conservazione dei dati. In questo progetto, comunque, la parte sensibile la estrae il codice deterministico, e il modello non la vede.

Modello aperto su un server proprio

Un modello open su un server con GPU evita la tariffa per chiamata e tiene i dati in casa. Può convenire con volumi alti e costanti, oppure essere necessario quando i dati non possono essere inviati a servizi esterni. Comporta comunque costi e limiti da valutare:

  • l'hardware ha costi di acquisto e gestione, da verificare per la configurazione scelta;
  • nella configurazione che ho provato (Qwen3.8-27B quantizzato, su 32 GB) si reggono 2–3 richieste contemporanee;
  • una richiesta richiede 10 secondi e oltre, e l'esecuzione va ottimizzata;
  • nei modelli più piccoli che ho provato, precisione e gestione dell’italiano sono limiti da verificare sul compito specifico.

Per la mia esperienza diretta, tutto questo richiede un'analisi e uno sviluppo molto precisi, con un'attenzione scrupolosa alle esigenze del cliente: il contrario di quello che si legge spesso online.

E i sistemi che chiamano il modello molte volte?

Con i limiti della configurazione locale descritta sopra, considero impegnativo sostenere flussi che chiamano il modello molte volte per ogni richiesta. Vedo più spazio per richieste di alto valore e volumi limitati, oppure per servizi più veloci il cui costo sia compatibile con il lavoro svolto. Ogni chiamata consuma token, e quanti ne servano per una risposta corretta si sa solo misurandolo (il costo dell'intero servizio). È un giudizio sulla configurazione provata, da rivedere se cambiano modelli, hardware o requisiti: modelli più economici e flussi meglio circoscritti possono cambiare il conto.

Le tre strade a confronto: costi e continuità

Come valutare la fattibilità di un progetto IA

Come scegliere e mantenere il modello nel tempo

Il flusso completo, per chi vuole il dettaglio tecnico

Il modello linguistico interviene al massimo in tre punti; conteggi, somme, applicazione dei filtri e citazioni restano codice deterministico.

Codicepassaggio deterministicoModellochiamata a un modello linguistico

Preparazione nulla viene ancora eseguito

  1. 01DomandaCodice

    La domanda in linguaggio naturale, con gli eventuali filtri espliciti di chi la pone.

  2. 02Riconoscimento dei valoriCodice

    Cerca nella domanda i valori che esistono davvero nei dati, come nomi e codici, e le indicazioni di quantità.

  3. 03Percorsi rapidiCodice

    Le domande più frequenti vengono riconosciute da regole deterministiche, senza interpellare un modello.

  4. 04Controllo di coperturaCodice

    La domanda è spiegata per intero? Se una parte resta scoperta, il percorso rapido viene scartato invece di dare una risposta parziale.

  5. 05ClassificazioneModello

    Solo se nessun percorso rapido basta: il modello indica se la domanda chiede un'analisi o una ricerca.

  6. In base alla classificazione, una delle due strade:

    06aCompilazioneCodice

    Per le analisi, un compilatore deterministico traduce la domanda in un piano.

    06bPianificazioneModello

    Per le ricerche, il modello propone da uno a tre passi in JSON tipizzato. Il codice li valida: schema, filtri di chi chiede, termini assenti dalla domanda.

  7. 07Risoluzione dei valoriCodice

    Ogni valore del piano viene confrontato con i dati reali. Se è sconosciuto o ambiguo, si chiede un chiarimento.

  8. 08Piano preparatoCodice

    Se nel frattempo i dati sono cambiati, la preparazione si ripete: un piano non aggiornato non viene mai eseguito.

Esecuzione

  1. In base al tipo di piano, una delle due strade:

    09aAnalisi e aggregatiCodice

    Conteggi, somme e analisi li calcola il database; testo e citazioni li genera il codice. Nessun modello.

    09bRicercaCodice

    Ricerca esatta nel database o semantica su un indice vettoriale, confermata poi sui dati attivi. Al massimo 40 evidenze.

  2. 10Stesura della rispostaModello

    Solo per le ricerche: il modello scrive la risposta citando gli identificativi delle evidenze ricevute.

  3. 11Verifica delle citazioniCodice

    Il server controlla ogni identificativo e ricostruisce le citazioni. Un riferimento sconosciuto fa fallire la richiesta.

  4. 12RispostaCodice

    Testo, stato, piano eseguito e citazioni, con le note sui limiti applicati.

Le altre uscite

  • Chiarimento o domanda non supportata. Quando il piano non si può costruire con certezza: un testo deterministico, mai una risposta inventata.
  • Errore. Se la validazione fallisce, se il modello cita un'evidenza inesistente o se i dati continuano a cambiare: la richiesta fallisce invece di restituire una risposta dubbia.

Fonti a supporto

Questi riferimenti sostengono i criteri tecnici generali. Le misure sul mio hardware descrivono quella configurazione e non sono trasferibili automaticamente ad altre.

Ultimo aggiornamento dei contenuti:

State valutando l'IA nelle vostre applicazioni?

Curriculum dettagliato e referenze su richiesta.