Uso de LLM conforme al RGPD en empresas alemanas: lo que necesita antes de poder poner Claude o GPT en producción. Configuración práctica con enmascaramiento de PII, registros de auditoría, Zero Data Retention en Anthropic / Google y la cuestión del AVV.
Los tres componentes obligatorios
- Enmascaramiento de PII antes de la llamada al proveedor upstream: no puede enviar datos personales en texto plano sin filtrar a proveedores estadounidenses
- Acuerdo de encargado del tratamiento (AVV / art. 28 del RGPD): directamente con el proveedor del modelo (Anthropic, Google u OpenAI); Kunavo no ofrece un AVV
- Registro de auditoría: cada llamada debe poder rastrearse y documentarse con una finalidad específica
1) Enmascaramiento de PII: la parte práctica
Antes de que un prompt salga de su propio backend, pasa por un paso de enmascaramiento. Los correos electrónicos, números de teléfono, nombres de personas, IBAN y números de la seguridad social se sustituyen por tokens:
# 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 tabla de correspondencias permanece únicamente en el entorno local. Si la respuesta del LLM debe devolver los datos personales reinsertados (por ejemplo, «Hola, señora Schmidt»), hacemos la sustitución solo después de recibir la respuesta. Así, el proveedor upstream siempre ve únicamente texto anonimizado.
2) AVV: quién necesita qué contrato
- Tú ↔ Kunavo: Kunavo no ofrece un AVV conforme al art. 28 del RGPD. Las solicitudes se procesan en Estados Unidos y se reenvían a proveedores upstream; lo que estos hacen con el contenido se rige por sus propias condiciones de privacidad y conservación (consulte /legal/privacy)
- Tú ↔ proveedor del modelo: si tu carga de trabajo requiere un AVV, debes firmarlo directamente con Anthropic, OpenAI o Google conforme a sus condiciones comerciales o Enterprise y llamar allí directamente al modelo. Al usar Kunavo no heredas una cadena de subencargados
- Riesgo Schrems II: Anthropic y OpenAI tienen su sede en Estados Unidos. Sin un AVV, Kunavo tampoco ofrece cláusulas contractuales tipo (SCC) para la transferencia a Estados Unidos. Si tu evaluación de riesgos exige un proveedor exclusivamente de la UE, Kunavo no es adecuado: ningún proveedor de nuestro catálogo está en la UE y toda solicitud pasa por nuestra puerta de enlace en US-East
3) Registro de auditoría: registrar cada llamada
Por solicitud: ID de solicitud, ID de usuario, modelo, prompt con hash, consumo de tokens, latencia, ID de solicitud como clave de correlación en tus propios registros:
# 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}El X-Request-ID es tu propia clave: Kunavo no evalúa ni almacena el encabezado, y nuestro panel de uso no muestra qué proveedor upstream atendió una llamada. Allí ves el ID de llamada propio de Kunavo para cada llamada, con fecha y hora, modelo, tokens, coste y latencia; compara con tu registro de auditoría usando la fecha, hora y el modelo.
Zero Data Retention (ZDR): solo directamente con el proveedor del modelo
De forma predeterminada, Anthropic y Google conservan registros de los prompts durante 30 días (Anthropic) y 60 días (Google) para supervisar abusos. Para cargas sensibles al RGPD, puedes solicitar ZDR directamente al proveedor, en tu propio contrato. Kunavo no ofrece enrutamiento ZDR ni un nivel ZDR: las solicitudes realizadas mediante Kunavo se procesan en Estados Unidos y se reenvían a proveedores upstream, sujetos a sus propias reglas de conservación.
- ZDR de Anthropic: para clientes Enterprise con un contrato directo con Anthropic. No está disponible mediante Kunavo
- Google Vertex AI: condiciones similares en tu propio contrato de Google Cloud, además de la posibilidad de elegir la región de la UE (europe-west4 / Países Bajos). Kunavo no enruta mediante una región de la UE
- OpenAI: Zero Data Retention solo para el nivel Enterprise, mediante un contrato directo con OpenAI. No puede contratarse a través de Kunavo
Residencia de los datos
- Enrutamiento de Kunavo: en la puerta de enlace, en una única región (US-East, Ashburn). Solo el edge Anycast situado delante termina TLS cerca de usted
- Persistencia de los datos de la cuenta: una única base de datos primaria en US-East con instantáneas diarias cifradas de los volúmenes. No ofrecemos enrutamiento exclusivo para la UE
- Impuesto sobre el valor añadido: el proceso de pago no muestra el IVA ni genera una factura; para obtener un justificante para la contabilidad, escriba a contact@kunavo.com
Lo que la mayoría de los equipos de cumplimiento pasan por alto
- El contenido del prompt es personal si contiene nombres, aunque el usuario no haya introducido «Müller», sino solo «me llamo Petra». El enmascaramiento debería detectar heurísticamente nombres y nombres propios
- El entrenamiento con tus datos está desactivado de forma predeterminada en Anthropic y Google (a diferencia de los consumidores de ChatGPT). Kunavo no entrena con tu contenido; lo que haga el proveedor upstream con él se rige por sus propias condiciones. Kunavo no ofrece una garantía contractual al respecto
- Aplicar hash al contenido de salida: solo almacenamos el hash, no el texto completo, si su DPA así lo exige
- Derecho de supresión: ante una solicitud conforme al art. 17 del RGPD, debe poder eliminar el prompt de sus registros. Esto solo funciona si sus registros de auditoría son eliminables (es decir, no están en estructuras de cadena de bloques de solo anexado)
Aviso legal y banner de cookies
Para un recorrido completo de cumplimiento, consulta nuestro /legal/impressum conforme al § 5 DDG y la política de privacidad en /legal/privacy. El banner de cookies debes gestionarlo en tu propio sitio web (por ejemplo, con Usercentrics, Cookiebot o Klaro); Kunavo solo establece cookies funcionales.
¿Listo? Regístrate gratis, recarga desde $10, paga según el uso y tu saldo nunca caducará. Si tu carga de trabajo requiere un AVV, ZDR o residencia de datos en la UE, firma el contrato directamente con el proveedor del modelo.