Engineering
Ein reversibler Local-First PII-Scrubber für AI-Workflows mit ONNX und Regex
24.12.2025
Von
Tom Jordi Ruesch

Das Privacy-Translation-Paradoxon
Jedes Entwickler-Team steht irgendwann vor demselben Dilemma: Ihr müsst User-Content (Support-Tickets, Dokumente, Chat-Logs) übersetzen und wollt dafür hochwertige Engines wie DeepL oder LLMs wie GPT-5 nutzen. Aber: Du darfst auf keinen Fall personenbezogene Daten (Personally Identifiable Information - PII) an Drittanbieter-APIs schicken (die DSGVO lässt grüßen).
Die Lösung scheint simpel: Daten schwärzen. Das Problem? Das Schwärzen zerstört die Übersetzungsqualität.
Wenn du "John bought a generic gift for Mary" zu "PERSON bought a generic gift for PERSON" bereinigst, verliert die Translation-Engine den Kontext, den sie für Artikel, Fallendungen und Präpositionen in Zielsprachen wie Französisch oder Deutsch dringend braucht. Dazu kommt, dass die meisten Open-Source Daten-Scrubber "Einbahnstraßen" sind – sie bereinigen Daten für Analysen, aber nicht für einen Round-Trip-Übersetzungsworkflow.
Wir haben eine Lösung dafür gebaut. Heute releasen wir rehydra als Open Source tool: eine TypeScript-Library für reversibles, kontextbewusstes PII-Masking, die speziell für AI-Pipelines entwickelt wurde.
Wie rehydra funktioniert
Im Gegensatz zu General-Purpose-Scrubbern ist rehydra um einen Lifecycle herum aufgebaut:
Der Prozess (Mask & Rehydrate) läuft komplett lokal ("on-device" via Node.js oder Bun) und nutzt eine Hybrid-Engine aus RegEx und NER-Modellen.
1. Hybride Erkennungsstrategie
Eine einzelne Erkennungsmethode reicht nicht. Regex ist schnell, aber limitiert; NER (Named Entity Recognition) ist schlau, aber langsam. rehydra nutzt beides:
Strukturierte PII (Regex): Wir nutzen strikte RegEx-Patterns für Dinge, die festen Regeln folgen – IBANs (mit Mod-97 Checksummen-Validierung), Kreditkarten (Luhn-Algorithmus) und E-Mails.
Softe PII (NER): Für Namen, Organisationen und Orte wrappen wir ein leistungsstarkes NER-Modell via ONNX Runtime.
Das erlaubt dir als Entwickler, deinen Trade-off selbst zu wählen. Du kannst anonymizeRegexOnly() für Sub-Millisekunden-Performance auf Streams nutzen, oder die volle anonymize()-Pipeline für hochpräzises Dokumenten- oder Prompt-Scrubbing.
2. Die Challenge: Semantisches Masking
Nachdem das Verhindern von Leaks gelöst ist, bleibt die Bewahrung des Kontexts die nächste Hürde. rehydra nutzt Semantic Masking. Ziel ist es, unsere PII-Tags mit Metadaten (z.B. Geschlecht) anzureichern, damit das LLM grammatikalisch korrekten Output erzeugen kann.
Das Problem
Geschlechter-Kongruenz: Wenn man "Mary" durch generisches XML ersetzt, führt das oft zu "Il a vu <PII type=”PERSON” />" (männlicher Standard) statt "Elle a vu…" (weiblich).
Präpositionen: Wenn man "Berlin" vs. "Deutschland" einfach durch <PII type="LOCATION"/> ersetzt, verwirrt das Engines, die wissen müssen, ob der Ort eine Stadt, ein Land oder eine Sehenswürdigkeit ist.
Die Implementierung:
Datenquellen: Wir aggregieren Open Data von
gender-guesser(ca. 40k westliche Namen) undGeoNames(Städte >15k Einwohner).Personen: Wir gleichen den Vornamen mit unserer Datenbank ab. Bei Uneindeutigkeit (z. B. ist "Andrea" im Italienischen männlich, im Deutschen aber weiblich), nutzen wir den Locale-Hint, der dem Anonymizer übergeben wurde, um das aufzulösen.
Orte: Wir klassifizieren Entitäten basierend auf dem GeoNames-Export in Stadt, Land oder Region.
Aber es gibt einen Trade-off: Wir haben uns für Version 1 bewusst für Lookup Tables statt ML entschieden, um die Library so leichtgewichtig wie möglich zu halten. Während ein Modell Edge-Cases besser handhaben würde, ist das bundlen von statischen JSON/TXT-Dateien deutlich ‘günstiger’, als nur für die Gender-Inferenz noch ein 100MB ONNX-Modell zu laden. Das deckt ca. 90% der gängigen westlichen Namen und Großstädte mit fast null Runtime-Overhead ab.
In Zukunft werden wir weiter an Custom-ML-Lösungen forschen, um breitere (und kontextbewusstere) Enrichment-Strategien abzudecken.
3. Fuzzy Rehydration
Wenn du einen String wie Hallo <PII id="1"/> an ein generisches LLM oder eine MT-Engine schickst, kommt der Output oft "verstümmelt" zurück. Die Engine ändert vielleicht die Anführungszeichen zu typografischen, fügt Leerzeichen in die Tags ein oder vertauscht Attribute.
Wenn deine Library auf strikter String-Ersetzung basiert, fliegt dir die Pipeline um die Ohren. Wir haben einen Fuzzy Tag Matcher implementiert, der resilient gegen diese Halluzinationen ist. Er erkennt Variationen in Spacing, Quoting und Attribut-Reihenfolge, um sicherzustellen, dass wir das Token immer wieder auf den Originalwert mappen können.
4. Security First
Da die "PII Map" (die Verknüpfung zwischen ID:1 und John Smith) effektiv selbst PII ist, behandeln wir sie als sensibles Material. Die Library enthält ein Krypto-Modul, das AES-256-GCM-Verschlüsselung für die Mapping-Tabelle erzwingt. Die rohen PII verlassen niemals den lokalen Speicher, und das State-Objekt, das zwischen Masking- und Rehydration-Schritten persistiert wird, ist "at rest" verschlüsselt.
Performance & Architektur
Wir haben das für Node.js-Umgebungen und den Browser gebaut, um die Nutzung in Web-basierten Anwendungen (Websites, Electron, Tauri) zu erleichtern – und überall dort, wo Python nicht immer eine Option ist.
Runtime: Wir abstrahieren die ONNX-Runtime, um sowohl
onnxruntime-nodeals auchonnxruntime-web(für Bun/Browser Support) zu unterstützen.Quantisierung: Standardmäßig ziehen wir eine quantisierte (INT8) Version des XLM-RoBERTa Modells (~280MB), die 95%+ der Genauigkeit des vollen Modells bei 1/4 der Größe liefert (Custom Models werden ebenfalls unterstützt).
Probier es aus
Das Projekt steht unter MIT-Lizenz und ist auf npm verfügbar.
GitHub:
github.com/rehydra-ai/rehydra-sdkNPM:
npm install rehydraTest-Umgebung: https://playground.rehydra.ai/
Wir würden uns riesig über Feedback zur NER-Implementierung und zu Edge-Cases in der Rehydration-Logik freuen!

