Sirocco
← Études de cas

SaaS B2B

Assistant IA d'entreprise RAG avec contrôle d'accès

Un grand groupe industriel français voulait un assistant IA capable de retrouver quinze ans de documentation éparpillée — sans jamais exposer un document à un collaborateur non autorisé. La confidentialité primait sur la commodité.

38k
Documents indexés
1,7s
Latence médiane
72%
Réponses notées utiles
14min → 90s
Temps de recherche
1,8
ETP libérés sur l'année
0
Fuite de donnée sensible

Contexte

Grand groupe industriel français : cinq filiales, 4 200 collaborateurs répartis entre R&D, industrie et BTP. La documentation interne — fiches techniques, procédures qualité, comptes-rendus, normes — s'était sédimentée sur quinze ans entre trois SharePoint, deux instances Notion, plusieurs partages SMB et une wiki Confluence en bout de course.

01 — Le défi

Le défi

Une étude interne estimait que les ingénieurs passaient 14 minutes en moyenne par recherche documentaire, et que 30 % des questions reposées trois mois plus tard portaient sur des documents qui existaient mais étaient introuvables. Le piège, dans un groupe industriel, est qu'un assistant IA mal conçu fuit dès qu'un développeur oublie un filtre : il fallait un contrôle d'accès infaillible et auditable, pas un simple filtre à la requête.

02 — L'approche

L'approche

Nous avons rejeté le pattern « un seul index pour tout le corpus avec un filtre à la requête » au profit d'une propagation automatique des ACL depuis la source. L'ingestion combine extraction Unstructured et OCR Tesseract pour les scans anciens ; la recherche associe des embeddings multilingues bge-m3 et un re-ranker cross-encoder ; et le LLM est routé par classification, les documents sensibles restant sur Mistral Large hébergé en France. Trois couches de garde-fous anti-fuites encadrent chaque réponse.

01

Connecteurs & propagation des ACL

Un connecteur Python par système (SharePoint, Notion, SMB) extrait contenu et liste exacte des autorisations, sérialisées comme métadonnée et filtrées à chaque requête.

02

Ingestion & OCR

Extraction Unstructured des formats natifs, OCR Tesseract 5 piloté par détecteur de qualité pour les scans anciens, tableaux extraits par Camelot avant chunking.

03

Recherche & re-ranking

Embeddings multilingues bge-m3, chunking 800/200 tokens, re-ranker cross-encoder qui rescore le top 30 pour ne passer que les 6 meilleurs au LLM.

04

Routage LLM souverain & garde-fous

Documents sensibles routés vers Mistral Large en France, masquage NER, citations obligatoires et journal d'audit append-only hash-chaîné.

03 — Résultats

Résultats

Après neuf mois de production, l'assistant indexe 38 000 documents (PDF, Office, emails, scans OCR), répond en 1,7 seconde médiane, et 72 % des réponses sont notées « utile ». Le temps moyen de recherche documentaire est tombé de 14 minutes à 90 secondes, soit l'équivalent de 1,8 ETP libérés sur l'année — sans aucune fuite de donnée sensible relevée par l'audit interne.

L'audit interne n'a remonté aucune fuite de donnée sensible, et l'inspection ANSSI commandée par la direction a validé l'architecture comme conforme à la doctrine de souveraineté numérique du groupe.

Détails techniques

01

Contrôle d'accès : ACL propagées depuis la source

Notre première décision technique a été de refuser le pattern « un seul index Qdrant pour tout le corpus avec un filtre user_id à la requête ». Ce design fuit dès qu'un développeur oublie le filtre, et il rend les audits impossibles.

Nous avons opté pour une propagation automatique des ACL depuis la source : un connecteur Python par système (SharePoint Graph API, Notion API officielle, SMB via pysmb avec un compte service à droits délégués) extrait pour chaque document à la fois le contenu et la liste exacte des utilisateurs et groupes autorisés. Cette ACL est sérialisée comme métadonnée Qdrant, et les requêtes appliquent un filtre obligatoire sur l'intersection (`user_groups ∩ doc_acl ≠ ∅`).

02

Ingestion documentaire & OCR

La librairie Unstructured gère bien les PDF natifs, les Office, les emails et les HTML, mais beaucoup de procédures industrielles sont des scans numérisés des années 90 — page A4 inclinée, tampons, mentions manuscrites. Nous avons donc ajouté un Tesseract 5 piloté par un détecteur de qualité : si le PDF a un layer texte exploitable, on l'utilise directement ; sinon, OCR sur images binarisées avec préprocessing OpenCV (deskew, denoise, dilation des caractères). Les tableaux sont extraits séparément par Camelot avant le chunking pour éviter de mélanger lignes et cellules dans un même chunk de prose.

03

Embeddings multilingues & chunking

Les embeddings utilisent bge-m3 multilingue, qui couvre français, anglais, allemand et chinois — utile pour ce groupe dont l'usine en Asie produit des rapports techniques en chinois. Le choix multilingue évite la duplication de l'index et permet à un ingénieur français de retrouver un document de spécification en anglais ou en chinois si pertinent. La granularité du chunking est calibrée à 800 tokens avec 200 de chevauchement — assez fin pour des extraits ciblés, assez large pour préserver le contexte d'un paragraphe technique complet.

04

Re-ranker cross-encoder

La qualité de la récupération bénéficie d'un re-ranker cross-encoder (BGE Reranker v2-m3) en second étage : les 30 premiers résultats de la recherche vectorielle sont rescorés deux à deux avec la requête utilisateur, et seuls les 6 meilleurs sont passés au LLM. Cette étape coûte 250 ms supplémentaires mais améliore la pertinence du top-3 d'environ 18 points NDCG sur notre benchmark interne. Le re-ranker tourne sur un GPU L4 mutualisé avec l'embedding ; on évite ainsi d'attaquer un service externe pour cette étape sensible aux données.

05

Routage LLM par classification

Le choix du LLM est routé par classification du document. Les documents marqués « sensible » (classification interne C3+) sont traités exclusivement par Mistral Large hébergé sur des GPU H100 en France, dans un VPC dédié. Les documents publics ou peu sensibles peuvent partir vers GPT-4o (Azure OpenAI région France-Centrale) si le routeur estime que la qualité de réponse l'exige.

Ce routage est observable et auditable : chaque requête loggée précise quel modèle a été appelé, et la DSI peut couper l'envoi vers OpenAI à tout moment via un feature flag.

06

Garde-fous anti-fuites

Les garde-fous anti-fuites couvrent trois couches. Avant l'envoi au LLM, un NER (spaCy fr-FR + en-US + de-DE) masque les numéros de téléphone, IBAN, emails et noms propres marqués personnels. Toutes les requêtes (utilisateur, contexte, réponse) sont écrites dans un journal d'audit append-only signé hash-chaîné, conservé deux ans. Les réponses doivent obligatoirement contenir des citations sources avec lien direct vers le document d'origine ; si le LLM ne fournit pas de citation pour une affirmation, le contrôleur post-traitement la marque « non vérifiée » et l'affiche en gris dans l'interface.

Livrables

  • Connecteurs SharePoint, Notion et SMB avec extraction des ACL
  • Pipeline d'ingestion documentaire avec OCR Tesseract
  • Index vectoriel Qdrant avec filtrage ACL obligatoire
  • Routeur LLM souverain (Mistral Large / GPT-4o) avec feature flag
  • Garde-fous NER, citations obligatoires et journal d'audit
  • Dossier de conformité validé par l'inspection ANSSI