Données confidentielles

Comment masquer les données personnelles avant d'envoyer un prompt à OpenAI ?

Par Protypa · Mis à jour le 5 min de lecture

La réponse courte

Masquer une donnée personnelle avant un envoi à un fournisseur d'IA, c'est la remplacer par un alias dans le prompt, envoyer le texte ainsi transformé, puis remettre la vraie valeur dans la réponse. Le modèle raisonne sur [EMAIL_k3j2h], vous lisez jean.dupont@exemple.fr.

Subsidia le fait automatiquement, mais seulement quand la demande peut atteindre un fournisseur externe (OpenAI, Anthropic, Mistral, etc.). Vers un modèle local, il ne masque rien : rien ne quitte la machine.

Ce que le bouclier remplace, exactement

Le bouclier (appelé « PII shield » dans la documentation) cherche des valeurs qui ont une forme reconnaissable. Voici ce que fait chaque mode, d'après le code du produit.

ModeCe qui est remplacéPour quel usage
Standard (par défaut)E-mails, numéros de téléphone et de fax, numéros de carte bancaire (validés par la clé de Luhn), IBAN, numéros à la forme du « social security number » américain, adresses IP et MACComptabilité, juridique, trafic professionnel courant
MédicalTout le mode standard, plus les noms de personnes, les dates (l'année est conservée), les âges de 90 ans et plus, les codes postaux, les URL, les numéros de dossier ou de compte, le NIR français, le numéro NHS britannique, les numéros de série de véhiculeDonnées de santé
DésactivéRienInstallations qui n'utilisent que des modèles locaux, ou tests

Deux précisions importantes.

  • Les noms ne sont pas masqués en mode standard. Un nom de client dans votre prompt part en clair, sauf si vous activez l'option « Masquer aussi les noms de personnes » de l'espace de travail ou le mode médical. Le mode médical retire aussi les dates, donc des faits dont une question comptable ou juridique dépend : ne l'activez que pour un trafic clinique.
  • Le contenu clinique n'est pas touché en mode médical : diagnostics et médicaments restent, seuls les identifiants sont retirés.

Des alias cohérents, restitués dans la réponse

Un alias n'est pas un simple « [EMAIL] » : son suffixe est calculé à partir de la valeur (accents, casse et civilité écartés). Conséquences :

  • la même valeur donne le même alias partout : dans tous les tours d'une conversation, dans des requêtes séparées, dans des documents différents ;
  • deux valeurs différentes restent distinctes : le modèle ne confond pas deux clients ;
  • la restitution se fait depuis une mémoire propre à l'appel, après la réponse du modèle.

C'est ce qui permet à un modèle de suivre « le deuxième e-mail de [EMAIL_k3j2h] » sans jamais voir l'adresse.

Voici l'illustration donnée par la documentation du moteur.

Vous envoyezLe fournisseur externe reçoit
Répondez à jean.dupont@exemple.fr et confirmez le virement vers FR7630006000011234567890189.Répondez à [EMAIL_k3j2h] et confirmez le virement vers [IBAN_9f2x1a].

Les suffixes ci-dessus sont des exemples : ils dépendent de la valeur, ne les analysez pas dans votre code.

Comment l'utiliser avec votre code OpenAI

Deux chemins existent. Dans l'application Subsidia, l'administrateur choisit le fournisseur et le mode du bouclier dans l'écran des modèles. Dans votre propre code, vous passez par le Gateway de Subsidia, qui parle le format OpenAI : vous changez l'URL de base et gardez le reste.

Le fournisseur qui répond est celui que l'installation a configuré (et que Synapse choisit selon la tâche), pas celui que vous écrivez dans model : voir le guide du Gateway. Le snippet ci-dessous envoie des données fictives et lit ce qui a été masqué.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.subsidia.protypa.fr/v1",
    api_key=os.environ["SUBSIDIA_API_KEY"],  # sk_live_...
)

raw = client.chat.completions.with_raw_response.create(
    model="pulse-auto",
    messages=[{
        "role": "user",
        "content": "Répondez à jean.dupont@exemple.fr et confirmez le virement "
                   "vers FR7630006000011234567890189.",
    }],
)
completion = raw.parse()

print(completion.choices[0].message.content)        # valeurs restituées
print(raw.headers.get("x-pulse-provider"))          # qui a répondu : ollama, openai...
print(raw.headers.get("x-pulse-pii-masked"))        # nombre de valeurs masquées
print(raw.headers.get("x-pulse-proof"))             # identifiant du certificat

Si le fournisseur qui a répondu est local, x-pulse-pii-masked vaut 0 : le texte n'a pas été modifié, puisqu'il n'est pas sorti. Pour une réponse diffusée en flux, seul x-pulse-proof est envoyé dans les en-têtes ; lisez alors le certificat. Les en-têtes et le certificat sont détaillés dans la documentation du Gateway.

Vérifier ce qui est réellement parti

Vous n'avez pas à croire le masquage sur parole. Le certificat de chaque réponse indique :

  • le fournisseur et le modèle qui ont répondu ;
  • le nombre de valeurs masquées et leurs catégories (EMAIL, PHONE, IBAN…), jamais les valeurs ;
  • l'empreinte SHA-256 du texte tel qu'il est parti, après masquage.

Le certificat ne contient aucun texte, seulement des empreintes. Vous pouvez le contrôler sur la page Contrôler un certificat ou hors ligne, comme l'explique le guide de vérification.

