Architecture d'un système RAG

Un système RAG (Retrieval-Augmented Generation) combine deux composants : un retriever qui trouve des documents pertinents dans une base de connaissances, et un générateur (le LLM) qui produit une réponse en se basant sur ces documents. L'indexation préalable transforme vos documents en vecteurs numériques (embeddings) stockés dans une base vectorielle. Lors d'une requête, le retriever calcule la similarité entre la question et les documents indexés pour retrouver les plus pertinents. Le LLM reçoit ensuite ces fragments comme contexte pour générer une réponse informée et précise.

Choix des composants locaux

Pour un RAG 100% local, nous utiliserons Ollama pour servir à la fois le modèle de génération (ex: Llama 3.2) et le modèle d'embeddings (nomic-embed-text). ChromaDB est une base vectorielle légère qui s'exécute en mémoire ou sur disque, idéale pour les projets locaux. LangChain fournit les abstractions pour orchestrer le pipeline de bout en bout. Cette combinaison ne nécessite aucune API externe et peut fonctionner hors ligne, garantissant la confidentialité totale de vos données.

Préparation et indexation des documents

La qualité d'un RAG dépend largement de la façon dont les documents sont découpés (chunking). Un chunk trop grand perd en précision de retrieval, un chunk trop petit manque de contexte. La stratégie de chunking par phrases sémantiques (500-1000 tokens avec un overlap de 100-200 tokens) est généralement recommandée pour les textes en prose. LangChain propose des text splitters adaptés à différents formats : documents PDF via PyMuPDF, pages web via BeautifulSoup, code source via les splitters spécialisés.

Le retrieval et le reranking

La recherche vectorielle par similarité cosinus retrouve les k documents les plus proches de la requête. Pour améliorer la pertinence, le MMR (Maximal Marginal Relevance) diversifie les résultats en évitant les documents trop redondants. Un reranker (modèle cross-encoder) peut ensuite réordonner les candidats avec une plus grande précision, au prix d'une latence additionnelle. Pour la plupart des cas d'usage, une recherche k=4 à k=8 avec MMR donne de bons résultats sans reranker.

Construire la chaîne de génération

Le prompt template du RAG doit clairement indiquer au LLM de se baser uniquement sur le contexte fourni, d'indiquer s'il ne connaît pas la réponse, et de citer ses sources. LangChain LCEL (LangChain Expression Language) permet de composer le pipeline : retriever → format_docs → prompt → llm → output_parser. L'historique de conversation peut être intégré via ConversationalRetrievalChain pour permettre des questions de suivi contextuelles. Pensez à gérer les cas de chunks trop nombreux qui dépasseraient la fenêtre de contexte du modèle.

Évaluation et amélioration

Évaluer un RAG demande de mesurer deux dimensions : la pertinence du retrieval (les bons documents sont-ils retrouvés ?) et la fidélité de la génération (la réponse colle-t-elle au contexte ?). RAGAS est un framework d'évaluation automatique qui mesure faithfulness, answer relevancy et context precision. Des tests manuels sur 20-30 questions représentatives restent indispensables. Les principaux leviers d'amélioration sont : la stratégie de chunking, le choix du modèle d'embeddings, et le prompt système du générateur.

Étapes pratiques

  1. Installer les dépendances

    Créez un environnement virtuel et installez les bibliothèques nécessaires.

    {step.code}
  2. Télécharger les modèles Ollama

    Récupérez le modèle de génération et le modèle d'embeddings via Ollama.

    {step.code}
  3. Indexer les documents

    Chargez vos PDF, découpez-les en chunks et créez l'index vectoriel dans ChromaDB.

    {step.code}
  4. Construire la chaîne RAG

    Assemblez le retriever et le LLM dans une chaîne LangChain.

    {step.code}
  5. Interroger le système RAG

    Posez des questions sur vos documents et récupérez les réponses sourcées.

    {step.code}