Systèmes IA dans l'UE : Concevoir pour le RGPD dès le Jour Un
Guide d'architecture pour construire des systèmes IA conformes au RGPD. Frontières de confiance, tokenisation sémantique, restauration pilotée par politique, et scénarios de production réels.
Le Mur de Conformité Dont Personne ne te Prévient
Voilà le truc : la plupart des architectures IA sont techniquement illégales dans l'UE dès qu'elles touchent aux données clients.
Pas parce que les équipes s'en fichent. Elles sont concernées. Le problème est plus simple et plus brutal : l'architecture par défaut de chaque tutoriel IA, chaque quickstart RAG, chaque framework d'agents envoie les données brutes des clients directement à un fournisseur de modèle externe. Noms, emails, identifiants clients, références de commande, données de facturation. Tout ça traverse vers une infrastructure que tu ne contrôles pas. Dans l'UE, selon les articles 44-49 du RGPD, c'est une violation de la protection des données avant même d'arriver aux parties intéressantes.
On a percuté ce mur nous-mêmes. On construisait un système de communication client alimenté par l'IA pour un client entreprise en Allemagne. La démo était brillante : personnalisée, contextualisée, de l'allemand formel avec des formules de politesse genrées correctes. Puis le service juridique a revu le diagramme d'architecture et posé une seule question :
"Où exactement le nom du client quitte-t-il notre infrastructure ?"
Tout s'est arrêté pendant trois semaines. La réponse ingénierie ("l'API d'OpenAI, mais ils n'entraînent pas sur nos données") n'a satisfait personne. Ni le DPO, ni le juridique, ni l'équipe d'achat du client.
L'industrie te donne un faux choix : soit utiliser l'IA de manière non sécurisée avec des données brutes, soit supprimer les données jusqu'à ce que l'IA devienne inutile. On a passé des mois à construire une troisième voie. C'est devenu le fondement d'OGuardAI, notre runtime open-source de protection sémantique des données. Cet article, c'est tout ce qu'on a appris.
Pourquoi Ça Compte Au-Delà du Juridique
Avant d'entrer dans l'architecture : ce n'est pas seulement un problème de conformité. C'est un bloqueur business, un risque sécurité, et un défi d'ingénierie, simultanément. Tu peux voir comment on aborde les projets enterprise sur notre page méthodologie et notre vue d'ensemble des services.
| Partie prenante | Ce qu'elle demande | Ce dont elle a vraiment besoin |
|---|---|---|
| CEO / Fondateur | "On peut utiliser l'IA en toute sécurité ?" | Un OUI clair avec des preuves pour le board et les investisseurs |
| CTO / VP Engineering | "C'est quoi l'architecture ?" | Un modèle de frontière de confiance qui résiste à un audit de sécurité |
| DPO / Juridique | "Où vont les données personnelles ?" | La preuve que les données brutes ne quittent jamais l'infrastructure contrôlée |
| Product Owner | "On peut toujours personnaliser ?" | La confirmation que la qualité de l'output IA ne se dégrade pas |
| Ingénieur Senior | "Comment j'implémente ça ?" | APIs, SDKs, pipeline de détection, modes de restauration |
| Architecte Plateforme | "Ça scale ?" | Conception multi-tenant, multi-langue, multi-politique |
Si une seule de ces personnes dit non, ton projet IA est mort. C'est pourquoi cette architecture doit satisfaire tout le monde en même temps.
Le Modèle de Frontière de Confiance
Le concept le plus important dans l'architecture IA conforme au RGPD, c'est la frontière de confiance. Ce n'est pas une bibliothèque. Ce n'est pas un flag de config. C'est une décision architecturale sur les données qui transitent vers des systèmes que tu ne contrôles pas entièrement. Si tu découvres notre approche de l'architecture système chez Oronts, ce guide fournit un contexte utile.
┌──────────────────────────────────────────────────────────────────┐
│ TRUSTED ZONE │
│ (Your Infrastructure) │
│ │
│ ┌────────────┐ ┌────────────┐ ┌──────────────────────┐ │
│ │ Raw PII │───▶│ Detect │───▶│ Session Mapping │ │
│ │ Input │ │ Engine │ │ (AES-256-GCM │ │
│ │ │ │ │ │ encrypted) │ │
│ └────────────┘ └─────┬──────┘ └──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ Tokenized Text │ │
│ │ + entity_context│ │
│ └────────┬─────────┘ │
│ ════════════════════════╪════════════════════════════════════════ │
│ TRUST │ BOUNDARY │
│ ════════════════════════╪════════════════════════════════════════ │
│ ▼ │
│ ┌───────────────────────────────────────────┐ │
│ │ UNTRUSTED ZONE │ │
│ │ (LLM Provider / External API) │ │
│ │ │ │
│ │ Sees: {{person:p_001}}, {{email:e_001}} │ │
│ │ + metadata: gender=female, formality= │ │
│ │ formal, language=de │ │
│ │ Never sees: "Sara Mustermann", │ │
│ │ "sara.mustermann@beispiel.de" │ │
│ └──────────────────────┬─────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Token Repair │─▶│ Output Guard │─▶│ Rehydrate │ │
│ │ (3-stage) │ │ (catch new │ │ (policy-driven │ │
│ │ │ │ PII) │ │ restore) │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
La règle est absolue : les données personnelles brutes restent dans la zone de confiance. Seuls les tokens sémantiques traversent vers la zone non fiable. Le LLM ne voit jamais un vrai nom, un vrai email, un vrai numéro de téléphone, un vrai IBAN. Il voit {{person:p_001}}, {{email:e_001}}, {{phone:ph_001}}.
| Zone | Contient | Ne contient jamais |
|---|---|---|
| Zone de confiance (ton runtime) | Données personnelles brutes, mappages de tokens, clés de chiffrement, règles de politique | — |
| Zone non fiable (LLMs, outils, logs, vector stores) | Uniquement des tokens {{type:id}} + métadonnées sûres | Noms bruts, emails, identifiants, toute donnée personnelle |
| Franchissement de frontière | Texte tokenisé + métadonnées entity_context | Toute valeur sensible brute |
C'est ce qui fait signer les contrats enterprise. Pas les fonctionnalités. Des frontières de confiance prouvables.
Pourquoi le Masquage Naïf Détruit la Qualité IA
La première chose que chaque équipe essaie, c'est le remplacement de chaînes : remplacer "Sara Mustermann" par [NAME], envoyer au modèle, remplacer [NAME] à nouveau.
Ça échoue de manière catastrophique en production :
| Problème | Ce qui se passe | Impact business |
|---|---|---|
| Collapse sémantique | [NAME] ne porte aucun contexte, le modèle ne peut pas déterminer le genre, la formalité, la relation | Output générique qui ressemble à du spam |
| Formule de politesse allemande | "Sehr geehrte Frau Mustermann" devient "Sehr geehrte [NAME]", grammaticalement cassé | Communication non professionnelle |
| Confusion multi-entités | Deux personnes dans un texte, toutes les deux [NAME], le modèle les confond | La mauvaise personne reçoit la confirmation de remboursement |
| Ambiguïté de restauration | Trois [NAME] dans l'output, lequel est lequel ? | Échec d'intégrité des données |
| Honorifiques arabes | Le préfixe honorifique correct dépend du genre, du statut, de la relation | Output culturellement offensant |
Le problème de la formule de politesse allemande à lui seul a tué notre première approche. En communication professionnelle allemande, tu as besoin de :
- Genre : "Herr" (M.) ou "Frau" (Mme). Se tromper de genre est une faute professionnelle sérieuse
- Cas grammatical correct : "Sehr geehrter Herr" vs "Sehr geehrte Frau" (terminaison différente selon le genre)
- Reconnaissance des titres : préfixe "Dr." ou "Prof." quand applicable
- Cohérence : la même personne doit être adressée de la même façon tout au long d'un document de 3 pages
Si ton modèle voit seulement [NAME], il est littéralement incapable de produire une lettre formelle allemande correcte. L'output est soit grammaticalement faux, culturellement inapproprié, ou tellement générique qu'il ressemble à un template. Et les emails génériques ne convertissent pas. C'est exactement le type de mode de défaillance IA qui tue l'adoption enterprise.
Tokenisation Sémantique : L'Architecture Qui Fonctionne
La tokenisation sémantique est fondamentalement différente du masquage. Au lieu de supprimer de l'information, elle remplace les valeurs brutes par des tokens qui portent suffisamment de métadonnées pour que le LLM produise un output correct, sans jamais voir les données réelles.
Format des Tokens et Métadonnées
{{type:id}}
- type : l'un des 12+ types d'entités enregistrés (person, email, phone, company, customer_id, order, address, iban, ssn, ip, passport, health_id)
- id : identifiant déterministe à portée de session (préfixe + compteur :
p_001,e_001,ph_001)
Chaque token porte des métadonnées structurées. C'est ce qui le rend sémantique, pas juste un placeholder :
| Champ | Valeurs | Finalité | Exemple |
|---|---|---|---|
gender | male, female, unknown | Genre grammatical pour la génération d'adresses | "Frau" vs "Herr" |
formality | formal, informal | Contrôle du registre | "Sehr geehrte" vs "Hallo" |
language | ISO 639-1 (de, en, ar, fr...) | Langue source de l'entité | Détermine les règles de réhydratation |
role | recipient, sender, subject, reference | Rôle sémantique dans la conversation | Qui est adressé vs qui est mentionné |
belongs_to | ID du token parent | Lien d'appartenance | L'email e_001 appartient à la personne p_001 |
Ces métadonnées sont envoyées au LLM en tant qu'entity_context. Des informations de niveau type, sûres, qui ne contiennent aucune valeur brute :
{
"entity_context": [
{
"token": "{{person:p_001}}",
"type": "person",
"gender": "female",
"formality": "formal",
"language": "de",
"role": "recipient"
},
{
"token": "{{email:e_001}}",
"type": "email",
"belongs_to": "p_001"
},
{
"token": "{{customer_id:cid_001}}",
"type": "customer_id"
}
]
}
Le modèle sait qu'il écrit à une destinataire formelle, féminine, germanophone. Il ne connaît pas son nom.
Le Pipeline de Détection
La détection, ce n'est pas un simple regex. C'est un système en couches qui combine vitesse et précision :
| Couche | Technologie | Latence | Ce qu'elle capture | Confiance |
|---|---|---|---|---|
| Regex intégrés | Patterns compilés (Rust) | ~1-5ms | Emails, téléphones, IBANs, IPs, URLs, SSNs, IDs structurés | 0.95-1.0 |
| Heuristiques de patterns | Règles contextuelles | ~2-8ms | IDs clients (format spécifique), références de commande, dates | 0.80-0.95 |
| Modèles NER | spaCy / transformers (sidecar Python) | ~15-50ms | Noms de personnes, noms d'entreprises, adresses, PII non structurées | 0.70-0.95 |
| Détecteurs personnalisés | Règles définies par l'utilisateur | Variable | Entités spécifiques au domaine (codes produits, refs internes) | Configurable |
En production, tu lances le regex en premier (rapide, haute précision pour les données structurées), puis le NER pour les entités non structurées. L'approche en couches fait que les données personnelles structurées comme les emails et les IBANs sont capturées à latence quasi nulle, tandis que les noms et adresses reçoivent le traitement NER complet. Pour surveiller les performances dans le temps, consulte notre guide sur l'observabilité IA.
// Exemple de configuration de détection
const config = {
detectors: ["builtin_regex", "ner_spacy"],
entity_types: ["person", "email", "phone", "customer_id", "iban"],
threshold: 0.7, // confiance minimum pour tokeniser
language: "de" // indication pour le modèle NER
};
Scénario de Production Complet : Support Client Allemand
Parcourons un cycle de production complet. Pas un exemple simplifié, mais ce qui se passe réellement dans un vrai système de communication client.
Entrée (ticket de support client) :
Hallo, ich bin Sara Mustermann. Meine Kundennummer ist 948221.
Ich warte seit 5 Tagen auf meine Rückzahlung.
Meine E-Mail ist sara.mustermann@beispiel.de, bitte schickt mir eine Bestätigung.
Étape 1 : Détection
| Entité | Type | Confiance | Détecteur | Métadonnées |
|---|---|---|---|---|
| Sara Mustermann | person | 0.95 | ner_spacy | gender: female, formality: formal, language: de, role: recipient |
| 948221 | customer_id | 0.99 | builtin_regex | — |
| sara.mustermann@beispiel.de | 1.0 | builtin_regex | belongs_to: p_001 |
Étape 2 : Texte sécurisé tokenisé (envoyé au LLM)
Hallo, ich bin {{person:p_001}}. Meine Kundennummer ist {{customer_id:cid_001}}.
Ich warte seit 5 Tagen auf meine Rückzahlung.
Meine E-Mail ist {{email:e_001}}, bitte schickt mir eine Bestätigung.
Étape 3 : Le LLM génère la réponse (sortie du modèle)
Sehr geehrte {{person:p_001}},
vielen Dank für Ihre Nachricht. Es tut uns leid, dass Sie bereits seit
5 Tagen auf Ihre Rückzahlung warten.
Wir haben Ihren Fall unter der Kundennummer {{customer_id:cid_001}}
überprüft und die Rückzahlung wurde heute angewiesen. Sie erhalten
eine Bestätigung an {{email:e_001}} innerhalb der nächsten 24 Stunden.
Mit freundlichen Grüßen,
Ihr Support-Team
Étape 4 : Réhydratation (canal de sortie : customer_email, restauration : formatted)
Sehr geehrte Frau Sara Mustermann,
vielen Dank für Ihre Nachricht. Es tut uns leid, dass Sie bereits seit
5 Tagen auf Ihre Rückzahlung warten.
Wir haben Ihren Fall unter der Kundennummer 948221 überprüft und die
Rückzahlung wurde heute angewiesen. Sie erhalten eine Bestätigung
an sara.mustermann@beispiel.de innerhalb der nächsten 24 Stunden.
Mit freundlichen Grüßen,
Ihr Support-Team
Ce qui s'est passé :
- Le LLM a écrit de l'allemand formel correct : "Sehr geehrte" (pas "Sehr geehrter") parce qu'il savait que la destinataire est féminine
- "Frau" a été ajouté automatiquement pendant la restauration
formatted. Le modèle n'a jamais décidé ça - L'ID client a été restauré parce que la politique l'autorise pour les emails aux clients
- L'email a été restauré parce que la cliente a explicitement demandé une confirmation à cette adresse
- Le modèle n'a jamais vu "Sara Mustermann", "948221", ni "sara.mustermann@beispiel.de"
Trois Niveaux de Protection pour Différentes Données
Toutes les données ne sont pas également sensibles. Un modèle à trois niveaux gère cette réalité. Ce type d'approche pilotée par politique est au coeur de la façon dont nous concevons les systèmes IA et les pipelines de workflow IA chez Oronts.
Niveau 1 : Masquage dur (jamais réversible)
S'applique à : iban, ssn, passport, health_id
Ceux-ci portent des obligations réglementaires (RGPD Art. 9 catégories spéciales, PCI-DSS, HIPAA). Leurs valeurs brutes ne sont jamais stockées sous forme réversible.
| Action | Comportement | Quand l'utiliser |
|---|---|---|
block | Requête rejetée si l'entité est détectée | Interdiction absolue (ex: données de santé dans l'IA marketing) |
remove | Entité supprimée du texte entièrement | Minimisation des données, l'entité n'est pas nécessaire |
abstract | Remplacée par une étiquette de catégorie : [IBAN on file] | Le LLM a besoin de savoir qu'elle existe, pas sa valeur |
hard_mask | Masque de longueur fixe : DE** **** **** **** ** | Préserver le format sans révéler la valeur |
Niveau 2 : Tokenisation réversible (contrôlée par politique)
S'applique à : person, email, phone, company, customer_id, order, address, ip, url
Ceux-ci sont tokenisés avec des métadonnées sémantiques et restaurés selon la politique du canal de sortie. La même tokenisation produit des résultats différents pour des audiences différentes :
| Mode de restauration | Person | Phone | |
|---|---|---|---|
full | Sara Mustermann | sara.mustermann@beispiel.de | +49 30 12345678 |
partial | S. Mustermann | s***@beispiel.de | ***5678 |
masked | **** ****** | s***********************e | +** ** ******** |
formatted | Frau Sara Mustermann | sara.mustermann@beispiel.de (E-Mail) | +49 30 12345678 (Mobil) |
abstract | (weibliche Kundin) | (E-Mail hinterlegt) | (Telefon hinterlegt) |
none | [REDACTED] | [REDACTED] | [REDACTED] |
Les mêmes données tokenisées, des politiques différentes par canal :
| Canal de sortie | person | customer_id | iban | |
|---|---|---|---|---|
customer_email | formatted | full | full | none |
internal_summary | full | full | full | partial (4 derniers) |
export/analytics | abstract | none | abstract | none |
log_safe | none | none | none | none |
C'est l'insight clé : tokenise une fois, restaure différemment par canal. Le client reçoit "Frau Sara Mustermann" dans son email. L'équipe interne voit "Sara Mustermann" avec tous les détails. L'export analytics voit "(female customer)". Le journal d'audit ne voit aucune donnée personnelle.
Niveau 3 : Abstraction sémantique (métadonnées uniquement)
S'applique à : genre, formalité, statut VIP, département
Aucune valeur brute n'est stockée. Seules les métadonnées sémantiques circulent dans le système. Le LLM sait que la destinataire est féminine et formelle. Suffisant pour produire une grammaire correcte, sans aucune donnée brute impliquée.
Workflows Agentiques : Là Où Ça Devient Exponentiellement Plus Dur
Les appels LLM simples, c'est le cas facile. Les systèmes IA agentiques, où un agent IA effectue plusieurs étapes avec des outils, multiplient la surface de fuite de manière exponentielle. Nous couvrons l'architecture des agents en profondeur dans notre guide d'architecture multi-agents, mais ici nous nous concentrons spécifiquement sur le défi de la protection des données.
Considère un workflow d'agent de support :
Step 1: Read ticket → PII in ticket text
Step 2: Look up customer → PII in CRM response
Step 3: Check billing → PII in billing data
Step 4: Draft response → PII in prompt + output
Step 5: Trigger refund → PII in API call
Cinq étapes = cinq points de fuite potentiels. Sans protection, les données fuient dans le contexte du modèle, les arguments d'appels d'outils, les chaînes de raisonnement intermédiaires, la mémoire de l'agent, et les logs. Chaque étape aggrave le risque.
La solution : envelopper chaque franchissement de frontière de confiance, pas juste l'appel LLM final.
Step 1: Read ticket
→ Raw ticket with PII
→ TRANSFORM → Agent sees tokenized ticket
Step 2: Look up customer (tool call)
Agent requests: get_customer({{customer_id:cid_001}})
→ Runtime intercepts → real ID used for lookup (inside trust boundary)
→ Tool response TRANSFORMED before returning to agent
Step 3: Check billing (tool call)
Agent requests: check_billing({{customer_id:cid_001}})
→ Same pattern: real ID used internally, response tokenized
Step 4: Draft response
Agent has: tokenized ticket + tokenized customer info + tokenized billing
→ Generates response with tokens
→ REHYDRATE for customer_email channel
Step 5: Trigger refund (tool call)
Agent requests: issue_refund({{customer_id:cid_001}}, {{order:o_001}})
→ Runtime passes real values to refund API (inside trust boundary)
→ Confirmation tokenized before returning to agent
L'agent ne voit jamais de données personnelles brutes à aucune étape. Les payloads d'outils sont gouvernés étape par étape. Chaque franchissement de la frontière de confiance est protégé. La piste d'audit montre exactement quelles entités ont été détectées, tokenisées et restaurées à chaque étape, sans contenir elle-même de données personnelles. Pour les portes d'approbation qui rendent les décisions d'agents sûres, consulte notre guide sur les systèmes IA human-in-the-loop.
Protection du Pipeline RAG
La génération augmentée par récupération (RAG) introduit un second vecteur de fuite : ton vector store. Si tu indexes des documents avec des données personnelles brutes, l'intégralité de ton pipeline de retrieval devient un système réglementé par le RGPD. Pour un regard approfondi sur l'architecture RAG elle-même, consulte notre guide des systèmes RAG entreprise et notre guide d'architecture de recherche vectorielle.
Deux approches :
A. Tokenisation à l'Ingestion
Les documents sont tokenisés avant le chunking et l'embedding :
- Les chunks contiennent
{{person:p_001}}au lieu de vrais noms - Les embeddings sont construits sur du texte tokenisé
- Le vector store ne contient jamais de données personnelles brutes
- Compromis : qualité de retrieval légèrement inférieure pour les requêtes basées sur les noms
B. Tokenisation au Moment de la Requête (Recommandé)
Les documents sont stockés bruts dans un environnement contrôlé. Au moment de la requête :
User: "What is the status of Sara Mustermann's refund?"
→ TRANSFORM query: "What is the status of {{person:p_001}}'s refund?"
→ RETRIEVE: chunks about refund policies (may contain PII)
→ TRANSFORM retrieved chunks: replace PII with tokens
→ LLM: generates answer using only tokens
→ REHYDRATE: restore per output channel policy
→ User sees: personalized answer with real names where allowed
L'approche au moment de la requête préserve la qualité de retrieval (les embeddings matchent sur les termes réels) tout en protégeant la frontière LLM. Le vector store est dans la zone de confiance ; seul le LLM est en dehors.
Architecture de Session : Sécurité Stateless
Un système de production ne peut pas se permettre un état de session côté serveur pour chaque requête. On a conçu des sessions scellées : des blobs chiffrés AES-256-GCM qui voyagent avec la requête.
Transform request → runtime creates token map
→ serializes + encrypts with AES-256-GCM
→ returns encrypted blob as session_state
→ client stores blob (opaque, tamper-proof)
Rehydrate request → client sends session_state blob back
→ runtime verifies GCM authentication tag
→ decrypts → resolves tokens → restores values
→ no server-side state required
Pourquoi c'est important architecturalement :
| Propriété | Sessions Scellées | Sessions Côté Serveur |
|---|---|---|
| État serveur | Zéro | Nécessite Redis/DB |
| Scaling horizontal | Trivial, n'importe quelle instance gère n'importe quelle requête | Nécessite un store de sessions partagé |
| Mode d'échec | Si le blob est perdu, la réhydratation échoue gracieusement | Si Redis tombe, tout s'effondre |
| Détection de falsification | Tag d'authentification GCM, intégrité au niveau du bit | Nécessite une couche HMAC en plus |
| Multi-tour | Passer le blob en avant, nouveaux blobs pour les nouveaux tours | ID de session + gestion du TTL |
L'enveloppe de session scellée contient l'ID de session, l'ID du tenant, la version de la politique, le timestamp d'expiration, et la token map chiffrée. Le tout vérifié par le tag d'authentification GCM. Si un seul bit change, le blob entier est rejeté. Échec fermé, toujours.
Réparation de Tokens : Gérer les Imperfections du LLM
Les LLMs ne sont pas des processeurs de texte parfaits. Quand tu envoies {{person:p_001}}, le modèle peut retourner :
| Mutation | Exemple | Fréquence |
|---|---|---|
| Accolades externes manquantes | {person:p_001} | ~1-2% |
| Type en majuscule | {{Person:p_001}} | ~0.5-1% |
| Espaces ajoutés | {{ person:p_001 }} | ~0.5% |
| Tronqué à la limite du token | {{person:p_001 | ~0.3% |
| Coupé sur plusieurs lignes | {{person:\np_001}} | ~0.1% |
Un système de production a besoin d'un pipeline de réparation en trois étapes :
- Parse strict : regex canonique
{{type:id}}. Gère ~97% des cas. - Réparation déterministe : patterns de mutation connus (accolades manquantes, normalisation de casse, collapse d'espaces). Attrape ~2.5%.
- Résolution floue : distance de Levenshtein par rapport aux tokens connus dans la session. Dernier recours pour les ~0.5% restants.
Sans réparation de tokens, tes emails aux clients contiennent {{person:p_001}} au lieu d'un nom. On a vu ça arriver à un taux de ~2-5% chez différents fournisseurs de modèles. Certains modèles (GPT-4o, Claude) préservent bien les tokens ; les modèles plus petits ou locaux font pire.
Output Guard : Capturer les Données Personnelles Hallucinées
Voici un risque que la plupart des équipes ratent : le LLM peut halluciner des données personnelles qui n'étaient pas dans l'input original. Nous couvrons d'autres modes de défaillance IA dans un guide dédié, mais celui-ci mérite une attention particulière.
Si tu demandes au modèle d'écrire une réponse à {{person:p_001}}, il pourrait inventer un numéro de téléphone, une adresse, ou le nom d'un collègue à partir de ses données d'entraînement. Ces données personnelles hallucinées ne sont pas protégées par ta tokenisation, parce qu'elles n'ont jamais été tokenisées.
La solution : un second passage d'output guard qui lance le pipeline de détection sur la réponse du modèle. S'il trouve des données personnelles qui ne correspondent à aucun token connu dans la session, il les signale ou les supprime.
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ LLM Response │────▶│ Token Repair │────▶│ Output Guard │
│ (with tokens)│ │ (3-stage) │ │ (detect NEW │
│ │ │ │ │ PII in output)│
└───────────────┘ └───────────────┘ └────────┬───────┘
│
┌───────▼───────┐
│ Rehydrate │
│ (restore known│
│ tokens only) │
└───────────────┘
Le modèle a inventé un numéro de téléphone ? Capturé. A mentionné le vrai nom d'une personne depuis ses données d'entraînement ? Capturé. A référencé une vraie entreprise qui n'était pas dans l'input ? Signalé pour revue.
Réhydratation Sensible à la Langue
L'allemand, ce n'est que le début. Chaque langue a des règles grammaticales qui interagissent avec les données personnelles :
| Langue | Défi | Output correct | Output cassé (masquage naïf) |
|---|---|---|---|
| Allemand | Formule de politesse genrée | "Sehr geehrte Frau Mustermann" | "Sehr geehrte [NAME]" |
| Allemand | Cas grammatical | "Schreiben Sie Herrn Mustermann" (accusatif) | "Schreiben Sie [NAME]" |
| Arabe | Préfixe honorifique + RTL | "السيدة موسترمان المحترمة" | "[NAME]" |
| Français | Articles genrés | "Chère Madame Mustermann" | "Cher/Chère [NAME]" |
| Anglais | Contrôle du registre | "Dear Ms. Mustermann" vs "Hi Sara" | "Dear [NAME]" |
Les métadonnées du token (gender, formality, language) permettent une réhydratation correcte dans n'importe quelle langue. Le mode de restauration formatted applique des règles spécifiques à chaque langue :
- Allemand formel féminin : "Frau" + nom complet → "Frau Sara Mustermann"
- Allemand formel masculin : "Herr" + nom complet → "Herr Refaat K."
- Arabe formel féminin : préfixe honorifique en RTL → "السيدة موسترمان"
- Français formel féminin : "Madame" + nom de famille → "Madame Mustermann"
Le LLM produit la bonne structure grammaticale parce qu'il sait que le token représente une destinataire formelle féminine. Il ne connaît pas son nom, mais l'output est grammaticalement parfait.
Pistes d'Audit Qui Ne Créent Pas de Nouvelles Responsabilités
Ton infrastructure de logging devient une responsabilité RGPD au moment où tu logues des prompts bruts. Ton Datadog, CloudWatch, Elasticsearch : tous deviennent des systèmes qui traitent des données personnelles, chacun nécessitant sa propre documentation RGPD, ses politiques de rétention, et ses procédures d'accès aux données des sujets.
La règle : loguer les tokens, jamais les valeurs.
// Correct : log structuré audit-safe
{
"event": "transform_complete",
"session_id": "ses_a8f3c2",
"entities_detected": 3,
"entity_types": ["person", "email", "customer_id"],
"token_ids": ["p_001", "e_001", "cid_001"],
"policy_applied": "german-support",
"protection_levels": [2, 2, 2],
"detection_time_ms": 8,
"transform_time_ms": 12
}
// Faux : PII dans les logs. Maintenant tout ton pipeline de logs est réglementé RGPD
{
"event": "transform_complete",
"original_name": "Sara Mustermann", // PII dans les logs !
"original_email": "sara.mustermann@beispiel.de", // PII dans les logs !
"prompt": "Hallo, ich bin Sara Mustermann..." // PII dans les logs !
}
Chaque opération est entièrement auditable : tu peux tracer que p_001 a été détecté par ner_spacy avec une confiance de 0.95, tokenisé sous la politique german-support, et restauré en mode formatted sur le canal customer_email. Tu peux reconstruire la chaîne complète. Mais la piste d'audit elle-même ne contient aucune donnée personnelle.
Cela satisfait :
- RGPD Art. 30 : Registre des activités de traitement. Tu peux démontrer exactement ce qui arrive aux données personnelles
- RGPD Art. 35 : Analyse d'impact relative à la protection des données. Ta piste d'audit prouve que l'architecture fonctionne sans être elle-même un risque data
- RGPD Art. 5(1)(c) : Minimisation des données. Seules les données nécessaires sont traitées, et uniquement sous forme tokenisée en dehors de la frontière de confiance
CRM Copilot : Mêmes Données, Canaux Différents
Regardons un scénario CRM où le même input produit des outputs différents par canal. C'est le type d'architecture logicielle sur mesure que nous construisons régulièrement pour les clients enterprise.
Entrée d'enregistrement CRM :
{
"contact_name": "Refaat K.",
"email": "r.k@oronts.com",
"company": "Oronts GmbH",
"deal_value": "€125,000",
"quote_id": "Q-2026-0847",
"last_interaction": "Discussed pricing, needs board approval"
}
Prompt tokenisé envoyé au LLM :
Draft a follow-up email to {{person:p_001}} at {{company:c_001}}.
Context: discussed pricing, needs board approval.
Deal reference: {{order:o_001}}.
Tone: professional, friendly, not pushy.
Le LLM ne voit jamais "Refaat K.", "Oronts GmbH", "€125,000", ni l'ID du devis. Il rédige un email de suivi avec des tokens.
Décisions de politique par entité et canal de sortie :
| Entité | Type | customer_email | internal_summary | analytics_export |
|---|---|---|---|---|
| Refaat K. | person | full | full | abstract |
| r.k@oronts.com | none (pas dans le body) | full | none | |
| Oronts GmbH | company | full | full | abstract |
| €125,000 | order | none (jamais en sortie) | full | abstract |
| Q-2026-0847 | order | full (nécessaire comme ref) | full | none |
Même tokenisation. Trois outputs complètement différents. L'email au client contient le nom et la référence de devis mais jamais la valeur du deal. Le résumé interne contient tout. L'export analytics ne contient que des agrégats anonymisés.
Feuille de Route d'Implémentation
Si tout ça te semble beaucoup à implémenter seul, notre équipe de consulting a guidé plusieurs clients enterprise à travers exactement ce processus. Tu peux aussi demander un devis pour une revue d'architecture de frontière de confiance.
Phase 1 : Cartographier tes Flux de Données
- Inventorie chaque endroit où des données personnelles entrent dans ton pipeline IA (prompts, chunks RAG, appels d'outils, mémoire de l'agent, messages d'erreur, logs)
- Identifie quelles données le LLM a réellement besoin vs ce qu'il reçoit actuellement
- Dessine la frontière de confiance : ce qui reste dedans, ce qui la traverse
Phase 2 : Construire la Détection
- Commence par le regex pour les données personnelles structurées (emails, téléphones, IBANs). C'est rapide et haute précision
- Ajoute le NER pour les noms et adresses. Utilise spaCy ou transformers avec des modèles spécifiques à chaque langue
- Fixe les seuils de confiance : 0.95+ pour le regex, 0.70+ pour le NER
- Teste le taux de faux négatifs. Des données personnelles manquées, c'est pire que des faux positifs
Phase 3 : Implémenter la Tokenisation
- Définis ton format de token (
{{type:id}}) et le schéma de métadonnées - Construis le mappage de session avec le chiffrement scellé (AES-256-GCM)
- Implémente les niveaux de protection par type d'entité
- Crée des politiques par canal de sortie
Phase 4 : Pipeline de Réhydratation
- Réparation de tokens (strict → déterministe → flou)
- Output guard (détecter les données personnelles hallucinées dans les réponses du modèle)
- Modes de restauration pilotés par politique, par canal
- Formatage sensible à la langue (adresses genrées, honorifiques)
Phase 5 : Intégration de la Conformité
- Logging d'audit structuré (IDs de tokens, jamais les valeurs)
- Registre de traitement RGPD Art. 30
- AIPD RGPD Art. 35 avec preuves architecturales
- Intégration avec le processus de revue de ton DPO
- Consulte notre vue d'ensemble confiance et conformité pour la façon dont nous documentons ces garanties pour nos clients
Pièges Courants
- Loguer les prompts bruts. Ton Datadog devient un système réglementé RGPD du jour au lendemain. Logue les IDs de tokens, jamais les valeurs.
- Sauter la réparation de tokens. 2-5% des réponses LLM auront des tokens malformés. Ton client voit
{{person:p_001}}au lieu d'un nom. - Pas d'output guard. Le modèle hallucine des données personnelles depuis ses données d'entraînement. Tu viens de fuiter le vrai numéro de téléphone de quelqu'un d'autre.
- Le même mode de restauration partout. Les emails clients et les dashboards analytics ont besoin de niveaux de détail fondamentalement différents.
- Ignorer les workflows agentiques. Un agent en 5 étapes a 5+ points de fuite. Protéger seulement l'appel LLM final, c'est comme verrouiller la porte d'entrée avec les fenêtres ouvertes.
- "Auto-hébergeons notre propre LLM." Coûte 10x plus cher, prend 6+ mois, et tu as toujours besoin de gouvernance des données. Le problème, c'est l'architecture, pas l'hébergement.
- Traiter la conformité après coup. Le juridique va bloquer ton déploiement six semaines avant le lancement. Implique-les dès le premier jour.
- Pas de sessions scellées. L'état de session côté serveur signifie que ton cluster Redis devient un point de défaillance unique pour chaque requête IA.
- Masquage ignorant la langue.
[NAME]dans une correspondance formelle allemande, c'est une perte de crédibilité professionnelle immédiate. - Embarquer des données personnelles dans les vecteurs. Ta base de données vectorielle devient le plus grand stock de données personnelles non audité de ton infrastructure.
Points Clés à Retenir
- La frontière de confiance est une décision d'architecture, pas une bibliothèque. Dessine-la, applique-la à chaque franchissement, audite-la sans données personnelles dans les logs.
- La tokenisation sémantique préserve la qualité IA là où le masquage naïf la détruit. Le modèle reçoit le genre, la formalité, les métadonnées de langue. Suffisant pour une grammaire correcte sans valeurs brutes.
- Trois niveaux de protection correspondent à la sensibilité réelle des données : masque dur pour le réglementé, tokenise l'utile, abstrait les métadonnées.
- La restauration pilotée par politique signifie qu'une tokenisation sert tous les canaux : les emails clients reçoivent des noms formatés, l'analytics reçoit des labels abstraits, les logs ne reçoivent rien.
- Les workflows agentiques multiplient le risque exponentiellement. Chaque appel d'outil, chaque étape de raisonnement, chaque écriture en mémoire est un point de fuite potentiel. Protège chaque franchissement de frontière.
- Les sessions scellées éliminent l'état serveur. Les blobs chiffrés AES-256-GCM voyagent avec la requête, scalent horizontalement, et échouent fermé en cas de falsification.
- La réhydratation sensible à la langue est la différence entre "Dear [NAME]" et "Sehr geehrte Frau Mustermann". Cette différence détermine si ton client enterprise approuve le système.
Construire des systèmes IA qui sont à la fois puissants et conformes au RGPD, ce n'est pas une contradiction. C'est un problème d'architecture. La solution consiste à tracer les bonnes frontières de confiance, préserver les bonnes métadonnées, et contrôler la restauration par canal de sortie.
On a construit OGuardAI comme un runtime open-source exactement pour ce problème. Détecter, transformer, réhydrater avec la tokenisation sémantique, les sessions scellées, et la restauration pilotée par politique. C'est l'architecture décrite dans cet article, packagée comme un système prêt pour la production.
Si tu évalues des architectures IA pour ton entreprise, nos services IA couvrent la stack complète, de la conception de frontière de confiance au déploiement en production. Tu peux aussi explorer notre approche de la protection des données et de la conformité, ou en lire plus sur l'orchestration IA entreprise et la gouvernance IA en production.
Prêt à concevoir une architecture IA conforme au RGPD ? Parle à notre équipe ou demande un devis. On a livré ça pour des systèmes de production qui traitent des milliers d'interactions clients quotidiennement en allemand, arabe, français et anglais.
Sujets couverts
Guides connexes
Guide Entreprise des Systèmes d'IA Agentiques
Guide technique des systemes d'IA agentiques en entreprise. Decouvre l'architecture, les capacites et les applications des agents IA autonomes.
Lire le guideCommerce Agentique : Comment laisser les agents IA acheter en toute securite
Comment concevoir un commerce agentique gouverne. Moteurs de politiques, portes d'approbation HITL, reçus HMAC, idempotence, isolation multi-tenant et le protocole Agentic Checkout complet.
Lire le guideLes 9 endroits où ton système IA laisse fuir des données (et comment colmater chacun)
Cartographie systématique de chaque point de fuite de données dans les systèmes IA. Prompts, embeddings, logs, appels d'outils, mémoire d'agent, messages d'erreur, cache, données de fine-tuning et transferts entre agents.
Lire le guidePrêt à construire des systèmes IA prêts pour la production ?
Notre équipe est spécialisée dans les systèmes IA prêts pour la production. Discutons de comment nous pouvons aider.
Démarrer une conversation