Python · Docker · Presidio · LiteLLM

M4 — Anonymisation et Confidential AI

Actionner la stratégie hybride : permettre aux meilleurs LLM cloud de traiter des données confidentielles sans jamais les voir en clair. Quatre niveaux de garantie, Presidio, pré-filtre SLM, LiteLLM Proxy et TEE (Prem PCCI).

2
Semaines
6
Sessions
S10–S11
Semaines 10 et 11
CAIP D4
Certification préparée

Les quatre niveaux de garantie — de l'anonymisation au Confidential Computing

Comprendre le continuum de quatre niveaux de garantie et pourquoi on peut les combiner pour une double garantie contenu + infrastructure.

ClaudePerplexity
2h
Durée
Objectif du jour

Comprendre le continuum de quatre niveaux de garantie du syllabus v2 et maîtriser pourquoi on peut les combiner pour une double garantie contenu + infrastructure.

Notions requises en entrée
  • Arbre de décision souveraineté (M2)
  • Six catégories de données (M2)
  • Presidio installé et fonctionnel (M3b-S9-J3)
Déroulé de la session
Les quatre niveaux
40 min
Niveau 1 — Anonymisation du prompt : LiteLLM + Presidio, Mask it, Private AI. Menace couverte : fuite par le contenu envoyé. Niveau 2 — Cloud souverain français : OVHcloud, Scaleway, SecNumCloud. Menace couverte : fuite par la juridiction (Cloud Act US). Niveau 3 — Confidential Computing (TEE) : Prem PCCI, Mithril Security BlindLlama, Cosmian. Menace couverte : fuite par l'infrastructure elle-même (admin cloud, hyperviseur). Niveau 4 — On-premise air-gapped : Ollama local, réseau isolé. Menace couverte : tout transit réseau externe.
« Explique les quatre niveaux de garantie de souveraineté LLM. Pour chaque niveau : la menace couverte ET celle non couverte, les outils, le profil PME typique, le coût relatif. Insiste sur pourquoi combiner niveaux 1 et 3 offre une double garantie contenu + infrastructure. »
Principe de proportionnalité
20 min
Le niveau 1 suffit pour la majorité des TPE / PME traitant des données clients standard. Le niveau 3 est justifié pour les données de santé, juridiques, financières sensibles. Le niveau 4 est réservé aux contextes où tout transit réseau est inacceptable. Les niveaux ne s'excluent pas — on peut combiner 1 + 3.
Prem PCCI
40 min
Prem.io est une solution d'inférence LLM basée sur des enclaves matérielles TEE : AMD SEV-SNP et Intel TDX. Principe fondateur : même Prem en tant que prestataire ne peut pas lire les données traitées. Architecture : Confidential Virtual Machines (CVM) chiffrées, HYOK (Hold Your Own Key), chiffrement post-quantique, architecture stateless by design. Ce que PCCI couvre que LiteLLM / Presidio ne couvre pas : l'administrateur système chez le prestataire, la compromission de l'hyperviseur cloud, l'injonction légale.
« Explique l'architecture Prem PCCI en détail : le rôle des enclaves TEE (AMD SEV-SNP, Intel TDX), ce que signifie HYOK (Hold Your Own Key), et pourquoi ce niveau de garantie est différent qualitativement de la simple anonymisation du prompt. »
Acteurs comparables
20 min
Mithril Security BlindLlama (inference LLM dans enclave TEE, open source, pionnier), Cosmian (français, calcul confidentiel), Opaque Systems (plateforme IA confidentielle orientée RAG et fine-tuning). Ces acteurs représentent le niveau 3 du continuum.
Notions acquises en sortie
  • Quatre niveaux de garantie maîtrisés : menace couverte, outils, profil PME
  • Principe de proportionnalité : adapter le niveau à la sensibilité réelle des données
  • Prem PCCI : enclaves TEE, HYOK, architecture stateless
  • Mithril Security et Cosmian comme acteurs comparables du niveau 3
