Anonimizarea datelor personale (PII) cu Microsoft Presidio în LLMOps, Evaluare & Securitate AI

Microsoft Presidio detectează date personale în text (AnalyzerEngine) și le înlocuiește, maschează sau criptează (AnonymizerEngine) înainte ca textul să ajungă la un LLM.

Configurare & comandă
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine

analyzer = AnalyzerEngine()          # implicit: recunoaștere pentru engleză
anonymizer = AnonymizerEngine()

text = "My name is John Smith and my email is john@example.com"
rezultate = analyzer.analyze(text=text, language="en")
print(anonymizer.anonymize(text=text, analyzer_results=rezultate).text)
# operatorul implicit replace pune tipul entității: <PERSON>, <EMAIL_ADDRESS>

Microsoft Presidio este un SDK open-source pentru detectarea și anonimizarea datelor personale. AnalyzerEngine găsește entități (nume, email, telefon, card, IBAN, IP etc.) prin tipare, verificări de checksum, context și modele NLP; AnonymizerEngine le transformă cu operatori precum replace, redact, mask, hash, encrypt, keep sau custom.

În configurația implicită Presidio are recunoaștere și modele doar pentru engleză. Lista oficială de entități are tipuri globale și tipuri pe țări (SUA, Marea Britanie, Spania, Italia, Polonia, India, Germania etc.), dar nu are entități pentru România: un CNP trebuie adăugat cu un PatternRecognizer propriu, iar pentru textul românesc trebuie configurat un model NLP pentru limba română.

Un flux uzual: textul utilizatorului trece prin Presidio înainte de apelul la model, iar datele sunt înlocuite sau criptate. Operatorul encrypt este reversibil: DeanonymizeEngine cu operatorul decrypt și aceeași cheie reface valorile originale, de exemplu pentru afișarea către un utilizator autorizat. Trimiterea datelor personale către un furnizor extern rămâne o prelucrare supusă GDPR, chiar și cu anonimizare parțială.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
AnalyzerEngine().analyze(text, language) Întoarce entitățile găsite, cu tip, poziție și scor.
AnonymizerEngine().anonymize(text, analyzer_results, operators) Aplică operatorii; fără operator specificat se folosește replace cu <TIP_ENTITATE>.
replace / redact / mask Înlocuiește cu o valoare, elimină complet sau maschează cu un caracter (masking_char, chars_to_mask).
hash Hash cu sare (sha256 implicit, sau sha512).
encrypt / decrypt Criptare reversibilă cu cheie; DeanonymizeEngine face decriptarea.
PatternRecognizer Recunoaștere proprie pe bază de expresii regulate sau listă de cuvinte; se adaugă cu analyzer.registry.add_recognizer().

Exemple practice și scenarii reale

Exemplul 1: Recunoaștere proprie pentru CNP

Tipar simplificat pentru 13 cifre cu lună și zi valide, fără verificarea cifrei de control. RO_CNP este un nume ales de tine, nu o entitate Presidio.

from presidio_analyzer import AnalyzerEngine, Pattern, PatternRecognizer

cnp = PatternRecognizer(
    supported_entity="RO_CNP",
    patterns=[Pattern(
        name="cnp",
        regex=r"\b[1-9]\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{6}\b",
        score=0.6,
    )],
)
analyzer = AnalyzerEngine()
analyzer.registry.add_recognizer(cnp)

Exemplul 2: Mascarea parțială a unui număr de card

from presidio_anonymizer.entities import OperatorConfig

anonymizer.anonymize(
    text=text,
    analyzer_results=rezultate,
    operators={"CREDIT_CARD": OperatorConfig(
        "mask", {"masking_char": "*", "chars_to_mask": 12, "from_end": False})},
)

Exemplul 3: Criptare reversibilă

from presidio_anonymizer import DeanonymizeEngine
from presidio_anonymizer.entities import OperatorConfig

anonimizat = anonymizer.anonymize(
    text=text, analyzer_results=rezultate,
    operators={"DEFAULT": OperatorConfig("encrypt", {"key": CHEIE})})
original = DeanonymizeEngine().deanonymize(
    text=anonimizat.text, entities=anonimizat.items,
    operators={"DEFAULT": OperatorConfig("decrypt", {"key": CHEIE})})

Greșeli frecvente și capcane

  • Aștepți ca Presidio să recunoască singur CNP-ul sau seria de buletin. Nu există entități românești în lista oficială; adaugă recunoașteri proprii și testează-le.
  • Rulezi analiza cu language="en" pe text în română și te bazezi pe detecția numelor. Modelul NLP implicit este pentru engleză; configurează unul pentru română sau verifică rezultatele.
  • Păstrezi cheia de criptare în același loc cu datele anonimizate. Cu cheia, encrypt nu mai protejează nimic.

Noțiuni și module înrudite