Wysyłasz CV pracownika do ChatGPT, żeby ci je streścił? Łamiesz RODO. Wysyłasz fakturę z NIP-em do Claude — łamiesz. Mailing klientów do Geminiego, żeby przepisał stylem? Też łamiesz. Wiem, bo sam tak robiłem przez pół roku.
W tym artykule pokazuję jak anonimizować dane osobowe lokalnie, zanim cokolwiek wyjdzie z twojego komputera do API LLM. Plus mój open-source projekt który dodaje polskie recognizery do Microsoft Presidio — bo standardowy Presidio łapie po angielsku, a polski PESEL/NIP/REGON ignoruje.
Problem: każdy LLM widzi twoje dane osobowe
Standardowy flow użycia Claude albo GPT w firmie wygląda tak:
- Marketing pisze maila do bazy klientów → wkleja przykładowy mailing do ChatGPT, prosi o ulepszenie
- HR ma 50 CV do przejrzenia → wrzuca paczkę do Claude, prosi o shortlistę
- Księgowość chce raport z faktur → wkleja CSV z PESEL-ami i NIP-ami do Geminiego
W każdym z tych trzech przypadków dane osobowe trafiają na serwery providera. Anthropic, OpenAI, Google logują te dane (przynajmniej do moderation). Mogą używać ich do trenowania kolejnych modeli (zależy od planu — Enterprise zwykle nie, free tier zwykle tak).
To są dane osobowe z twojej bazy. Nie masz podstawy prawnej żeby je tam wysłać, chyba że masz jasną umowę powierzenia (RODO art. 28) z providerem AI. Anthropic ma DPA dostępne dla Enterprise. OpenAI ma. Google też. Ale free/Plus account? Nie masz.
UODO już rozdaje pierwsze decyzje o naruszeniach. 30 000 zł kary za pojedynczy incydent to standard. Łatwa matematyka: jeden marketingowiec, który przez 6 miesięcy uploaduje codziennie 100 maili z imieniem i nazwiskiem klienta = 18 000 incydentów. Skala kary może iść w setki tysięcy.
Rozwiązanie: anonimizacja lokalna PRZED LLM
Architektura która działa:
[twój dokument z PII]
↓
[Presidio NER → wykrywa PESEL, NIP, imiona, adresy, emaile]
↓
[tokenizacja: "Jan Kowalski" → "<PERSON_1>", "12345678901" → "<PESEL_1>"]
↓
[zanonimizowany tekst → API LLM (Claude/GPT/Gemini)]
↓
[odpowiedź LLM z tokenami <PERSON_1>]
↓
[re-identyfikacja: "<PERSON_1>" → "Jan Kowalski"]
↓
[finalna odpowiedź dla użytkownika]
Ważne: tokeny są tylko w pamięci twojego procesu. Nigdy nie opuszczają lokalnego komputera. LLM widzi tylko zanonimizowane wersje.
Microsoft Presidio — solidna baza, ale po angielsku
Microsoft Presidio to open-source narzędzie do PII detection i anonymization. Ma 2 komponenty: Analyzer (znajduje PII) i Anonymizer (zamienia na tokeny lub fake values).
Domyślnie wspiera 50+ typów PII: email, phone, credit card, SSN (US), passport. Wszystko po angielsku. Polskich identyfikatorów nie ma:
- PESEL (11 cyfr, polski numer ewidencyjny) — nie wykrywa
- NIP (10 cyfr, identyfikator podatkowy) — nie wykrywa
- REGON (9 lub 14 cyfr, identyfikator firmy) — nie wykrywa
- Polskie imiona (Krzysztof, Małgorzata, Bogdan) — generic NER w SpaCy łapie ~70% bo model jest trenowany głównie na angielskich danych
- Polskie adresy (kod pocztowy XX-XXX, ulice z polskimi znakami) — sporadycznie
Po wrzuceniu polskiego CV do Presidio out-of-the-box dostajesz wykryte: email, telefon, czasem imię. PESEL? Niestety nie. To znaczy że twoje CV poleci do LLM z numerem ewidencyjnym w środku.
Mój projekt: presidio-local-anonymizer
Open-sourcowałem dodatek do Presidio który dorzuca brakujące polskie recognizery. Repo: github.com/gacabartosz/presidio-local-anonymizer.
Co konkretnie dodaje:
- PolishPESELRecognizer — regex + walidacja sumy kontrolnej (10. cyfra). Rejecta fake numery typu 11111111111.
- PolishNIPRecognizer — regex + walidacja sumy kontrolnej. Rozpoznaje też formaty z myślnikami (123-456-78-90).
- PolishREGONRecognizer — 9 lub 14 cyfr, walidacja.
- PolishNameRecognizer — gazetteer 10 000 popularnych polskich imion + nazwisk + odmiana przez przypadki (Bartoszowi, Bartoszowi).
- PolishAddressRecognizer — pattern dla kodu pocztowego XX-XXX + ulic.
Quick start — 4 linie kodu, masz polski Presidio:
from presidio_analyzer import AnalyzerEngine
from presidio_local_anonymizer import register_polish_recognizers
analyzer = AnalyzerEngine()
register_polish_recognizers(analyzer) # ← jedna linia, dorzuca wszystko
results = analyzer.analyze(
text="Jan Kowalski (PESEL 86040512345) zgłasza reklamację",
language="pl"
)
# → wykryte: PERSON (Jan Kowalski), PL_PESEL (86040512345)
Mikro-benchmark — ile PII łapie default Presidio vs +polskie recognizery
Test set: 50 polskich maili biznesowych (CV, faktury, reklamacje, zapytania ofertowe). Każdy zawiera średnio 6 typów PII.
| Typ PII | Default Presidio | + presidio-local-anonymizer |
|---|---|---|
| 50/50 (100%) | 50/50 (100%) | |
| Telefon | 48/50 (96%) | 50/50 (100%) |
| Imię i nazwisko | 34/50 (68%) | 49/50 (98%) |
| PESEL | 0/50 (0%) | 50/50 (100%) |
| NIP | 0/50 (0%) | 50/50 (100%) |
| REGON | 0/50 (0%) | 49/50 (98%) |
| Adres (kod + ulica) | 12/50 (24%) | 43/50 (86%) |
| Łącznie | 49% | 97% |
Default Presidio łapie połowę. Z polskimi recognizerami — 97%. Pozostałe 3% to corner case'y (np. zagraniczny adres, niestandardowy zapis NIP). Repo open, kontrybuuj na GitHub Issues.
Kiedy NIE używać anonimizacji
Anonimizacja ma sens kiedy LLM nie potrzebuje kontekstu personalnego. Streszczanie maila, klasyfikacja zgłoszeń, redagowanie szablonów — tu anonimizacja działa świetnie.
Anonimizacja NIE działa kiedy:
- LLM ma personalizować odpowiedź pod konkretną osobę („Drogi Janie, w nawiązaniu do Pańskiej sprawy...") — wtedy musisz powierzyć dane providerowi z DPA
- Model ma rozpoznawać sentyment z imienia (np. analiza brand mentionów — „Adam Małysz powiedział..." — anonimizacja zniszczy semantykę)
- Pracujesz z imionami publicznych osób (politycy, celebryci) — to dane publiczne, nie podlegają RODO w tym samym stopniu
Co JA robię u siebie
U mnie w projektach automatyzacji setup wygląda tak:
- Każdy projekt z PII ma osobny Anthropic workspace z DPA podpisanym z Anthropic. To pierwsza linia obrony — formalna zgoda RODO art. 28.
- Wszystkie dane wchodzą przez Presidio + polskie recognizery przed wysłaniem do Claude. Tokeny <PERSON_1>, <NIP_1> itd.
- Tabela mapowania tokenów jest trzymana lokalnie w PostgreSQL (per-user, per-session). Po odebraniu odpowiedzi LLM — re-identyfikuję.
- Audit log co wyszło do API. Co miesiąc raport ile rekordów, jakie typy PII zostały zanonimizowane, ile re-identyfikacji.
- Test integracyjny w CI: 50 sample dokumentów, jeśli <90% PII wykryte → fail buildu.
To dodaje 100-300ms latency na każdy request (Presidio nie jest błyskawiczny), ale jest to akceptowalne dla większości use-case'ów — chatbot z 200ms latency to wciąż <1s response.
FAQ
Czy wolno wysyłać dane osobowe do Claude/ChatGPT?
Tak, ale tylko jeśli masz Data Processing Agreement (DPA) z providerem (Anthropic Enterprise, OpenAI Enterprise, Google Cloud DPA). Free tier i Plus subscription typowo nie kwalifikują się — sprawdź regulamin. Bez DPA = brak podstawy prawnej z RODO art. 28.
Co z Claude czy ChatGPT używanym przez pracowników "po cichu"?
To największy problem RODO w 2026. Pracownicy wysyłają dane klientów do darmowych narzędzi AI bez wiedzy IT. Rozwiązania: (1) zablokować dostęp do free tier na firewall, (2) dostarczyć alternatywę — wewnętrzny chatbot na danych z anonimizacją, (3) szkolenie + procedury.
Jaki jest koszt wdrożenia presidio-local-anonymizer?
Software jest open-source, zero kosztu licencji. Self-hosting na typowym backendzie Pythonowym dodaje minimal overhead — 100-300ms latency, ~200MB RAM. Wdrożenie w aplikacji webowej zajmuje ~1 dzień programisty (instalacja + integracja + testy).
Czy mogę używać tego z Claude przez API zamiast UI?
Tak, to nawet bezpieczniejsze. Wysyłasz przez API zanonimizowany tekst, dostajesz odpowiedź, robisz re-identyfikację po stronie swojej aplikacji. UI Claude/ChatGPT — mniej kontroli (np. nie wiesz czy session storage trzyma kopię).
RODO vs CCPA (USA) — czy to to samo?
Podobne intencje, różne wymagania. CCPA nie wymaga DPA tak jak RODO art. 28, ale wymaga "do not sell" opt-out dla personal information. Anonimizacja przed LLM pomaga w obu reżimach — jeśli dane wyjdą zanonimizowane, nie są PII w rozumieniu RODO ani CCPA.
Chcesz wdrożyć anonimizację u siebie?
Pomagam firmom postawić ten flow w 1-2 tygodnie: integracja z istniejącym backendem, testy bezpieczeństwa, dokumentacja zgodności. To część automatyzacji AI dla biznesu. Jeśli wysyłasz dane klientów do LLM bez warstwy anonimizacji — umów bezpłatny Fit Call, pokażę jak zacząć od razu.
Albo daj DM na LinkedIn z hasłem ANONIMIZACJA — wyślę ci checklistę 12 typów PII które najczęściej wyciekają w polskich firmach + szablon DPA do podpisania z Anthropic.