Keine Rechtsberatung. Alle Beispiele sind erfunden. Ob ihr Kundendaten mit KI verarbeiten dürft, klärt ihr mit eurem Datenschutzbeauftragten.
Das Prinzip in 30 Sekunden.
Ich arbeite gern mit starken Modellen wie Claude und ChatGPT. Aber eine Kundenmail mit Name, Adresse und IBAN kopiere ich nicht einfach in einen Chat. Deshalb setze ich eine Schicht davor: einen kleinen Server in Deutschland. Dort erkennt ein lokales Sprachmodell zusammen mit dem Open-Source-Werkzeug Presidio die Personendaten und ersetzt sie durch Platzhalter. Erst dann geht die Anfrage an das externe Modell. Die Antwort kommt zurück, und erst auf dem Server werden die Platzhalter wieder durch die echten Angaben ersetzt.
Wie Pseudonymisierung grundsätzlich funktioniert und was die Begriffe bedeuten, erkläre ich unter KI und Datenschutz. Hier geht es um den Bau.
Übung: Finde die Personendaten.
Bevor du etwas baust, schau mit den Augen der Schutzschicht auf eine Mail. Tippe alles an, was du ersetzen würdest. Dann löse auf.
// Übung · erfundene Mail
Tippe alles an, was du ersetzen würdest.
richtig gefundenübersehenmuss nicht raus
Die schwierigste Stelle ist der Filialleiter der einzigen Bäckerei in Blaubeuren. Darin steht kein Name. Trotzdem weiß jeder in Blaubeuren sofort, wer gemeint ist. Solche indirekten Angaben erkennt kein Muster und kein Wörterbuch. Dafür braucht es ein Sprachmodell, das den Sachverhalt versteht und umschreibt. Datum, Wochentag und das eigentliche Anliegen bleiben dagegen stehen, denn ohne sie kann die KI nicht helfen.
Welcher Weg passt zu dir?
Nicht jeder braucht eine Schutzschicht. Zwei Fragen genügen für eine erste Einschätzung:
// Entscheidungshilfe
Keine Schutzschicht nötig
Ohne Personendaten brauchst du keine Pseudonymisierung. Achte trotzdem auf Firmengeheimnisse und auf eure KI-Richtlinie.
Copilot mit euren Regeln
Mit Microsoft 365 Copilot im Arbeitskonto bleiben die Daten in eurer Microsoft-Umgebung, mit den Verträgen, die eure IT abgeschlossen hat. Eine eigene Schutzschicht ist meist nicht nötig. Prüft aber Freigaben und Flex Routing, siehe Work IQ erklärt.
Hier lohnt sich die Schutzschicht
Wähle zusätzlich einen API-Weg mit EU-Verarbeitung, wo es geht (Tabelle weiter unten). Die Schutzschicht sorgt dafür, dass Namen und Kontaktdaten gar nicht erst beim Anbieter ankommen.
Erst klären, dann starten
Gesundheitsdaten und andere besondere Kategorien (Art. 9 DSGVO) brauchen besonderen Schutz. Ohne ausdrückliche Freigabe durch euren Datenschutz gehören sie in kein KI-Werkzeug.
Eher komplett lokal
Für besondere Kategorien würde ich kein externes Modell nutzen, auch nicht mit Platzhaltern. Ein lokales Modell auf eurem Server ohne Verbindung nach außen ist hier der ehrlichere Weg. Und auch das nur nach Freigabe.
Der Aufbau: fünf Stationen.
So läuft eine Anfrage durch die Schutzschicht. Klick dich durch:
// Weg einer Anfrage
1. Eingang
Du schreibst wie gewohnt in eine Chat-Oberfläche oder ein Skript schickt eine Mail. Die Anfrage geht aber nicht direkt zu Claude oder ChatGPT, sondern an deinen eigenen Server. Dort läuft ein Gateway (ich nutze LiteLLM). Es spricht dieselbe Schnittstelle wie OpenAI, deshalb funktionieren die meisten Programme ohne Umbau.
Herr Jonas Albrecht (Kd.-Nr. 48-1937) aus Ulm schreibt: Die Rechnung RE-2026-0412 wurde doppelt abgebucht …
2. Erkennen
Drei Netze fangen die Personendaten. Erstens Muster für IBAN, Mail, Telefonnummer und eure Kundennummern. Zweitens Namenserkennung mit einem deutschen Sprachmodell in Presidio. Drittens ein lokales Sprachmodell über Ollama für das, was keine Regel findet, etwa „die einzige Bäckerei in Blaubeuren“.
Gefunden: PERSON „Jonas Albrecht“ · KUNDENNUMMER „48-1937“ · ORT „Ulm“ · RECHNUNG „RE-2026-0412“
3. Ersetzen und Tresor
Jede Angabe wird durch einen nummerierten Platzhalter ersetzt. Die Zuordnung landet in einem Tresor: nur im Arbeitsspeicher, nur für diese eine Anfrage, nach wenigen Minuten gelöscht. In Protokolle schreibe ich nur die Platzhalter.
[PERSON_1] (Kd.-Nr. [KUNDE_1]) aus [ORT_1] schreibt: Die Rechnung [RECHNUNG_1] wurde doppelt abgebucht … Tresor: PERSON_1 → Jonas Albrecht · KUNDE_1 → 48-1937 · …
4. Externes Modell
Erst jetzt geht die Anfrage per API an Claude oder ChatGPT. Das Modell sieht das Anliegen, aber keine Namen, keine Adresse, keine IBAN. Es antwortet mit denselben Platzhaltern.
Sehr geehrter [PERSON_1], danke für Ihren Hinweis zur Rechnung [RECHNUNG_1]. Wir prüfen die doppelte Abbuchung …
5. Zurückfüllen und prüfen
Der Server setzt die echten Angaben wieder ein. Dann prüft er: Sind alle Platzhalter aufgelöst? Hat das Modell neue Namen erfunden? Erst danach siehst du die Antwort. Und ein Mensch entscheidet, ob sie rausgeht.
Sehr geehrter Herr Albrecht, danke für Ihren Hinweis zur Rechnung RE-2026-0412. Wir prüfen die doppelte Abbuchung …
Wohin die Anfrage geht: die Anbieter.
Die Schutzschicht entfernt die Personendaten. Trotzdem lohnt es sich, den API-Weg bewusst zu wählen. Stand 31.10.2026:
| Weg | Wo verarbeitet | Gut zu wissen |
|---|---|---|
| Claude direkt (Anthropic-API) | Weltweit oder USA. Eine EU-Region bietet Anthropic direkt derzeit nicht an. | Daten werden nach spätestens 30 Tagen gelöscht, kein Training ohne Zustimmung. Der Auftragsverarbeitungsvertrag (AVV, englisch DPA) mit Standardvertragsklauseln ist automatisch Teil der Geschäftsbedingungen. Zero Data Retention gibt es über den Vertrieb. |
| Claude über AWS Bedrock | EU, z. B. Frankfurt (eu-central-1) | Regionale Endpunkte kosten 10 % Aufschlag. Es gelten die Bedingungen von AWS. |
| Claude über Google Cloud | EU (Endpunkt eu oder Einzelregion) | 10 % Aufschlag, Einzelregionen nicht für alle Modelle. Es gelten die Bedingungen von Google. |
| OpenAI-API | Weltweit, oder Europa (EWR und Schweiz) mit EU-Datenresidenz | Kein Training mit API-Daten. Missbrauchsprotokolle bis zu 30 Tage. Die EU-Region braucht eine Freigabe durch den Vertrieb und Zero Data Retention oder eine vergleichbare Vereinbarung. Für neue Modelle 10 % Aufschlag. |
| OpenAI-Modelle über Azure (Microsoft Foundry) | Gewählte Region (z. B. Germany West Central, Sweden Central) oder „DataZone EU“ | OpenAI selbst sieht die Daten nicht. Die Bereitstellung „Global“ verarbeitet weltweit und passt nicht, wenn du in der EU bleiben willst. Welche Modelle in welcher Region laufen, ändert sich. |
Meine Reihenfolge: Erst die Schutzschicht, damit gar keine Namen rausgehen. Dann, wenn möglich, ein Weg mit EU-Verarbeitung. Beides zusammen ist stärker als jedes für sich.
Schritt für Schritt bauen.
Das brauchst du: einen kleinen Linux-Server, etwas Erfahrung mit der Kommandozeile und einen API-Schlüssel bei einem Anbieter. Plane für den ersten Aufbau einen Tag ein.
- Server in Deutschland mieten. Für Presidio und ein kleines Modell reichen 8 bis 16 GB Arbeitsspeicher. Bei Hetzner (Falkenstein oder Nürnberg) kostet das ab ca. 9 bis 70 € im Monat netto, je nach Tarif (Stand 10/2026). Schließ im Kundenkonto den Auftragsverarbeitungsvertrag ab.
- Den Server abschotten. Anmeldung nur mit SSH-Schlüssel, Firewall an, automatische Sicherheitsupdates. Von außen erreichbar ist nur das Gateway, und zwar nur über HTTPS mit Passwort oder über ein VPN.
- Ollama installieren. Ollama hört standardmäßig nur auf
127.0.0.1:11434. So soll es bleiben, denn eine eigene Anmeldung beschreibt Ollama nicht. Lade ein kleines Modell, das Deutsch kann. - Presidio auf Deutsch einrichten. Presidio erkennt von Haus aus nur Englisch. Für Deutsch brauchst du das spaCy-Modell
de_core_news_lgund musst die Erkenner für Mail, IBAN und Telefon zusätzlich für „de“ anlegen. Kundennummern und Adressen brauchen eigene Regeln. - Platzhalter und Tresor bauen. Ein kleines Skript nummeriert die Funde ([PERSON_1], [KUNDE_1]) und hält die Zuordnung nur im Arbeitsspeicher. Nach der Antwort wird sie gelöscht.
- Das Gateway davorsetzen. LiteLLM leitet Anfragen an Claude oder ChatGPT weiter und kann Presidio vor jedem Aufruf ausführen. Die Option
output_parse_piisetzt die Originalwerte in der Antwort wieder ein. - API-Zugang wählen. Konto beim Anbieter anlegen, Datenaufbewahrung und Vertrag prüfen, wo möglich eine EU-Region nutzen (siehe Tabelle oben). Den API-Schlüssel nur auf dem Server speichern.
- Mit erfundenen Daten testen. Bau dir 30 erfundene Mails mit allen Sorten von Personendaten. Zähl, was die Schutzschicht findet und was sie übersieht. Erst wenn du die Quote kennst, kommen echte Daten dazu, und nur nach Freigabe.
Ollama installieren und testen
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.1:8b
curl http://127.0.0.1:11434/api/generate -d '{"model": "llama3.1:8b", "prompt": "Antworte mit OK.", "stream": false}'Ich nehme Llama 3.1 8B, weil Meta Deutsch in der Modellkarte ausdrücklich als unterstützte Sprache nennt. Qwen3, Gemma 3 und Mistral Small nennen „viele Sprachen“. Zur Qualität bei der Erkennung deutscher Personendaten sagt keine dieser Karten etwas. Das musst du selbst testen.
Presidio auf Deutsch
# pip install presidio-analyzer && python -m spacy download de_core_news_lg
from presidio_analyzer import AnalyzerEngine, PatternRecognizer, Pattern
from presidio_analyzer.nlp_engine import NlpEngineProvider
from presidio_analyzer.predefined_recognizers import EmailRecognizer, IbanRecognizer, PhoneRecognizer
nlp = NlpEngineProvider(nlp_configuration={
"nlp_engine_name": "spacy",
"models": [{"lang_code": "de", "model_name": "de_core_news_lg"}],
}).create_engine()
analyzer = AnalyzerEngine(nlp_engine=nlp, supported_languages=["de"])
# Die Standard-Erkenner gelten nur für Englisch, also für Deutsch neu anlegen
analyzer.registry.add_recognizer(EmailRecognizer(supported_language="de"))
analyzer.registry.add_recognizer(IbanRecognizer(supported_language="de"))
analyzer.registry.add_recognizer(PhoneRecognizer(supported_language="de", context=["telefon", "tel", "mobil", "erreichbar"]))
# Eigene Regeln: Kundennummer und Rechnungsnummer (an euer Format anpassen)
analyzer.registry.add_recognizer(PatternRecognizer(supported_entity="KUNDE", supported_language="de",
patterns=[Pattern("kdnr", r"\b\d{2}-\d{4}\b", 0.5)], context=["kd", "kunde", "kundennummer"]))
analyzer.registry.add_recognizer(PatternRecognizer(supported_entity="RECHNUNG", supported_language="de",
patterns=[Pattern("re", r"\bRE-\d{4}-\d{4}\b", 0.8)]))
for f in analyzer.analyze(text="Herr Jonas Albrecht (Kd.-Nr. 48-1937) aus Ulm …", language="de"):
print(f.entity_type, f.start, f.end, round(f.score, 2))Platzhalter und Tresor
def pseudonymisieren(text, funde):
"""Ersetzt Funde durch nummerierte Platzhalter. Die Zuordnung bleibt im Speicher."""
tresor, zaehler, aus = {}, {}, text
for f in sorted(funde, key=lambda f: f.start, reverse=True):
wert = text[f.start:f.end]
alt = next((k for k, v in tresor.items() if v == wert), None)
if not alt:
zaehler[f.entity_type] = zaehler.get(f.entity_type, 0) + 1
alt = f"[{f.entity_type}_{zaehler[f.entity_type]}]"
tresor[alt] = wert
aus = aus[:f.start] + alt + aus[f.end:]
return aus, tresor
def zurueckfuellen(antwort, tresor):
for platzhalter, wert in tresor.items():
antwort = antwort.replace(platzhalter, wert)
offen = [t for t in tresor if t in antwort]
return antwort, offen # offen sollte leer seinÜberlappende Funde, etwa wenn Presidio und deine Regel dieselbe Stelle finden, solltest du vorher zusammenführen. Das Skript ist bewusst kurz gehalten, damit du siehst, wie es funktioniert.
Gateway mit LiteLLM
model_list:
- model_name: claude-eu
litellm_params:
model: bedrock/MODELL_ID_AUS_DER_BEDROCK_KONSOLE
aws_region_name: eu-central-1
- model_name: gpt-eu
litellm_params:
model: openai/MODELLNAME
api_base: https://eu.api.openai.com/v1 # nur mit freigeschalteter EU-Datenresidenz
api_key: os.environ/OPENAI_API_KEY
guardrails:
- guardrail_name: personendaten-de
litellm_params:
guardrail: presidio
mode: pre_call
presidio_language: de
output_parse_pii: true
pii_entities_config:
PERSON: MASK
EMAIL_ADDRESS: MASK
PHONE_NUMBER: MASK
IBAN_CODE: MASK
LOCATION: MASKDie Adressen von Presidio bekommt LiteLLM über die Umgebungsvariablen PRESIDIO_ANALYZER_API_BASE und PRESIDIO_ANONYMIZER_API_BASE. Eigene Platzhalter mit Nummern und das lokale Sprachmodell hängst du als eigenen Schritt davor. Der eingebaute Guardrail ist ein guter Start, aber er kennt deine Kundennummern nicht.
Prompt für das lokale Modell
Das lokale Modell bekommt den Text, nachdem Presidio und deine Regeln fertig sind. Seine Aufgabe ist nur noch das Indirekte:
Du bist ein Datenschutz-Filter. Der folgende Text enthält bereits Platzhalter in eckigen Klammern. Lass sie unverändert.
Deine Aufgabe:
1. Finde Angaben, die eine Person indirekt erkennbar machen: seltene Berufe oder Funktionen, kleine Orte, auffällige Ereignisse, Kombinationen wie "die einzige Bäckerei in …".
2. Schreib diese Stellen so allgemein um, dass das Anliegen erhalten bleibt. Beispiel: "Filialleiter der einzigen Bäckerei in Blaubeuren" wird zu "Filialleiter eines Einzelhändlers".
3. Ändere sonst nichts. Erfinde keine neuen Namen.
Gib nur den umgeschriebenen Text zurück.
Text:
[TEXT]Testdaten erzeugen
Erzeuge 30 erfundene Kundenmails auf Deutsch für einen Handwerksbetrieb. Jede Mail enthält eine Mischung aus: Vor- und Nachname, Straße mit Hausnummer, PLZ und Ort, Telefonnummer, E-Mail-Adresse, IBAN im deutschen Format, Kundennummer im Format 00-0000 und Rechnungsnummer im Format RE-0000-0000. Baue in 10 Mails zusätzlich eine indirekte Angabe ein, die eine Person ohne Namen erkennbar macht. Alle Daten müssen erfunden sein. Gib danach eine Liste aus, welche Angaben in welcher Mail stecken.Diesen Prompt kannst du ruhig direkt in Claude oder ChatGPT nutzen. Es sind ja nur erfundene Daten. Mit der Liste am Ende misst du, wie viel deine Schutzschicht findet.
Was kostet das?
// SERVER
ab ca. 9 bis 70 € im Monat
CPU-Server mit 8 bis 16 GB in Deutschland, netto, je nach Tarif (Hetzner, Stand 10/2026). Eine Grafikkarte brauchst du für ein kleines Modell nicht. GPU-Server gibt es ab ca. 214 € im Monat.
// API
nach Verbrauch
Du zahlst pro Token beim Anbieter. EU-Regionen kosten bei Anthropic über AWS oder Google und bei neuen OpenAI-Modellen 10 % Aufschlag.
// ZEIT
ein Tag Aufbau
Dazu kommt Pflege: Updates, Testmails nach jeder Änderung, Blick in die Protokolle.
Wo die Schutzschicht nicht reicht.
// GRENZE 1
Pseudonym ist nicht anonym
Für dich als Betreiber mit dem Tresor bleiben die Daten personenbezogen. Die DSGVO gilt also weiter. Der Europäische Gerichtshof hat 2025 entschieden: Ob die Daten auch beim Empfänger personenbezogen sind, hängt davon ab, ob er sie mit vernünftigen Mitteln wieder zuordnen könnte. Das ist eine Einzelfallfrage.
// GRENZE 2
Keine Erkennung ist vollständig
Muster übersehen Tippfehler, Sprachmodelle übersehen manchmal einen Namen. Miss die Quote mit deinen Testmails und plane einen Menschen ein, der prüft.
// GRENZE 3
Anhänge und Bilder
Ein PDF oder ein Foto vom Typenschild geht nicht durch Presidio. Anhänge behandle ich getrennt oder lasse sie weg.
// GRENZE 4
Kein Ersatz für Verträge
Auftragsverarbeitungsvertrag, Löschfristen, Verzeichnis der Verarbeitungstätigkeiten und eure KI-Richtlinie braucht ihr trotzdem.
// Kurz prüfen
1. Du hast alle Namen durch Platzhalter ersetzt. Gilt die DSGVO für dich noch?
Wähle eine Antwort.
Nicht ganz. Mit dem Tresor kannst du jeden Platzhalter wieder zuordnen. Für dich bleiben die Daten personenbezogen.
Richtig. Pseudonymisierung senkt das Risiko, macht die Daten für dich aber nicht anonym.
Nicht ganz. Mit dem Tresor kannst du jeden Platzhalter wieder zuordnen. Für dich bleiben die Daten personenbezogen.
// Kurz prüfen
2. Welche Angabe findet Presidio ohne Sprachmodell am schlechtesten?
Wähle eine Antwort.
Nicht ganz. IBAN und Mail haben feste Muster mit Prüfsumme oder @-Zeichen. Schwierig ist die indirekte Angabe.
Nicht ganz. IBAN und Mail haben feste Muster mit Prüfsumme oder @-Zeichen. Schwierig ist die indirekte Angabe.
Richtig. Indirekte Angaben folgen keinem Muster. Dafür ist das lokale Sprachmodell da.
// Kurz prüfen
3. Du willst Claude mit Verarbeitung in der EU nutzen. Welcher Weg geht derzeit?
Wähle eine Antwort.
Nicht ganz. Direkt bei Anthropic gibt es derzeit keine EU-Region. Über AWS Bedrock oder Google Cloud geht es.
Richtig. Anthropic bietet direkt nur „global“ und „us“. EU-Verarbeitung geht über AWS oder Google, mit 10 % Aufschlag.
Nicht ganz. Direkt bei Anthropic gibt es derzeit keine EU-Region. Über AWS Bedrock oder Google Cloud geht es.
Checkliste vor dem ersten echten Einsatz.
// Vor dem Start
0 von 10 erledigt
Deine Haken bleiben nur in diesem Browser gespeichert.
Nachlesen und selbst prüfen.
- Art. 4 DSGVO, Begriffsbestimmungen (Nr. 5 Pseudonymisierung)
- EDPB Guidelines 01/2025 on Pseudonymisation (Version 1) · 16.01.2025
- EuGH C-413/23 P, Pressemitteilung 107/25 · 04.09.2025
- Anthropic: Data residency · abgerufen 31.10.2026
- Anthropic: Wie lange werden Daten gespeichert? · 01.07.2026
- Claude in Amazon Bedrock
- OpenAI: Your data (API) · abgerufen 31.10.2026
- Azure OpenAI: Daten, Datenschutz und Sicherheit · 05.06.2026
- Presidio: Sprachen und unterstützte Entitäten
- LiteLLM: PII-Maskierung mit Presidio
- Ollama FAQ (Netzwerk, OLLAMA_HOST)
- Hetzner: Datenschutz und AVV