Auto-évaluation
Q1
Quelle menace le niveau 1 (anonymisation) NE couvre-t-il pas, que couvre le niveau 3 ?
Q2
Explique le principe HYOK (Hold Your Own Key) à un dirigeant PME en deux phrases.
Q3
Pour un cabinet médical analysant des comptes-rendus patients via LLM, quel niveau recommanderais-tu et pourquoi ?
Livrable du jour
📊
Fiche « Quatre niveaux de garantie »

Tableau : niveau | menace couverte | outils | profil | complexité. Fiche Prem PCCI (une page).

Presidio — détection et pseudonymisation réversible

Maîtriser Presidio en Python : détecter les PII, les remplacer par des tokens, stocker la correspondance dans un vault local et réhydrater la réponse.

PythonPresidiospaCy fr
2h
Durée
Objectif du jour

Maîtriser la mise en œuvre de Presidio en Python : détecter les PII, les remplacer par des tokens, stocker la table de correspondance dans un vault local et réhydrater la réponse.

Notions requises en entrée
  • Presidio installé (M3b-S9-J3)
  • Six catégories de données (M2)
  • Documents fictifs PME juridique avec PII (M3-S7-J2)
Déroulé de la session
Presidio — détection
30 min
Deux composants : presidio-analyzer (détecte les entités sensibles) et presidio-anonymizer (remplace les entités par des tokens). Plus de 50 reconnaisseurs pré-intégrés : noms, emails, IBAN, SIRET, NIR, cartes bancaires. Sur fr_core_news_lg, la détection des noms propres français est bonne mais imparfaite.
from presidio_analyzer import AnalyzerEngine from presidio_anonymizer import AnonymizerEngine analyzer = AnalyzerEngine() anonymizer = AnonymizerEngine() texte = 'Le client Jean Dupont, email jean@dupont.fr, IBAN FR76...' resultats = analyzer.analyze(text=texte, language='fr') print('Entités détectées :') for r in resultats: print(f' {r.entity_type} : {texte[r.start:r.end]} (score : {r.score:.2f})')
Pattern vault
40 min
Remplacer les PII par des tokens [ENTITE_001], stocker la correspondance token ↔ valeur réelle dans un dictionnaire local (jamais envoyé au LLM), puis réhydrater la réponse en restaurant les vraies valeurs.
def pseudonymiser(texte): resultats = analyzer.analyze(text=texte, language='fr') vault, texte_ps = {}, texte for i, r in enumerate(sorted(resultats, key=lambda x: x.start)): token = f'[{r.entity_type}_{i+1:03d}]' valeur = texte[r.start:r.end] vault[token] = valeur texte_ps = texte_ps.replace(valeur, token, 1) return texte_ps, vault def rehydrater(reponse, vault): for token, valeur in vault.items(): reponse = reponse.replace(token, valeur) return reponse texte_brut = 'Analysez le contrat de Jean Dupont, IBAN FR76...' texte_ps, vault = pseudonymiser(texte_brut) print('Envoyé au LLM :', texte_ps) # reponse_llm = appel_llm(texte_ps) # print('Réponse finale :', rehydrater(reponse_llm, vault))
Test sur documents PME
30 min
Appliquer le pipeline sur les trois documents fictifs juridiques de M3-S7-J2. Mesurer le taux de détection : combien de PII sont détectées vs combien sont présentes. Identifier les faux négatifs.
Limites de Presidio
20 min
Quatre limites à documenter : (1) Détection NER imparfaite sur les noms français peu courants. (2) Données métier contextuelles non détectées (noms de projets, références internes). (3) La pseudonymisation ne supprime pas les risques de ré-identification indirecte. (4) Les données pseudonymisées restent des données personnelles au sens RGPD (arrêt CJUE sept. 2025).
Notions acquises en sortie
  • Presidio : détection PII avec analyzer, pseudonymisation avec anonymizer
  • Pattern vault : token ↔ valeur réelle stocké localement, jamais envoyé au LLM
  • Réhydratation : restauration des vraies valeurs dans la réponse du LLM
  • Quatre limites de Presidio documentées
Auto-évaluation
Q1
Explique le pattern vault à un DPO PME en trois phrases.
Q2
Pourquoi les données pseudonymisées avec Presidio restent-elles des données personnelles au sens du RGPD ?
Q3
Que sont les faux négatifs dans le contexte de Presidio et pourquoi sont-ils problématiques ?
Livrable du jour
🐍
Script presidio_pipeline.py fonctionnel

