PII Masker
Wielowarstwowa anonimizacja i ochrona danych osobowych w systemach sztucznej inteligencji
Dlaczego ochrona PII w systemach AI jest kluczowa?
Wysyłanie zapytań użytkowników i dokumentów firmowych do zewnętrznych modeli chmurowych niesie ryzyko wycieku informacji poufnych i naruszenia przepisów RODO/GDPR.
Tradycyjne wyrażenia regularne często generują dużą liczbę fałszywych alarmów (false positives) lub pomijają nietypowo sformatowane dane osobowe. Z kolei modele czysto neuronowe mogą mieć trudności z precyzyjną weryfikacją cyfrowych identyfikatorów z sumami kontrolnymi.
PII Masker rozwiązuje ten problem poprzez architekturę hybrydową: łączy deterministyczny silnik regułowy o ścisłym priorytecie z modelem rozpoznawania jednostek nazwanych (NER) wytrenowanym dla specyfiki języka polskiego.
Architektura dwuwarstwowa
-
1. FastMasker
Silnik deterministyczny i walidacja sum kontrolnych: PESEL, NIP, REGON, IBAN, karty płatnicze i VIN. Reguły formatów: e-mail, IPv4/IPv6, URL, telefony i kody pocztowe.
-
2. Anonymizer Model
Model Transformer NER dla języka polskiego: imiona, nazwiska, nazwy własne i stanowiska, a także adresy, lokalizacje i kontekst nieregularny.
{{PESEL}}, {{CREDIT_CARD}}Moduły składowe
1. FastMasker: Błyskawiczny silnik regułowy
Moduł fast_masker aplikuje reguły w ściśle określonym porządku — od identyfikatorów o najwyższej pewności (z walidacją sum kontrolnych) do wzorców ogólnych:
- Identyfikatory weryfikowane sumami kontrolnymi:
- Karty kredytowe (
CreditCardRule): Walidacja algorytmem Luhna (13–19 cyfr) →{{CREDIT_CARD}} - Numery VIN (
VinRule): Walidacja sumy kontrolnej ISO 3779 (pozycja 9) →{{VIN}} - PESEL (
PeselTaggedRuleiPeselRule): Weryfikacja cyfry kontrolnej PESEL oraz daty urodzenia →{{PESEL}} - NIP i REGON (
NipRule,RegonRule): Algorytmy wagowe dla polskich identyfikatorów podatkowych i rejestrowych →{{NIP}},{{REGON}} - Rachunki bankowe (
IbanRule,NrbRule): Standard NRB (26 cyfr) i międzynarodowy IBAN z algorytmem modulo 97 →{{IBAN}} - Dokumenty tożsamości: Polski Dowód Osobisty (
IdCardNumberRule) i Paszport (PassportNumberRule) →{{ID_CARD}},{{PASSPORT}} - Identyfikatory techniczne: Adresy MAC, numery seryjne SIM ICCID, certyfikaty SSL, tokeny JWT →
{{MAC_ADDRESS}},{{JWT}} - Identyfikatory wzorcowe i telekomunikacyjne:
- Adresy e-mail →
{{EMAIL}} - Adresy IPv4 i IPv6 →
{{IP_ADDRESS}} - Adresy URL i domeny →
{{URL}} - Polskie i międzynarodowe numery telefonów →
{{PHONE}} - Kody pocztowe, tablice rejestracyjne, kwoty pieniężne i daty
2. Anonymizer Model: Model NER dla języka polskiego
Dla danych, których nie da się jednoznacznie opisać sumami kontrolnymi (imiona, nazwiska, nazwy ulic, kontekstowe dane adresowe), udostępniamy model anonymizer-model:
- Architektura:
AutoModelForTokenClassificationoparta na architekturze RoBERTa zoptymalizowanej pod kątem języka polskiego. - Trening na korpusach anotowanych: Zbiory takie jak
clarin-pl/kpwr-nerze zgeneralizowaną mapą etykiet. - Zaawansowany post-processing: Algorytm scalania sub-tokenów (sub-token merging), zachowywanie interpunkcji i spacji oraz precyzyjne odzyskiwanie granic słów.
- Wydajność: Opcja kwantyzacji dynamicznej (ONNX / INT8) umożliwiająca wnioskowanie na CPU bez konieczności angażowania drogich kart graficznych.
Integracja z LLM Router
PII Masker działa jako natywna wtyczka w potoku LLM Routera:
- Pre-inference: Gdy użytkownik wysyła prompt, Masker podmienia dane wrażliwe na jednoznaczne tokeny zastępcze.
- Inference: Model językowy (np. w chmurze) przetwarza tekst bez dostępu do prawdziwych danych osobowych.
- Post-inference (Opcjonalnie): W razie potrzeby LLM Router może bezpiecznie przywrócić oryginalne wartości w tekście wyjściowym przed zwróceniem go do autoryzowanego użytkownika.
Przykładowe użycie w Pythonie
from llm_router_plugins.maskers.fast_masker import FastMasker, ALL_RULES
# Inicjalizacja maskera z pełnym zestawem reguł
masker = FastMasker(rules=ALL_RULES)
tekst = (
"Klient Jan Kowalski, PESEL: 44051401359, opłacił fakturę kartą "
"4532 1234 5678 9010 na kwotę 1 250,00 PLN. "
"Kontakt: jan.kowalski@firma.pl lub +48 601 234 567."
)
zanonimizowany = masker.mask(tekst)
print(zanonimizowany)
# Wynik:
# Klient Jan Kowalski, {{PESEL_TAGGED}}, opłacił fakturę kartą
# {{CREDIT_CARD}} na kwotę {{MONEY}}.
# Kontakt: {{EMAIL}} lub {{PHONE}}.
Zasoby i repozytoria
- Tester online: masker.apps.radlab.dev/anonymize/
- Repozytorium modelu NER: radlab-dev-group/anonymizer-model
- Repozytorium silnika regułowego: radlab-dev-group/llm-router-plugins
- Licencja: Apache 2.0 (Open Source)