RAG : vue d'ensemble
Pipeline documentaire de la Box, de l'ingestion des dossiers à la réponse citée, avec le filtre de permissions au cœur de la recherche.
L'essentiel
- Le RAG (Retrieval-Augmented Generation) répond à une question en récupérant d'abord les passages pertinents des documents du cabinet, puis en les donnant au LLM local avec la consigne de répondre à partir d'eux et de citer.
- Le pipeline compte une dizaine d'étapes ; les deux qui décident de la qualité sont le parsing (ce qu'on extrait des PDF scannés, des mails, des tableaux) et la recherche (hybride, filtrée, reclassée).
- Les permissions ne sont pas une étape en plus : le filtre d'accès est appliqué dans la recherche, et imposé par le moteur. C'est la décision ADR-003 et la page la plus importante de cette section : permissions.
- Chaque réponse rend : le texte, les sources (dossier, document, passage, page) et un lien vers le document d'origine. Une réponse sans source est une réponse à ne pas afficher.
- Rien n'est mesuré à ce jour : toute la section est une architecture cible à valider par les expérimentations et l'évaluation.
Pipeline
Les deux moitiés du schéma vivent à des rythmes différents. L'ingestion (à gauche) tourne en tâche de fond, à chaque ajout ou modification de document ; elle est coûteuse en CPU (OCR) et en GPU (embeddings) mais tolère la latence. La requête (à droite) doit répondre en quelques secondes ; elle enchaîne recherche, reranking et génération, et c'est là que le filtre de permissions s'applique.
Les étapes une par une
| Étape | Rôle | Brique candidate | Statut | Page |
|---|---|---|---|---|
| Parsing | extraire texte, structure, tableaux des PDF, Word, Excel, mails | Docling (MIT) 1 ; Unstructured, Tika en secours | hypothèse | ingestion |
| OCR | rendre lisibles les scans | Tesseract 5 fra via Docling ou OCRmyPDF ; PaddleOCR à tester | hypothèse | ingestion |
| Nettoyage | retirer en-têtes, pieds de page, numéros, doublons | règles maison | à concevoir | ingestion |
| Chunking | découper en passages exploitables | Docling HybridChunker, 400 à 800 tokens, overlap 10 à 15 % | hypothèse | chunking et embeddings |
| Métadonnées | dossier, client, date, type, page, ACL sur chaque chunk | schéma maison | à concevoir | permissions |
| Embeddings | vectoriser les chunks et les questions | bge-m3 ou multilingual-e5-large (MIT) ; Qwen3-Embedding à comparer | à mesurer | chunking et embeddings |
| Base vectorielle | stocker vecteurs + métadonnées, filtrer, chercher | Qdrant 2 ou pgvector 3 | question ouverte Q-004 | base vectorielle |
| Recherche | vecteurs + BM25, fusion RRF, filtre ACL dans la requête | native (Qdrant) ou SQL (PostgreSQL) | hypothèse | recherche et reranking |
| Reranking | reclasser les 20 à 50 candidats, garder 5 à 10 | bge-reranker-v2-m3 4 ou Qwen3-Reranker-0.6B 5 | à mesurer | recherche et reranking |
| Génération | rédiger la réponse à partir des passages, citer | LLM local, voir inférence | dépend du modèle principal | recherche et reranking |
| Citations | afficher dossier, pièce, page, extrait, lien | à développer dans l'interface | à concevoir | recherche et reranking |
| Évaluation | mesurer fidélité, pertinence, fuite, latence | Ragas 6, DeepEval, jeu de test maison | à constituer | évaluation |
Principes
Ce que la Box doit rendre pour chaque réponse
- La réponse rédigée, en français, dans le registre du cabinet.
- La liste des sources utilisées : pour chacune, le dossier, le nom du document, la page (ou la section pour un mail ou un tableur), l'extrait exact ayant servi, et un lien qui ouvre le document à l'endroit cité.
- Une mention explicite quand rien n'a été trouvé dans la portée autorisée, sans révéler l'existence de documents hors portée.
- En arrière-plan, une ligne de journal : qui, quand, quels chunks lus, quels chunks cités.
Dimensionnement indicatif
Pour un cabinet de 5 à 10 personnes, l'ordre de grandeur est de quelques dizaines de milliers de documents et de quelques centaines de milliers à quelques millions de chunks (estimation, à confirmer sur un corpus réel). À 1 024 dimensions en float32, un million de chunks représente environ 4 Go de vecteurs bruts, plus l'index HNSW et les métadonnées (calcul, voir chunking et embeddings). C'est compatible avec la machine candidate à 128 Go, à condition de réserver la mémoire au LLM d'abord ; la quantification des vecteurs est une option.
Questions ouvertes
Ce qu'il reste à tester
- Comparer les modèles d'embeddings sur du français juridiqueSur des questions juridiques en français, bge-m3 et multilingual-e5-large atteignent un recall@10 comparable ; le reranker bge-reranker-v2-m3 apporte un gain de MRR supérieur à celui du changement de modèle d'embeddings ; la recherche hybride (BM25 + vecteurs, RRF) bat chacune des deux recherches seules.À tester
- Comparer la qualité en français des modèles candidatsgpt-oss-120b et Mistral Small 4 produisent un français juridique jugé acceptable par un avocat dans plus de 80 % des cas ; Qwen3-30B-A3B est nettement en retrait sur la rédaction mais équivalent sur la synthèse avec passages fournis ; les modèles de 7 à 22 Md (Lucie, EuroLLM) ne suffisent pas pour l'assistant principal. Le taux d'hallucination de citations est le critère discriminant.À tester
- Évaluer Docling sur un corpus juridique françaisDocling (MIT) avec Tesseract fra extrait correctement texte, structure et tableaux des documents juridiques français natifs, et atteint une qualité OCR acceptable sur des scans de qualité moyenne, à un débit compatible avec l'ingestion initiale d'un cabinet sur CPU.À tester
- Brancher le RAG de la Box sur Open WebUI (pipeline, endpoint, outil)Un endpoint OpenAI-compatible exposé par le service RAG de la Box, appelé par Open WebUI comme un modèle, transmet l'identité de l'utilisateur de façon vérifiable et affiche les citations (dossier, pièce, page, lien) sans dépendre du RAG intégré ni de ses knowledge bases.À tester
- pgvector vs Qdrant : rappel et latence de la recherche filtrée par ACLAvec hnsw.iterative_scan activé, pgvector conserve au moins 90 % du rappel non filtré pour un utilisateur ayant accès à 10 % des dossiers, à une latence inférieure à 200 ms ; Qdrant y parvient sans réglage grâce au filtrage intégré à HNSW. Dans les deux cas, la barrière moteur (RLS, JWT payload) ne renvoie aucun point hors portée.À tester
- Test de fuite de permissions du RAG (« l'avocat B ne voit jamais A »)Avec un filtre dossier_id calculé côté serveur et imposé par le moteur (RLS PostgreSQL ou JWT Qdrant), aucun chunk ni aucune réponse ne contient un canari hors de la portée de l'utilisateur, même lorsque la barrière applicative est désactivée.À tester
Sources
- 1Docling — README et documentation chunking (MIT, HybridChunker)GitHubFiabilité hauteDocling / IBM Research / LF AI & Data · publié v2.127.0, 14/09/2026 · consulté le 16 sept. 2026 · fiche source
- 2Qdrant — README et releases (Apache 2.0, v1.19.1)GitHubFiabilité hauteQdrant · publié v1.19.1, 04/09/2026 · consulté le 16 sept. 2026 · fiche source
- 3pgvector — README (filtrage, HNSW, iterative scan 0.8.0)GitHubFiabilité hautepgvector · publié v0.8.6 (README) ; 0.8.0 annoncé sur postgresql.org · consulté le 16 sept. 2026 · fiche source
- 4BAAI/bge-reranker-v2-m3 — model cardDocumentation officielleFiabilité hauteBAAI · publié 02/2024 · consulté le 16 sept. 2026 · fiche source
- 5Qwen/Qwen3-Reranker — model card (0.6B / 4B / 8B)Documentation officielleFiabilité hauteAlibaba Qwen · publié 05/06/2025 · consulté le 16 sept. 2026 · fiche source
- 6Ragas — métriques disponiblesDocumentation officielleFiabilité hauteRagas · publié lu le 16/09/2026 · consulté le 16 sept. 2026 · fiche source
- 7OWASP Top 10 for LLM Applications 2025 — LLM08 Vector and Embedding WeaknessesDocumentation officielleFiabilité hauteOWASP GenAI Security Project · publié mars 2025 · consulté le 16 sept. 2026 · fiche source
- 8Citations et fidélité en RAG (arXiv 2412.18004, 2409.11242)ÉtudeFiabilité moyennearXiv · publié 2024 · consulté le 16 sept. 2026 · fiche source