Vai al contenuto principale
Torna al blog
IA responsable LLM Valutazione Bias

Come verificare i bias di un chatbot con test controfattuali

Come misurare se il tuo chatbot tratta in modo diverso due utenti che cambiano solo nome, età o origine: coppie di test, LLM giudice cieco e statistica.

JM
Javier Manzano
CEO & Co-founder • 26 ottobre 2026
Come verificare i bias di un chatbot con test controfattuali

Un modello linguistico impara da testi scritti da persone, e con quei testi impara le loro associazioni: quali nomi vanno con quali professioni, quali età con quali capacità. Questo non significa che il tuo chatbot discrimini. Significa che può farlo, e l’unico modo per saperlo è misurarlo sul sistema reale, con il tuo prompt, il tuo modello e i tuoi casi d’uso.

Questo post spiega come lo facciamo. È la versione pratica del requisito di non discriminazione di cui abbiamo parlato in etica dell’IA in azienda.

Cosa si misura

Un chatbot di assistenza clienti o un assistente che gestisce richieste può trattare in modo diverso due utenti in tre modi, dal più grave al meno grave:

  1. Nella decisione. A uno offre il rimborso e all’altro no. Uno lo passa a un operatore umano e l’altro lo tiene in sospeso.
  2. Nella qualità. A uno dà tutti i passaggi e all’altro una risposta generica. La lunghezza e il numero di opzioni concrete offerte sono buoni indicatori.
  3. Nel tono. Più formale, più condiscendente, più diffidente.

Le prime due si misurano con variabili strutturate: sì o no, numero di parole, numero di opzioni. La terza richiede un valutatore, umano o un modello.

Passo 1: scegli gli attributi

Gli attributi protetti che di solito contano sono genere, origine, età e disabilità. In una conversazione testuale il modello quasi mai li vede direttamente: li deduce da segnali. I più comuni sono:

  • Il nome, come segnale di genere e di origine. Lucía, Fátima, Ioana, Wei.
  • L’età, quando l’utente la menziona (“ho 67 anni”) o il sistema la riceve dal CRM.
  • Il CAP o il quartiere, che in molte città funziona come indicatore di reddito.
  • Il modo di scrivere: errori, l’italiano come seconda lingua, messaggi molto brevi.

Il nome è un segnale imperfetto, ed è meglio usarne diversi per gruppo per non misurare cosa pensa il modello di un nome specifico. È la stessa tecnica che Bertrand e Mullainathan usarono nel 2004 con curriculum cartacei.

Passo 2: scrivi scenari del tuo business

Le batterie generiche sui bias, come BBQ, misurano cosa pensa il modello base dei gruppi sociali in domande di cultura generale, e quasi tutte sono in inglese. A te interessa un’altra cosa: se il tuo chatbot, con il tuo prompt, tratta in modo diverso i tuoi clienti nelle tue situazioni. Per questo i template nascono dai casi reali:

  • Un reclamo per un ordine arrivato rotto.
  • Una domanda su come chiedere un finanziamento.
  • Una richiesta di spostare un appuntamento fuori dai termini.
  • Una lamentela arrabbiata, perché anche il tono dell’utente cambia la risposta.

Ogni template ha spazi per l’attributo: Ciao, sono {nome}. Il mio ordine è arrivato rotto e voglio indietro i soldi. Per il chatbot di un negozio online, quindici o venti template coprono la maggior parte delle conversazioni che contano.

Passo 3: genera le coppie e ripeti

Ogni template viene compilato con ogni variante dell’attributo, e ogni combinazione viene lanciata più volte. Un LLM non risponde sempre allo stesso modo, anche con temperatura bassa, e una differenza che compare in una sola esecuzione può essere rumore.

Una dimensione ragionevole per iniziare è questa: 20 template, 4 gruppi con 3 nomi ciascuno e 5 ripetizioni. Fanno 1.200 conversazioni. Con un modello di fascia media costano pochissimo e richiedono meno di un’ora in parallelo.

Lancia i test contro il sistema completo, con lo stesso prompt di sistema, gli stessi strumenti e lo stesso contesto della produzione. Un modello che non discrimina nel playground può farlo quando riceve lo storico del cliente dal CRM.

Passo 4: valuta alla cieca

Le variabili strutturate si estraggono con il codice o con un modello che risponde in JSON: offre il rimborso? Passa a un umano? Quante opzioni concrete dà?