Détection + pseudonymisation + vault + réhydratation. Rapport de test sur les trois documents PME fictifs (taux de détection, faux négatifs identifiés).

SLM local comme pré-filtre contextuel

Utiliser Phi-4 local pour détecter les données sensibles contextuelles que Presidio ne détecte pas.

PythonOllamaPhi-4
1h45
Durée
Objectif du jour

Implémenter l'étape de pré-filtrage contextuel : utiliser Phi-4 local pour détecter les données sensibles contextuelles que Presidio ne détecte pas (noms de projets, références commerciales, stratégie non publiée).

Notions requises en entrée
  • Phi-4 installé et fonctionnel (M3-S6-J1)
  • Script presidio_pipeline.py (S10-J2)
  • Notion de faux négatifs Presidio (S10-J2)
Déroulé de la session
Intuition
20 min
Presidio est aveugle aux données sensibles contextuelles : « Projet Phoénix » (nom de code d'une acquisition), « référence AO-2024-087 » (appel d'offres non public), « marge nette T3 : 18,4 % » (donnée financière non publiée). Le SLM local analyse le texte sémantiquement avant Presidio pour détecter ces éléments.
Code pré-filtre
50 min
Phi-4 identifie les entités contextuelles, propose des tokens de remplacement, et retourne la liste des substitutions sous forme de JSON.
from openai import OpenAI import json client = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama') PROMPT = '''Analyse ce texte et identifie TOUTES les informations potentiellement sensibles pour une entreprise : données personnelles, informations financières non publiques, noms de projets internes, relations commerciales, secrets techniques. Réponds UNIQUEMENT en JSON : {{"entites": [{{"valeur": "...", "token": "..."}}]}} Texte : {texte}''' def prefiltre_slm(texte): r = client.chat.completions.create( model='phi4', messages=[{'role': 'user', 'content': PROMPT.format(texte=texte)}]) try: data = json.loads(r.choices[0].message.content) return {e['valeur']: e['token'] for e in data.get('entites', [])} except: return {} def anonymiser_complet(texte): # Étape 1 : pré-filtre SLM (données contextuelles) substitutions = prefiltre_slm(texte) for valeur, token in substitutions.items(): texte = texte.replace(valeur, token) # Étape 2 : Presidio (PII classiques) texte_ps, vault = pseudonymiser(texte) vault.update(substitutions) return texte_ps, vault
Test et comparaison
35 min
Comparer sur les mêmes documents : (1) Presidio seul, (2) Pré-filtre SLM seul, (3) Pipeline combiné. Mesurer le nombre d'entités sensibles détectées par chaque approche.
Notions acquises en sortie
  • Pré-filtre SLM : Phi-4 local détecte les données sensibles contextuelles non vues par Presidio
  • Pipeline combiné : SLM pré-filtre + Presidio + vault + réhydratation
  • Comparaison documentée des trois approches
Auto-évaluation
Q1
Donne un exemple de donnée sensible contextuelle que Presidio ne détecterait pas et que Phi-4 détecterait.
Q2
Pourquoi Phi-4 est-il préféré à Mistral 7B pour ce rôle de pré-filtre ?
Q3
Quel est le coût en latence d'ajouter le pré-filtre SLM et dans quel cas est-il justifié ?
Livrable du jour
🐍
Script prefiltre_slm.py fonctionnel

Script pipeline_complet.py (SLM + Presidio + vault). Rapport comparatif des trois approches.

Ressources externes

LiteLLM Proxy — déploiement Docker et guardrail Presidio

Déployer LiteLLM Proxy en local avec Docker et configurer Presidio comme guardrail bidirectionnel — l'architecture de référence production-ready.

DockerLiteLLMPython
2h30
Durée
Objectif du jour

Déployer LiteLLM Proxy en local avec Docker et configurer Presidio comme guardrail bidirectionnel — l'architecture de référence production-ready du niveau 1 de garantie.

Notions requises en entrée
  • Docker Desktop installé et fonctionnel
  • Script presidio_pipeline.py fonctionnel (S10-J2)
  • Architecture LiteLLM + Presidio comprise (M2-S4-J3)
Déroulé de la session
Déploiement Docker
40 min
Déployer LiteLLM Proxy avec Docker Compose. Configurer pour router vers Ollama local (on-prem) ET vers LLM cloud selon le modèle demandé. Le proxy expose une API OpenAI-compatible sur le port 4000.
# docker-compose.yml version: '3.9' services: litellm: image: ghcr.io/berriai/litellm:main-latest ports: ['4000:4000'] volumes: ['./litellm_config.yaml:/app/config.yaml'] command: --config /app/config.yaml extra_hosts: ['host.docker.internal:host-gateway'] # litellm_config.yaml model_list: - model_name: mistral-local litellm_params: model: ollama/mistral api_base: http://host.docker.internal:11434 # Lancer avec : docker compose up -d
Guardrail Presidio
50 min
Configurer Presidio comme guardrail pré-LLM et post-LLM dans LiteLLM. Inspection bidirectionnelle : Presidio analyse le prompt entrant ET la réponse sortante pour s'assurer qu'aucune PII n'a été reconstituée.
# Ajout dans litellm_config.yaml guardrails: - guardrail_name: presidio-pii-in litellm_params: guardrail: presidio mode: pre_call # analyse le prompt avant envoi - guardrail_name: presidio-pii-out litellm_params: guardrail: presidio mode: post_call # analyse la réponse sortante
Test bout-en-bout
40 min
Tester le pipeline complet : envoyer une requête avec des PII à LiteLLM (port 4000), vérifier que la requête est pseudonymisée avant transmission au LLM, vérifier que la réponse est réhydratée en sortie.
from openai import OpenAI # Pointer vers LiteLLM au lieu du LLM directement client = OpenAI(base_url='http://localhost:4000', api_key='sk-test') r = client.chat.completions.create( model='mistral-local', messages=[{'role': 'user', 'content': 'Analyse le contrat de Jean Dupont, IBAN FR76...'}]) print(r.choices[0].message.content)
Notions acquises en sortie
  • LiteLLM Proxy déployé avec Docker et fonctionnel localement
  • Presidio configuré comme guardrail bidirectionnel (prompt entrant + réponse sortante)
  • Pipeline bout-en-bout testé : PII pseudonymisées avant LLM, réponse réhydratée en sortie
  • Architecture production-ready du niveau 1 de garantie
Auto-évaluation
Q1
Pourquoi LiteLLM est-il appelé « AI Gateway » plutôt que simple proxy d'anonymisation ?
Q2
Qu'est-ce que l'inspection bidirectionnelle dans LiteLLM + Presidio et pourquoi est-elle importante ?
Q3
Quelle est la différence entre router vers mistral-local et router vers un LLM cloud dans LiteLLM ?
Livrable du jour
🐳
Configuration Docker Compose LiteLLM fonctionnelle

Test bout-en-bout documenté. C'est la démo du niveau 1 de garantie.

Mask it et solutions commerciales — compléter le tableau

Maîtriser l'usage de Mask it (extension navigateur, 100 % locale, française) et compléter le tableau comparatif des six solutions.

NavigateurClaude
1h30
Durée
Objectif du jour

Maîtriser l'usage de Mask it (extension navigateur, 100 % locale, française) et compléter le tableau comparatif des six solutions avec les dernières informations 2026.

Notions requises en entrée
  • Tableau comparatif des six solutions (M2-S4-J3)
  • Pipeline LiteLLM + Presidio (S11-J1)
Déroulé de la session
Mask it — test
30 min
Installer Mask it dans le navigateur (Chrome / Firefox). Tester sur un texte avec des PII : observer la détection et le masquage avant envoi au LLM cloud. Vérifier que le traitement est 100 % local (ouvrir les DevTools — zéro requête vers un serveur externe). Documenter les types de PII détectés et les limites observées.
Tableau mis à jour
40 min
Enrichir le tableau des six solutions avec les informations 2026 : Portkey Gateway (Apache 2.0, mars 2026), évolutions Tonic Textual, statut certification SOC 2 Private AI, support multilangue français. Ajouter une colonne « idéal pour ».
« Mets à jour le tableau comparatif des six solutions d'anonymisation LLM avec les informations 2025-2026 : LiteLLM + Presidio, Portkey Gateway, Tonic Textual, Private AI, Nightfall AI, Mask it. Pour chaque : type, anonymisation réversible, prérequis technique, conformité RGPD, scénario PME optimal. »
Message clé
20 min
Message clé pour la formation client : LiteLLM + Presidio est production-ready mais nécessite du DevOps. Une solution packagée zéro-friction sans équipe IT n'existe pas encore en open source — c'est le créneau des solutions commerciales (Tonic.ai, Private AI…). Pour une TPE / PME sans IT : Mask it est le point d'entrée le plus accessible.
Notions acquises en sortie
  • Mask it testé et évalué : solution 100 % locale, sans serveur, gratuite pour démarrer
  • Tableau comparatif des six solutions mis à jour avec informations 2026
  • Message clé maîtrisé : qui recommander selon le profil PME
Auto-évaluation
Q1
Pour un avocat de cinq personnes sans IT qui veut utiliser Claude pour analyser des contrats, quelle solution recommandes-tu et pourquoi ?
Q2
Quelle est la différence fondamentale entre Mask it et LiteLLM + Presidio ?
Livrable du jour
📊
Tableau comparatif des six solutions (version finale)

Fiche « Recommandation selon profil PME ».

Synthèse M4 — pipeline complet et démonstration

Assembler le pipeline d'anonymisation complet et préparer la démonstration commerciale du M4 — troisième livrable démontrable du programme.

PythonDockerStreamlit
2h
Durée
Objectif du jour

Assembler le pipeline d'anonymisation complet et préparer la démonstration commerciale du M4 — le troisième livrable démontrable du programme.

Notions requises en entrée
  • Tous les scripts M4 fonctionnels
Déroulé de la session
Pipeline complet
40 min
Assembler le pipeline en un script unique avec interface Streamlit : (1) Pré-filtre Phi-4 local. (2) Presidio. (3) LiteLLM Proxy (routage vers LLM cloud ou local). (4) Réhydratation. L'interface affiche le texte original, le texte pseudonymisé envoyé, la réponse brute et la réponse réhydratée.
Script de démo M4
30 min
Script verbal de la démonstration en cinq minutes : (1) Montrer le texte original avec les PII. (2) Montrer le texte pseudonymisé envoyé au LLM. (3) Montrer la réponse brute avec les tokens. (4) Montrer la réponse finale réhydratée. Message : « Le LLM n'a jamais vu une seule donnée personnelle réelle. »
« Aide-moi à rédiger le script verbal d'une démonstration de cinq minutes du pipeline d'anonymisation (Presidio + LiteLLM + réhydratation). Message central : "Les LLM cloud peuvent traiter vos documents confidentiels sans jamais voir une seule donnée réelle." »
Flashcards M4
30 min
Générer 10 flashcards couvrant l'ensemble de M4 dans NotebookLM. QCM de positionnement M4 : cinq questions type CAIP D4.
« Génère 10 flashcards sur les quatre niveaux de garantie, Presidio, le pattern vault, LiteLLM + Presidio et Prem PCCI. Les questions doivent être de type CAIP (justification de choix technique, recommandation PME). »
Bilan M4
20 min
Bilan M4 : les scripts produits, les notions maîtrisées, les zones encore fragiles. Lien avec M5 : quand utiliser le pipeline d'anonymisation (M4) vs le RAG on-prem (M3) ?
Notions acquises en sortie
  • Pipeline d'anonymisation complet assemblé avec interface Streamlit
  • Démonstration commerciale M4 prête (cinq minutes)
  • Bilan M4 complet avec plan de transition vers M5
Auto-évaluation
Q1
Peux-tu présenter la démo du pipeline en cinq minutes sans notes ?
Q2
Quel est le message central du M4 en une phrase pour un dirigeant PME ?
Q3
Quand recommanderais-tu le pipeline d'anonymisation (M4) vs le RAG on-prem (M3) ?
Livrable du jour
🏆
Pipeline d'anonymisation complet avec interface Streamlit

Script verbal de démo (cinq minutes). C'est le livrable n°3 du programme.

← Module 3b Module 5 →