Si un contrat vous impose qu'une catégorie de données ne parte jamais chez un fournisseur externe, ne vous fiez pas à l'intention : testez, dans votre intégration, que x-pulse-provider (ou egress.provider dans le certificat) est bien local pour ces appels.

Ce que cela ne fait pas

  • Le bouclier repère des identifiants, il ne comprend pas le sens. Une phrase comme « le gérant de la boulangerie du coin, celui dont la fille vient de déménager à Lyon » identifie quelqu'un sans contenir un seul e-mail ni un seul IBAN. Elle part telle quelle.
  • Il peut se tromper dans les deux sens. Une suite de chiffres qui ressemble à un téléphone peut être masquée à tort (un long numéro de facture, par exemple), et une donnée à la forme inhabituelle peut passer. La détection des noms repose sur des indices (civilités, majuscules) et peut en manquer.
  • Un alias est un pseudonyme, pas une anonymisation. Il est dérivé de la valeur par un hash court, sans clé secrète : qui devine une valeur peut vérifier si elle correspond à un alias, et le fournisseur voit que deux alias identiques désignent la même entité. Selon le RGPD, article 4, point 5, la pseudonymisation suppose que l'information permettant de rattacher la donnée à une personne soit conservée séparément et protégée : une donnée pseudonymisée reste une donnée personnelle.
  • Ce n'est pas une attestation de conformité. Subsidia n'en délivre aucune, et ce guide n'est pas un avis juridique. Le masquage ne remplace pas votre analyse du secret professionnel ou du contrat avec votre fournisseur.
  • Il peut dégrader la réponse. Le modèle ne voit plus les valeurs : s'il doit raisonner sur le contenu précis d'un nom ou d'un montant masqué, la qualité baisse. C'est pour cela que le mode médical, qui retire aussi les noms et les dates, est déconseillé pour un cabinet comptable ou juridique.
  • Il ne s'applique qu'à ce qui part. Un modèle installé chez vous reçoit le texte intact. Pour ce qui ne doit jamais sortir, le seul mode qui l'assure techniquement est le traitement local : voir le guide Faire tourner une IA sur site, sans GPU.

Checklist avant d'envoyer des données à un fournisseur externe

  1. Quel mode du bouclier est actif (standard, médical, désactivé) ? Le mode « désactivé » ne masque rien.
  2. Vos données sensibles sont-elles des identifiants (couverts) ou du texte libre et des noms (non couverts en mode standard) ?
  3. Avez-vous activé « Masquer aussi les noms de personnes » si des noms apparaissent dans les prompts ?
  4. Un test automatique vérifie-t-il x-pulse-pii-masked et x-pulse-provider sur un prompt contenant des données fictives ?
  5. Les pièces qui ne doivent jamais sortir passent-elles par pulse-sensitive ou par un modèle local ?
  6. Qui, chez vous, a validé l'envoi sur le plan juridique ?

Questions fréquentes

Que voit OpenAI quand mon prompt contient un e-mail ou un IBAN ?

Avec le bouclier de Subsidia actif sur un fournisseur externe, le fournisseur reçoit un alias à la place de la valeur, par exemple [EMAIL_k3j2h] ou [IBAN_9f2x1a]. La vraie valeur reste dans une mémoire temporaire propre à l'appel et est remise dans la réponse avant que vous la lisiez. Le suffixe exact de l'alias dépend de la valeur.

Les noms de personnes sont-ils masqués ?

Pas en mode standard : seuls les identifiants à forme rigide le sont (e-mail, téléphone, carte, IBAN, adresse IP, etc.). Les noms sont masqués si le mode médical est choisi, ou si l'option « Masquer aussi les noms de personnes » est activée pour l'espace de travail. Cette détection repose sur des indices (civilités, majuscules) : elle peut en manquer ou en masquer trop.

Le masquage rend-il l'envoi conforme au RGPD ?

Nous ne pouvons pas l'affirmer et Subsidia ne délivre aucune attestation de conformité. Une donnée pseudonymisée reste une donnée personnelle au sens du RGPD tant que l'information supplémentaire permettant de la rattacher existe. La question de savoir si un envoi est licite relève de votre analyse, avec votre délégué à la protection des données ou votre conseil.

Comment savoir que le masquage a réellement eu lieu pour un appel donné ?

Par l'API, l'en-tête x-pulse-pii-masked donne le nombre de valeurs masquées (réponse non diffusée en flux), et le certificat de la réponse indique le fournisseur, le nombre de valeurs masquées et leurs catégories (jamais les valeurs). Le certificat se vérifie hors ligne.

Et si le fournisseur est un modèle local ?

Rien n'est masqué, puisque rien ne sort de la machine : le modèle reçoit le texte tel quel, ce qui donne souvent de meilleures réponses sur les noms et les chiffres. Le bouclier ne s'applique qu'aux fournisseurs externes.

Peut-on régler le masquage appel par appel ?

Non. Le mode (standard, médical, désactivé) est un réglage du serveur choisi par l'administrateur de l'installation, pas un paramètre de requête. Pour forcer le traitement local d'un appel précis, on utilise l'adresse de modèle pulse-sensitive.

La page détaille les trois chemins possibles (modèle local, masquage avant envoi externe, cloud hébergé en France) et ce que chacun garantit.

Voir comment Subsidia traite les données confidentielles
Guides liés

Tous les guides