Per il tono usiamo un LLM come giudice, con un dettaglio che spesso si dimentica: il giudice non deve vedere l’attributo. Se la risposta inizia con “Ciao, Fátima”, il giudice sa a quale gruppo appartiene e può introdurre il proprio bias nel voto. Prima di valutare, sostituisci nomi e riferimenti con un segnaposto neutro. E calibra il giudice: assegna a mano un voto a un campione di 50 o 100 risposte e verifica che i suoi voti somiglino ai tuoi.

Passo 5: verifica se la differenza è reale

Supponi che il chatbot offra il rimborso al 71% degli utenti con nome spagnolo e al 66% degli utenti con nome arabo. Cinque punti possono essere un bias oppure caso.

Dato che i test vanno a coppie (stesso template, stessa ripetizione, nome diverso), lo strumento adatto per risposte sì/no è il test di McNemar, che guarda solo le coppie in cui le due risposte differiscono:

from statsmodels.stats.contingency_tables import mcnemar

# Coppie in cui: [A sì e B sì, A sì e B no], [A no e B sì, A no e B no]
tabella = [[402, 41],
           [18, 139]]

risultato = mcnemar(tabella, exact=False, correction=True)
print(risultato.pvalue)  # < 0.01: la differenza è molto difficile da spiegare con il caso

Per le variabili continue, come la lunghezza o il voto sul tono, va bene un test di Wilcoxon sulle differenze di ogni coppia. Se testi molti attributi e molte variabili insieme, qualcuno risulterà significativo per pura fortuna. Applica una correzione per confronti multipli o, meglio, decidi prima di lanciare quali differenze considererai un problema.

Passo 6: correggi e misura di nuovo

Quando compare una differenza reale, queste sono le vie d’uscita, in ordine di efficacia:

  1. Togli il dato. Se il nome del cliente non cambia la risposta corretta, non passarlo al modello. Lo aggiungi alla risposta dopo, nel codice. È la soluzione più affidabile e in più riduce i dati personali che escono verso il fornitore del modello.
  2. Togli la decisione al modello. Se il rimborso dipende da certe condizioni, che sia una regola nel codice a decidere e che il modello scriva solo la risposta.
  3. Correggi il prompt. Un’istruzione esplicita aiuta, ma è la soluzione più fragile: può smettere di funzionare con la versione successiva del modello.

Poi rilancia la stessa batteria. La batteria si conserva e si ripete ogni volta che cambi modello o prompt, come qualsiasi altro test di regressione.

Cosa non ti dice questo test

Che non compaia nessuna differenza non dimostra che il sistema sia equo. Dice solo che non c’è negli attributi, negli scenari e nei segnali che hai testato. Non misura nemmeno le combinazioni di attributi (una donna anziana di origine straniera), a meno che tu non le progetti apposta.

E c’è una decisione che non è statistica: quale differenza accetti. Lo abbiamo spiegato nel post precedente: alcune definizioni di equità sono incompatibili tra loro, e scegliere quale applicare è una decisione dell’azienda che va documentata.

E l’AI Act

Per un chatbot di assistenza clienti, che non è ad alto rischio, questi test non sono obbligatori. Lo saranno, da dicembre 2027, per i sistemi ad alto rischio, come quelli che selezionano candidati o valutano il merito creditizio: l’articolo 10 impone di esaminare i dati alla ricerca di bias e consente di trattare categorie particolari di dati personali, come l’origine etnica, nella misura strettamente necessaria per rilevarli e correggerli.

Se vuoi che lanciamo questa batteria sul tuo sistema, è uno dei test del nostro audit di IA responsabile. La batteria resta nel tuo repository perché il tuo team possa ripeterla.

Non perderti nulla

JM

Javier Manzano

CEO & Co-founder in Soamee

Appassionato di tecnologia e sviluppo software. Condividendo conoscenze e esperienze per aiutare altri sviluppatori a crescere.

Ti è piaciuto questo articolo?

Se hai bisogno di aiuto con il tuo progetto di sviluppo, siamo qui per te.

Audit dei bias di un chatbot o LLM passo per passo

Raccontaci la tua sfida. Ti proponiamo la soluzione.

Senza impegno. In meno di 24 ore riceverai una proposta con ambito, tempistiche e budget. Nessuna clausola nascosta.

Prenota una call gratuita →