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à".
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.
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.
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.
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 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.
Quando la domanda non è chiara il sistema chiede un chiarimento; quando un controllo non passa, la richiesta fallisce invece di restituire una risposta dubbia.
Il modello linguistico interviene al massimo in tre punti; tutto ciò che è numero resta codice.
Quattro errori di questo progetto, ancora in sviluppo e test. Gli esempi sono costruiti per illustrare l'errore, non sono domande o dati reali.
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
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.
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
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?
Il metodo serve anche perché il risultato dipende molto dal modello usato, e nessuna delle due strade è gratuita.
Nelle prove del progetto descritto, i servizi online offrono prestazioni migliori della configurazione locale; vanno comunque considerati questi aspetti:
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:
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.
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à
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
La domanda in linguaggio naturale, con gli eventuali filtri espliciti di chi la pone.
Cerca nella domanda i valori che esistono davvero nei dati, come nomi e codici, e le indicazioni di quantità.
Le domande più frequenti vengono riconosciute da regole deterministiche, senza interpellare un modello.
La domanda è spiegata per intero? Se una parte resta scoperta, il percorso rapido viene scartato invece di dare una risposta parziale.
Solo se nessun percorso rapido basta: il modello indica se la domanda chiede un'analisi o una ricerca.
In base alla classificazione, una delle due strade:
Per le analisi, un compilatore deterministico traduce la domanda in un piano.
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.
Ogni valore del piano viene confrontato con i dati reali. Se è sconosciuto o ambiguo, si chiede un chiarimento.
Se nel frattempo i dati sono cambiati, la preparazione si ripete: un piano non aggiornato non viene mai eseguito.
In base al tipo di piano, una delle due strade:
Conteggi, somme e analisi li calcola il database; testo e citazioni li genera il codice. Nessun modello.
Ricerca esatta nel database o semantica su un indice vettoriale, confermata poi sui dati attivi. Al massimo 40 evidenze.
Solo per le ricerche: il modello scrive la risposta citando gli identificativi delle evidenze ricevute.
Il server controlla ogni identificativo e ricostruisce le citazioni. Un riferimento sconosciuto fa fallire la richiesta.
Testo, stato, piano eseguito e citazioni, con le note sui limiti applicati.
Questi riferimenti sostengono i criteri tecnici generali. Le misure sul mio hardware descrivono quella configurazione e non sono trasferibili automaticamente ad altre.