Come abbiamo visto prima, è un compito piuttosto banale rendere anonimo il testo poiché abbiamo gli offset di inizio e fine di ciascuna delle entità all’interno del testo. Tuttavia, utilizzeremo la funzionalità integrata di Presidio AnonymizerEngine
per aiutarci in questo.
from presidio_anonymizer import AnonymizerEngineanonymizer = AnonymizerEngine()
anonymized_text = anonymizer.anonymize(text=text,analyzer_results=results)
print(anonymized_text.text)
che ci dà
Applicant's name is <PERSON> and his he lives in <LOCATION>
and his phone number is <PHONE_NUMBER>.
Finora questo è fantastico, ma cosa succederebbe se volessimo che l’anonimizzazione fosse semplicemente un mascheramento? In tal caso possiamo passare la configurazione personalizzata al file AnonymizerEngine
che può eseguire un semplice mascheramento delle entità PII. Ad esempio, mascheriamo le entità con l’asterisco (*
) solo caratteri.
from presidio_anonymizer import AnonymizerEngine
from presidio_anonymizer.entities import OperatorConfigoperators = dict()
# assuming `results` is the output of PII entity detection by `AnalyzerEngine`
for result in results:
operators(result.entity_type) = OperatorConfig("mask",
{"chars_to_mask": result.end - result.start,
"masking_char": "*",
"from_end": False})
anonymizer = AnonymizerEngine()
anonymized_results = anonymizer.anonymize(
text=text, analyzer_results=results, operators=operators
)
print(anonymized_results.text)
ci da
Applicant's name is ******** and he lives in ********** and his phone number is ************.
Considerazioni sull’anonimizzazione
Ci sono alcune cose da tenere a mente quando decidi di anonimizzare le entità PII nel testo.
- Il default del Presidio
AnonymizerEngine
utilizza uno schema<ENTITY_LABEL>
per mascherare le entità PII (come<PHONE_NUMBER>
). Ciò può potenzialmente causare problemi soprattutto con la messa a punto di LLM. La sostituzione delle PII con etichette del tipo di entità può introdurre parole che portano un significato semantico, influenzando potenzialmente il comportamento dei modelli linguistici. - Pseudonimizzazione è uno strumento utile per la protezione dei dati, tuttavia è necessario prestare attenzione nell’eseguire la pseudonimizzazione sui dati di addestramento. Ad esempio, sostituendo tutto
NAME
entità con lo pseudonimoJohn Doe
o sostituendo tuttoDATE
entità con01-JAN-2000
nei dati di ottimizzazione potrebbero portare a distorsioni estreme nel modello ottimizzato. - Sii consapevole di come il tuo LLM reagisce a determinati caratteri o modelli nel tuo prompt. Alcuni LLM potrebbero aver bisogno di un modo molto specifico di modellare le richieste per ottenere il massimo dal modello, ad esempio Anthropic consiglia di utilizzare tag tempestivi. Essere consapevoli di ciò ti aiuterà a decidere come eseguire l’anonimizzazione.
Potrebbero esserci altri effetti collaterali generali dei dati anonimizzati sulla messa a punto del modello come perdita di contesto, deriva semantica, modello allucinazioni e così via. È importante ripetere e sperimentare per vedere quale livello di anonimizzazione è appropriato per le tue esigenze, riducendo al minimo gli effetti negativi sulle prestazioni del modello.
Rilevamento della tossicità con classificazione testuale
Per identificare se un testo contiene o meno contenuti tossici, utilizzeremo un approccio di classificazione binaria: 0
se il testo è neutro, 1
se il testo è tossico. Ho deciso di allenare a Modello base DistilBERT (senza custodia) che è una versione distillata di a Modello base BERT. Per i dati di addestramento, ho utilizzato il file Set di dati del puzzle.
Non entrerò nei dettagli su come è stato addestrato il modello e sulle metriche del modello, ecc. Tuttavia puoi fare riferimento a questo articolo su addestrare un modello base DistilBERT per compiti di classificazione del testo. Puoi vedere lo script di addestramento del modello che ho scritto Qui. Il modello è disponibile in HuggingFace Hub come tensor-trek/distilbert-toxicity-classifier
. Eseguiamo alcuni esempi di testo tramite inferenza per verificare cosa ci dice il modello.
from transformers import pipelinetext = ("This was a masterpiece. Not completely faithful to the books, but enthralling from beginning to end. Might be my favorite of the three.",
"I wish i could kill that bird, I hate it.")
classifier = pipeline("text-classification", model="tensor-trek/distilbert-toxicity-classifier")
classifier(text)
che ci dà –
(
{'label': 'NEUTRAL', 'score': 0.9995143413543701},
{'label': 'TOXIC', 'score': 0.9622979164123535}
)
Il modello classifica correttamente il testo come NEUTRAL
O TOXIC
con una fiducia piuttosto elevata. Questo modello di classificazione del testo, insieme alla classificazione delle entità PII discussa in precedenza, può ora essere utilizzato per creare un meccanismo in grado di garantire la privacy e la sicurezza all’interno delle nostre applicazioni o servizi basati su LLM.
Abbiamo affrontato privacy attraverso un meccanismo di riconoscimento delle entità PII e abbiamo affrontato il problema sicurezza parte con un classificatore di tossicità del testo. Puoi pensare ad altri meccanismi che potrebbero essere rilevanti per la definizione di sicurezza e privacy della tua organizzazione. Ad esempio, le organizzazioni sanitarie potrebbero essere più preoccupate per le PHI anziché per le PII e così via. In definitiva, l’approccio generale di implementazione rimane lo stesso, indipendentemente dai controlli che si desidera introdurre.
Con questo in mente, è giunto il momento di mettere tutto insieme in azione. Vogliamo essere in grado di utilizzare sia i meccanismi di privacy che quelli di sicurezza insieme a un LLM per un’applicazione in cui vogliamo introdurre funzionalità di intelligenza artificiale generativa. Utilizzerò il popolare LangChain quadro Sapore di pitone (disponibile anche in JavaScript/TS) per creare un’applicazione di intelligenza artificiale generativa che includa i due meccanismi. Ecco come appare la nostra architettura complessiva.
Fonte: towardsdatascience.com