Vigie
RAG souverain et auditable pour documents confidentiels
- injections paraphrasées détectées (0 / 56 avec les motifs seuls), 0 faux positif sur 54 textes
- 34 / 56
- fuite : évaluation 32 / 32 sur SQLite comme sur PostgreSQL
- 0
- des affirmations vérifiées sur le jeu d’exemple
- 100 %
- tests automatisés (55 avant), dont 12 tests de contrat sur vrai PostgreSQL
- 102
- Le problème
- Les pilotes IA sur documents confidentiels bloquent sur la sécurité : où vont les données, qui voit quoi, peut-on vérifier et prouver.
- Pour qui
- Juridique, RH, sécurité et administration d’une entreprise réglementée ; présentée avec un client fictif et un jeu de données d’exemple (entreprise suisse « Lémanis SA »).
- Le résultat
- Un RAG auto-hébergeable sur SQLite ou PostgreSQL 16 : évaluation 32 / 32 et zéro fuite sur les deux, 34 injections paraphrasées sur 56 détectées sans faux positif, chaque chiffre vérifié dans sa source, mode hors ligne.
Contexte
Les pilotes IA bloquent rarement sur le modèle. Ils bloquent sur cinq questions de la sécurité et du juridique : où vont les données, qui voit quoi, peut-on vérifier la réponse, que se passe-t-il si un document attaque le modèle, peut-on prouver qui a demandé quoi.
Client fictif : « Lémanis SA », une entreprise suisse, avec un jeu de données d’exemple. Cadrage, construction, tests, documentation et recette suivent le déroulé d’un projet client.
Ce que j’ai construit
- Droits par attributs lus dans l’annuaire du client (OIDC/JWKS), filtrage avant classement, statistiques BM25 calculées sur le seul périmètre visible.
- Vérification déterministe : chaque phrase et chaque chiffre doivent figurer dans le passage cité, surligné dans l’interface.
- Anti-injection à l’ingestion, par motifs et détection sémantique : 34 injections paraphrasées sur 56 détectées, 0 faux positif sur un jeu FR/EN de 110 textes tenu à l’écart. PII suisses et françaises validées par checksum puis pseudonymisées (HMAC).
- Deux pilotes de stockage, SQLite et PostgreSQL 16, avec isolation par locataire au niveau des lignes : 12 / 12 tests de contrat sur vrai PostgreSQL, évaluation 32 / 32 et 0 fuite sur les deux.
- Chiffrement par enveloppe par tenant (clé locale ou KMS), rotation, crypto-shredding ; journal d’audit chaîné et signé.
- Serveur MCP pour agents, Docker durci, Helm avec NetworkPolicy, Terraform AWS, mode hors ligne avec Ollama.
Architecture 7 briques
- 01 · EntréeIngestionPII pseudonymisées (HMAC), injections détectées par motifs et sémantique, mises en quarantaine
- 02 · DonnéesStockage chiffréSQLite ou PostgreSQL 16 (isolation par locataire au niveau des lignes), AES-256-GCM par tenant, clé locale ou AWS KMS
- 03 · OutilMasque de droitsJeton OIDC/JWKS : filtrage avant tout classement
- 04 · OutilRecherche hybrideBM25 et dense sur le périmètre visible, fusion RRF
- 05 · ModèleGénérationHors ligne, Ollama/vLLM ou API ; sources traitées en données
- 06 · OutilVérificationChaque phrase et chaque chiffre retrouvés dans le passage cité
- 07 · SortieRéponse auditéePreuve surlignée, journal chaîné et signé
Si les passages visibles ne couvrent pas la question, Vigie refuse sans appeler le modèle.
Fabrication 6 étapes
- JetonTenant, groupes et habilitation lus dans le jeton.
- Masque de droitsCe que l’utilisateur ne peut pas voir n’entre jamais dans le calcul.
- Recherche hybrideBM25 et dense, fusion RRF, reclassement.
- GénérationSources encapsulées et neutralisées comme données.
- VérificationCitations, chiffres, liens et PII contrôlés.
- AuditChaque requête et chaque citation tracées dans une chaîne signée.
Décisions le choix, la raison, l’alternative écartée
- D1Filtrer par droits avant le classement et calculer les statistiques BM25 sur le seul périmètre visible.
Un filtrage a posteriori fuit par l’IDF et la distribution des scores : un document interdit ne doit même pas peser sur le score.
ÉcartéFiltrer les résultats après classement.
- D2Une vérification déterministe des citations et des chiffres.
Elle attrape les erreurs les plus graves des textes juridiques et financiers sans second appel au modèle, et ne se laisse pas convaincre.
ÉcartéUn juge LLM seul (possible en complément, pas en remplacement).
- D3Refuser plutôt que deviner : sans preuve visible suffisante, aucun appel au modèle.
Moins cher, plus rapide, et pas de réponse inventée quand la preuve manque.
ÉcartéLaisser le modèle répondre au mieux.
- D4Séparer les rôles : l’administrateur gère les documents sans pouvoir lire au-delà de son habilitation.
Administrer le système ne donne pas accès aux contenus.
ÉcartéUn super-administrateur qui voit tout.
- D5Des dépendances simples : SQLite, NumPy, FastAPI, cryptography ; BM25, PII et audit en code lisible.
Un relecteur sécurité peut lire tout le code critique en un après-midi.
Résultats
Scénarios du jeu d’exemple
| Scénario | Résultat |
|---|---|
| Chloé, stagiaire, demande le plafond du contrat Acme | Refus, sans indiquer que le document existe |
| Alice, juriste, pose la même question | Réponse citée, passage surligné, vérifiée à 100 % |
| Une FAQ fournisseur contient une injection | Passage en quarantaine, jamais envoyé au modèle |
| La même injection, reformulée sans mot-clé | Détectée par la couche sémantique (34 / 56 sur le jeu tenu à l’écart) |
| Un enregistrement d’audit est modifié | Chaîne cassée détectée par « audit verify » |
Livrables 6
- Application complète : API REST, console web, CLI et serveur MCP à 4 outils.
- 102 tests automatisés, dont 12 tests de contrat sur vrai PostgreSQL 16, et une suite d’évaluation FR/EN avec portes de sécurité en CI (32 / 32, 0 fuite sur les deux pilotes).
- Couche sémantique anti-injection et jeu FR/EN de 110 textes tenu à l’écart : 34 / 56 injections paraphrasées détectées, 0 / 54 faux positif.
- Dockerfile durci, docker-compose, chart Helm avec NetworkPolicy, Terraform AWS.
- Dossier de déploiement sur le jeu d’exemple « Lémanis SA » : brief, recette, passation, plan à 90 jours.
- Architecture, modèle de menace avec risques résiduels, guide de déploiement.
Environnement
Matériel et conditions de mesure
- SQLite ou PostgreSQL 16 selon la configuration ; recherche en mémoire après le masque de droits, vecteurs chiffrés comme le texte.
- Le jeu d’exemple tourne sans clé d’API, sans GPU et sans connexion ; génération hors ligne avec Ollama.
Reproduire commandes du README
Code privé : accès en lecture sous accord de confidentialité, ou démo en direct de 30 minutes. Demander l’accès →
pip install -e . && vigie demo # then open http://127.0.0.1:8000
vigie ingest examples/corpus
vigie ask "When are supplier invoices paid?" --as chloe
vigie eval --gate
vigie audit verify- Ni clé d’API, ni GPU, ni connexion nécessaires pour le jeu d’exemple.
- Six identités de test du jeu d’exemple « Lémanis SA » : changer d’identité montre les droits à l’œuvre.
Galerie 10
Ce que ce projet change pour vous
Le même savoir-faire, sur votre sujet.
Déploiement chez vous
Sur vos serveurs ou en réseau isolé avec un modèle auto-hébergé : vos données ne sortent pas, et les droits viennent de votre annuaire existant.
Un pilote cadré comme une mission
Brief, critères de recette mesurables, jeu de questions écrit avec vos équipes, passation : la structure est prête à être mesurée sur vos documents.
Audit et mesure
Chaque question et chaque citation tracées dans un journal chaîné où toute altération se voit, et une évaluation continue où une seule fuite fait échouer la livraison.