Utilizzo di LLM conforme al GDPR nelle aziende tedesche: cosa ti serve prima di poter portare Claude o GPT in produzione. Configurazione pratica con mascheramento dei dati personali, audit log, Zero Data Retention presso Anthropic / Google e gestione del contratto di nomina a responsabile del trattamento.
I tre elementi obbligatori
- Mascheramento dei dati personali prima della chiamata upstream — non puoi inviare dati personali in chiaro senza filtri ai fornitori statunitensi
- Accordo sul trattamento dei dati (AVV / art. 28 DSGVO) — direttamente con il provider del modello (Anthropic, Google, OpenAI); Kunavo non offre un AVV
- Audit trail — ogni chiamata deve essere tracciabile e documentata con vincolo di finalità
1) Mascheramento dei dati personali — la parte pratica
Prima che un prompt lasci il tuo backend, passa attraverso una fase di mascheramento. E-mail, numeri di telefono, nomi di persone, IBAN e numeri di previdenza sociale vengono sostituiti da token:
# Vor jedem LLM-Aufruf PII maskieren — niemals Klartext-Personendaten
# an die Upstream-API senden.
import re
from openai import OpenAI
PII_PATTERNS = [
(re.compile(r"[\w.+-]+@[\w-]+\.[\w.-]+"), "<EMAIL>"),
(re.compile(r"\b\d{4,}\b"), "<NUMBER>"),
(re.compile(r"\b(?:\+49|0)\s*\d{2,4}\s*\d{4,8}\b"), "<PHONE_DE>"),
]
def redact(text: str) -> tuple[str, dict[str, str]]:
redacted = text
mapping: dict[str, str] = {}
for i, (pat, tag) in enumerate(PII_PATTERNS):
for match in pat.finditer(text):
key = f"{tag}_{i}_{match.start()}"
mapping[key] = match.group(0)
redacted = redacted.replace(match.group(0), f"[{key}]")
return redacted, mapping
def restore(text: str, mapping: dict[str, str]) -> str:
for key, original in mapping.items():
text = text.replace(f"[{key}]", original)
return textLa tabella di mapping rimane solo localmente. Se la risposta dell’LLM deve restituire dati personali reinseriti (ad es. «Buongiorno signora Schmidt»), eseguiamo la sostituzione solo dopo la risposta. In questo modo l’upstream vede sempre e soltanto testo anonimizzato.
2) AVV — chi ha bisogno di quale contratto
- Tu ↔ Kunavo: Kunavo non offre un accordo sul trattamento dei dati (AVV) ai sensi dell'art. 28 del GDPR. Le richieste vengono elaborate negli USA e inoltrate ai fornitori a monte; il modo in cui questi utilizzano i contenuti è disciplinato dalle loro condizioni in materia di privacy e conservazione dei dati (vedi /legal/privacy)
- Tu ↔ provider del modello: se il tuo workload richiede un AVV, stipulalo direttamente con Anthropic, OpenAI o Google secondo i rispettivi termini commerciali o enterprise e chiama direttamente il modello. Tramite Kunavo non erediti una catena di sub-responsabili
- Rischio Schrems II: Anthropic e OpenAI hanno sede negli Stati Uniti. Senza AVV, con Kunavo non sono disponibili nemmeno clausole contrattuali tipo (SCC) per il trasferimento verso gli Stati Uniti. Se la tua valutazione del rischio richiede un provider esclusivamente UE, Kunavo non è adatto: nessun provider del nostro catalogo ha sede nell'UE e ogni richiesta passa dal nostro gateway in US-East
3) Audit log — registrare ogni chiamata
Per richiesta: ID della richiesta, ID utente, modello, prompt sottoposto ad hashing, consumo di token, latenza; usa l'ID della richiesta come chiave di correlazione nei tuoi log:
# Jeder LLM-Aufruf wird in einem unveränderlichen Audit-Log festgehalten
import json, time, uuid
from datetime import datetime
def call_with_audit(user_id: str, prompt: str, model: str) -> dict:
request_id = str(uuid.uuid4())
redacted_prompt, mapping = redact(prompt)
# Audit-Log VOR dem Call schreiben
audit_log.write({
"request_id": request_id,
"user_id": user_id,
"timestamp": datetime.utcnow().isoformat(),
"model": model,
"prompt_redacted": redacted_prompt,
"prompt_hash": hashlib.sha256(prompt.encode()).hexdigest(),
"pii_tags_count": len(mapping),
})
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": redacted_prompt}],
extra_headers={
"X-Request-ID": request_id, # nur für deine eigenen Logs; Kunavo wertet ihn nicht aus
},
)
response_text = resp.choices[0].message.content
# Bei Bedarf PII zurück mergen (nur in der lokalen DB)
final_text = restore(response_text, mapping)
audit_log.write({
"request_id": request_id,
"response_redacted": response_text,
"tokens": resp.usage.model_dump(),
"duration_ms": int((time.time() - start) * 1000),
})
return {"text": final_text, "request_id": request_id}X-Request-ID è la tua chiave: Kunavo non analizza né memorizza l'header e il nostro dashboard di utilizzo non mostra quale provider upstream abbia gestito una chiamata. Qui vedi, per ogni chiamata, l'ID della chiamata di Kunavo con timestamp, modello, token, costo e latenza; il confronto con il tuo audit log avviene tramite timestamp e modello.
Zero Data Retention (ZDR) — solo direttamente presso il provider del modello
Per impostazione predefinita, Anthropic e Google conservano i log dei prompt rispettivamente per 30 giorni (Anthropic) e 60 giorni (Google) per il monitoraggio degli abusi. Per workload sensibili ai sensi del DSGVO, puoi richiedere ZDR direttamente al provider, nell'ambito del tuo contratto. Kunavo non offre né routing ZDR né un tier ZDR: le richieste tramite Kunavo vengono elaborate negli Stati Uniti e inoltrate a provider upstream, ai quali si applicano le rispettive regole di conservazione.
- Anthropic ZDR: per clienti Enterprise con contratto diretto con Anthropic. Non disponibile tramite Kunavo
- Google Vertex AI: condizioni analoghe nel tuo contratto Google Cloud, con la possibilità di scegliere una regione UE (europe-west4 / Paesi Bassi). Kunavo non esegue il routing attraverso una regione UE
- OpenAI: Zero Data Retention solo per il tier Enterprise, con contratto diretto con OpenAI. Non disponibile tramite Kunavo
Residenza dei dati
- Routing Kunavo: nel gateway, in un’unica regione (US-East, Ashburn). Solo l’Anycast Edge a monte termina TLS vicino a te
- Persistenza dei dati dell’account: un unico database primario in US-East con snapshot giornalieri dei volumi crittografati. Non offriamo routing esclusivamente UE
- IVA: il checkout non indica l’IVA e non genera una fattura; per una ricevuta contabile scrivi a contact@kunavo.com
Ciò che la maggior parte dei team di compliance trascura
- Il contenuto del prompt è un dato personale se contiene nomi — anche se l’utente non ha inserito «Müller», ma solo «mi chiamo Petra». Il mascheramento dovrebbe rilevare euristicamente nomi propri e denominazioni proprie
- L'addestramento sui tuoi dati è disattivato per impostazione predefinita in Anthropic e Google (a differenza di ChatGPT per i consumatori). Kunavo non addestra modelli sui tuoi contenuti; il modo in cui li tratta il provider upstream è regolato dalle sue condizioni. Kunavo non fornisce alcuna garanzia contrattuale al riguardo
- Applicare l’hash ai contenuti dell’output — memorizziamo presso di te solo l’hash, non il testo completo, se il tuo DPA lo prescrive
- Diritto alla cancellazione — in caso di richiesta ai sensi dell’art. 17 GDPR devi poter eliminare il prompt dai tuoi log. È possibile solo se i tuoi audit log sono cancellabili (quindi non strutture blockchain append-only)
Note legali e banner dei cookie
Per un percorso completo di conformità, consulta il nostro /legal/impressum ai sensi del § 5 DDG e l'informativa sulla privacy in /legal/privacy. Gestisci il banner dei cookie sul tuo sito (ad es. con Usercentrics, Cookiebot o Klaro): Kunavo utilizza solo cookie funzionali.
Pronto? Registrazione gratuita, ricarica a partire da $10, pay-as-you-go, il saldo non scade mai. Se il tuo workload richiede un AVV, ZDR o residenza dei dati nell'UE, stipula il contratto direttamente con il provider del modello.