RAG Guardrails per il gattone

Durante la realizzazione di un chatbot per il supporto ICT di primo livello, mi sono scontrato con la necessità di filtrare in qualche modo sia le domande in ingresso sia le risposte in uscita.

Il chatbot in questione è basato su Cheshire Cat AI (il “gattone“) e su un sistema RAG che usa come fonte dati le schede dei servizi e le FAQ pubblicate sul sito. In pratica risponde agli utenti partendo dalla documentazione ufficiale, invece di ricercare le risposte in rete o all’interno della conoscenza di base.

Un chatbot pubblico, però, è un po’ come uno sportello aperto a tutti: prima o poi arriva chi incolla un romanzo al posto di una domanda, chi prova a fargli dimenticare le istruzioni (la cosiddetta prompt injection), chi scrive il proprio codice fiscale o l’IBAN e chi, semplicemente, sfoga la propria frustrazione con un linguaggio poco elegante.

È nato così RAG Guardrails, un plugin che raccoglie una serie di filtri (guardie) ognuna dedicata a uno di questi aspetti e attivabile e configurabile singolarmente.

Dei buttafuori per il gattone, insomma.

Funzionamento del plugin

Il plugin interviene in due momenti della vita di una domanda, sfruttando due hook di Cheshire Cat AI, cioè i punti in cui un plugin può inserirsi nel flusso di elaborazione:

  • in ingresso (hook fast_reply): è il primo punto in cui si può intercettare il messaggio dell’utente. Se una guardia scatta, il chatbot risponde subito con un messaggio di cortesia, configurabile dal backoffice, che invita a riformulare la domanda o a scrivere all’Help Desk. La domanda non arriva alla ricerca nei documenti, non consuma token del modello linguistico e non finisce nella memoria del chatbot;
  • in uscita (hook before_cat_sends_message): la risposta generata viene controllata prima di essere inviata e, se contiene dati personali, viene sostituita con un messaggio standard, anche questo configurabile dal backoffice.

Le guardie usano tre tecniche diverse, in ordine crescente di “intelligenza” e di costo:

  • codice puro: controlli semplici e deterministici, come la lunghezza massima del messaggio;
  • espressioni regolari e validazioni: riconoscono schemi noti, come indirizzi e-mail, numeri di telefono, IBAN, codici fiscali o le frasi tipiche di chi cerca di manipolare il chatbot;
  • modelli di classificazione: piccoli modelli di machine learning, eseguiti in locale, che valutano il significato del testo e colgono anche quello che sfugge alle espressioni regolari. Sono più potenti, ma richiedono memoria e tempo di calcolo, per questo sono disattivati di default.

Tutti i messaggi di risposta sono bilingui (italiano e inglese) e personalizzabili.

Funzionalità del plugin

Le guardie disponibili sono cinque, ognuna appartenente a un gruppo che indica il tipo di rischio da cui protegge:

Guardia Fase Gruppo Tecnica Scopo
message_length ingresso limits codice Blocca i messaggi più lunghi del limite impostato (1000 caratteri di default).
personal_data ingresso privacy regex e validazioni Blocca i messaggi che contengono e-mail, numeri di telefono, IBAN o codici fiscali.
prompt_injection ingresso security regex e classificatore (opzionale) Blocca i tentativi di modificare le istruzioni del chatbot o di fargli rivelare il prompt di sistema.
offensive_input ingresso tone classificatore Blocca i messaggi offensivi o violenti.
output_personal_data uscita privacy regex e validazioni Impedisce che una risposta contenente dati personali arrivi all’utente.

Le guardie sulla privacy hanno una lista di contatti ammessi, configurabili dal backoffice: i recapiti pubblici (per esempio il telefono di un ufficio indicato nelle schede dei servizi) possono comparire tranquillamente nelle domande e nelle risposte senza far scattare l’allarme. L’indirizzo dell’Help Desk è sempre considerato ammesso.

Installazione e configurazione

Il plugin è pubblicato nel registro ufficiale dei plugin di Cheshire Cat AI, quindi l’installazione è davvero semplice: basta aprire la sezione Plugins del pannello di amministrazione, cercare RAG Guardrails tra quelli disponibili, installarlo e attivarlo. Al resto, comprese le dipendenze Python, ci pensa il gattone. Dalla pagina delle impostazioni del plugin si può configurare praticamente tutto: l’indirizzo dell’Help Desk da suggerire agli utenti, la lista dei contatti pubblici ammessi, la lunghezza massima dei messaggi, quali tipi di dati personali bloccare, i testi delle risposte e, per le guardie basate su modelli, il modello da usare, la soglia di attivazione e il dispositivo su cui eseguirlo (CPU o GPU).

Prima di andare in produzione è importante almeno sostituire l’indirizzo segnaposto helpdesk@example.org con quello vero.

Per tutti i dettagli rimando al README del progetto.

Gestione dei modelli

Le due guardie che usano dei modelli sono quella sulla prompt injection (nella sua parte opzionale) e quella sul linguaggio offensivo. I modelli si scelgono da un menu e sono tutti disponibili su Hugging Face: per la prompt injection, per esempio, c’è Llama Prompt Guard 2 di Meta, che richiede di accettarne la licenza e di inserire un token di Hugging Face nelle impostazioni.

Il plugin non contiene i modelli: vengono scaricati alla prima domanda che li richiede, quindi il primo utente sperimenterà un po’ di attesa. Anche le librerie necessarie (transformers e PyTorch) vengono installate automaticamente da Cheshire Cat all’attivazione del plugin, ma non sono proprio leggerissime.

Per questo il consiglio è di preparare un’immagine Docker del gattone in cui le dipendenze del plugin e, se usati, anche i modelli siano già presenti; se non si ha una GPU conviene usare la versione di PyTorch solo CPU, che è molto più snella. Attivando poi l’opzione Preload classifiers on plugin activation, i modelli abilitati vengono caricati all’avvio del sistema e nessun utente dovrà aspettare.

Un’ultima nota: se un modello non riesce a caricarsi, la guardia lo lascia passare (fail open) invece di bloccare tutto. Meglio un buttafuori distratto che un locale chiuso.

 

Esempi d’uso

Questo è un esempio di filtraggio di dati personali:

Questo, invece, è un esempio di barriera a una prompt injection:

 

Esempio di contenuti offensivi:

Conclusioni

RAG Guardrails ha reso il nostro help desk virtuale più robusto: i messaggi problematici vengono fermati prima ancora di arrivare al modello linguistico, i dati personali restano fuori dal sistema e gli utenti ricevono comunque una risposta gentile con l’indicazione di chi contattare.

Naturalmente non è una soluzione magica: non verifica che le risposte siano corrette o fondate sui documenti, e un utente abbastanza creativo può sempre trovare il modo di aggirare un filtro. È però un primo livello di difesa semplice, economico e facile da adattare alle proprie esigenze, a cui è possibile aggiungere nuove guardie in futuro.

Il codice è open source, rilasciato con licenza GPL v3: se gestite un chatbot basato su Cheshire Cat AI, provatelo e fatemi sapere com’è andata.

 

Fonti e riferimenti

10 ore ago

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Moderazione dei commenti attiva. Il tuo commento non apparirà immediatamente.