Guide
Architecture d'un RAG : les briques et leur ordre
Les deux chaînes d'un RAG, indexation et réponse, brique par brique : du chargement des documents à la réponse citée.
Mis à jour le
Un RAG (génération augmentée par récupération) se compose de deux chaînes. La chaîne d'indexation tourne en arrière-plan : elle charge vos documents, les découpe, calcule pour chaque morceau une représentation numérique et range le tout dans un index. La chaîne de réponse tourne à chaque question : elle cherche les morceaux pertinents, les trie, puis les donne au modèle de langage, qui rédige la réponse. La documentation de LangChain décrit la même découpe : charger, découper, calculer les plongements, stocker ; puis récupérer et générer.
Schéma d'ensemble
| Chaîne | Brique | Rôle | Réglage qui compte |
|---|---|---|---|
| Indexation | Chargement | Lire PDF, pages web, fichiers bureautiques | Qualité de l'extraction du texte |
| Indexation | Découpage | Couper en morceaux (chunks) | Taille, recouvrement, respect de la structure |
| Indexation | Plongements | Transformer chaque morceau en vecteur | Modèle choisi, même modèle pour indexer et interroger |
| Indexation | Index | Stocker vecteurs, texte et métadonnées | Métadonnées : source, page, date, droits |
| Réponse | Recherche | Trouver les morceaux proches de la question | Vectorielle, plein texte ou hybride ; nombre de résultats |
| Réponse | Tri (reranking) | Réordonner les candidats | Nombre de candidats en entrée et en sortie |
| Réponse | Génération | Rédiger à partir des morceaux | Consignes : s'en tenir aux documents, citer |
| Réponse | Citations | Relier chaque affirmation à sa source | Format des références renvoyées |
La chaîne d'indexation
Chargement. Tout part du texte extrait. Un tableau mal lu ou une page scannée sans reconnaissance de caractères donne des morceaux vides ou faux, que rien en aval ne rattrapera. La préparation des documents mérite son propre chantier ; nous la traitons ici seulement pour le cas des PDF.
Découpage. Le texte est coupé en morceaux de quelques centaines de jetons (unités de texte que manipule le modèle). Les valeurs de départ diffèrent selon les bibliothèques : chunk_size=1000 et chunk_overlap=200 dans le tutoriel LangChain, une taille de 1 024 et un recouvrement de 20 par défaut dans LlamaIndex. Le détail est sur la page Chunking.
Plongements et index. Chaque morceau devient un vecteur (voir la fiche embedding du lexique). Gardez à côté du vecteur le texte d'origine et des métadonnées : nom du fichier, page, date, et surtout les groupes autorisés à le lire. LlamaIndex rappelle que ces métadonnées servent à la fois à retrouver la source d'une réponse et à filtrer les résultats avant la recherche.
La chaîne de réponse
Recherche. La recherche vectorielle trouve les passages de même sens ; la recherche plein texte trouve les mots exacts (références, noms propres, codes). Les combiner donne la recherche hybride.
Tri. Un modèle de tri plus lent mais plus précis (un cross-encoder, qui lit ensemble la question et le passage) réordonne les candidats. La documentation de Sentence Transformers décrit ce schéma « récupérer puis retrier ». Dans ses essais publiés le 19/09/2024, Anthropic récupère 150 passages, en garde 20 après tri, et constate que 20 passages donnent de meilleurs résultats que 10 ou 5. Voir Reranking.
Génération. Le modèle reçoit la question et les passages. L'ordre compte : l'étude « Lost in the Middle » (Liu et al., 2023) montre que les modèles exploitent mieux une information placée au début ou à la fin d'un long contexte qu'au milieu.
Citations. Renvoyer, avec la réponse, les passages qui la justifient permet à l'utilisateur de vérifier. Certaines interfaces de programmation le font nativement, comme la fonction Citations de Claude. Voir Citer ses sources.
Exemple de dimensionnement (illustratif)
Prenons un bureau d'études de quinze personnes qui veut interroger ses rapports techniques et ses normes internes. Une architecture de départ raisonnable :
- extraction des PDF avec conservation du numéro de page ;
- découpage qui respecte les titres de section ;
- index unique contenant vecteurs, texte et liste des groupes autorisés ;
- recherche hybride, filtrée par les groupes de l'utilisateur ;
- tri des candidats, puis génération avec obligation de citer la page.
Ce n'est qu'un point de départ : chaque réglage se valide sur un jeu de questions réelles, comme expliqué dans Évaluer un RAG.
Quand cette architecture ne suffit plus
Deux familles de questions mettent en difficulté ce schéma simple : celles qui demandent de relier des informations dispersées dans beaucoup de documents (voir GraphRAG) et celles qui demandent plusieurs recherches successives (voir RAG agentique). Commencez quand même par la version simple : c'est elle qui vous servira d'étalon.
Questions fréquentes
Combien de passages faut-il envoyer au modèle ?
Il n'y a pas de valeur universelle. Le tutoriel LangChain en récupère 4 ; Anthropic, dans ses essais de récupération contextuelle, a obtenu de meilleurs résultats avec 20 passages qu'avec 10 ou 5.
Où placer le contrôle des droits d'accès ?
Au moment de la recherche, sous forme de filtre sur les métadonnées des passages, pour que le modèle ne reçoive jamais un passage que l'utilisateur n'a pas le droit de lire.
Sources
Pages consultées pour écrire cet article :
- https://docs.langchain.com/oss/python/langchain/rag
- https://developers.llamaindex.ai/python/framework/optimizing/basic_strategies/basic_strategies/
- https://www.anthropic.com/news/contextual-retrieval
- https://sbert.net/examples/cross_encoder/applications/README.html
- https://platform.claude.com/docs/en/build-with-claude/citations
- https://arxiv.org/abs/2307.03172