Image de couverture de Construire un système RAG privé : architecture, embeddings, bases vectorielles et évaluation

En un coup d’œil

Temps de lecture

~200 mots/min

Publié

il y a 1 mois

Jun 15, 2026 · Mis à jour Jul 2, 2026

Vues

352

Total depuis le début

Construire un système RAG privé : architecture, embeddings, bases vectorielles et évaluation

La génération augmentée par récupération (RAG) permet à un modèle de langage de répondre à des questions sur vos données (documents, tickets, code source) sans aucun réentraînement. Un système RAG « privé » conserve ces données dans votre propre infrastructure, ce qui, pour de nombreuses organisations, est la seule manière d'obtenir l'approbation juridique du projet. Ce guide parcourt l'ensemble du pipeline de bout en bout : ingestion, découpage en segments, plongements, base vectorielle, récupération, génération et la boucle d'évaluation qui vous indique si tout cela fonctionne réellement.

Ce que vous allez construire : un modèle mental

  • Le pipeline RAG en deux phases : indexation hors ligne et interrogation en ligne
  • Comment le découpage et les plongements transforment les documents en vecteurs interrogeables
  • Choisir une base de données vectorielle et la métrique de similarité appropriée
  • Intégrer la récupération dans un prompt ancré et propice aux citations
  • Évaluer la qualité de la récupération et des réponses pour pouvoir l'améliorer
i

Info

Pourquoi RAG plutôt que le fine-tuning

Le fine-tuning enseigne un style ou une compétence à un modèle ; c'est un moyen médiocre et coûteux de lui apprendre des faits qui changent. RAG injecte des faits actuels et attribuables à une source au moment de la requête, de sorte que mettre à jour les connaissances revient à réindexer un document, pas à réentraîner un modèle. Pour la plupart des besoins de type « répondre à des questions sur nos données », RAG est l'outil approprié.

Vue d'ensemble : deux pipelines

Tout système RAG se compose en réalité de deux pipelines qui partagent une base vectorielle. Le pipeline hors ligne s'exécute lorsque vos données changent ; le pipeline en ligne s'exécute à chaque question d'utilisateur. Les garder mentalement séparés rend l'ensemble de la conception plus facile à appréhender.

OFFLINE (indexing, runs when data changes)
  documents ─▶ clean ─▶ chunk ─▶ embed ─▶ store vectors + metadata
                                              │
                                       [ VECTOR DB ]
                                              │
ONLINE (querying, runs per question)          ▼
  question ─▶ embed ─▶ similarity search ─▶ top-k chunks
          ─▶ build grounded prompt ─▶ LLM ─▶ answer + citations

Étape 1 : Ingestion et nettoyage

Le principe « garbage in, garbage out » s'applique impitoyablement au RAG. Avant toute chose, extrayez un texte propre de vos sources (PDF, HTML, wikis, tickets), supprimez le contenu générique comme les barres de navigation et les pieds de page, et préservez la structure (titres, listes, tableaux), car cette structure porte un sens que le modèle utilisera. Associez des métadonnées à chaque document dès maintenant : source, URL, auteur, dernière mise à jour, niveau d'accès. Vous en aurez besoin ultérieurement pour le filtrage et les citations.

Étape 2 : Le découpage en segments : la décision la plus sous-estimée

Les modèles récupèrent et raisonnent sur des segments, pas sur des documents entiers. Un segment trop grand dilue la pertinence et gaspille le contexte ; un segment trop petit rompt le sens qui s'étend sur plusieurs phrases. De bons paramètres par défaut sont quelques centaines de tokens par segment avec un chevauchement modeste pour ne pas perdre les idées à cheval sur une frontière, mais la bonne taille dépend du contenu et mérite d'être ajustée en fonction de vos évaluations.

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=800,          # characters; tune against your eval set
    chunk_overlap=120,       # keep ideas that straddle a boundary
    separators=["\n\n", "\n", ". ", " "],  # prefer natural boundaries
)
chunks = splitter.split_text(clean_document_text)
💡

Conseil de pro

Stockez le titre de la source et le titre du document avec chaque segment et ajoutez-les en préfixe du texte du segment avant de le plonger. Un paragraphe isolé est ambigu ; le même paragraphe sous « Remboursements > Éligibilité » est plongé dans un vecteur bien plus facile à trouver. Cette simple astuce améliore sensiblement la qualité de la récupération.

Étape 3 : Les plongements

Un modèle de plongement transforme chaque segment en un vecteur (une liste de nombres) de sorte que les textes sémantiquement similaires se retrouvent proches dans l'espace. Le même modèle plonge vos segments au moment de l'indexation et vos questions au moment de la requête ; vous devez utiliser le même modèle pour les deux, sinon la géométrie ne correspond pas. Pour un système privé, exécutez un modèle de plongement ouvert localement afin que votre texte ne quitte jamais le réseau.

Attention

Ne mélangez jamais les modèles de plongement

Les vecteurs issus de deux modèles de plongement différents ne sont pas comparables ; rechercher dans un index du modèle A avec un vecteur de requête du modèle B donne des résultats absurdes. Si vous changez de modèle de plongement, vous devez replonger l'intégralité de votre corpus. Épinglez le modèle et sa version, et enregistrez-les dans les métadonnées de votre index.

Publicité

Étape 4 : La base de données vectorielle

La base vectorielle conserve vos vecteurs de segments ainsi que les métadonnées et répond rapidement à la question « quels segments sont les plus similaires à ce vecteur de requête ? » en utilisant une recherche approximative des plus proches voisins (ANN). Les options vont des bibliothèques embarquées aux serveurs complets, et le bon choix dépend de l'échelle et de l'appétence pour l'exploitation.

Avantages

  • pgvector : ajoutez des vecteurs à Postgres que vous utilisez déjà ; idéal pour une échelle modérée
  • Qdrant / Milvus / Weaviate : conçus spécifiquement pour cela, passent à l'échelle pour de grands corpus
  • FAISS / Chroma : embarqués, parfaits pour le prototypage et les petits ensembles
  • Le filtrage par métadonnées vous permet d'appliquer le contrôle d'accès au moment de la requête

Inconvénients

  • Un nouveau serveur implique une véritable exploitation : sauvegardez-le, surveillez-le, sécurisez-le
  • La recherche ANN sacrifie un peu de rappel pour beaucoup de vitesse ; ajustez les paramètres de l'index
  • La réindexation de grands corpus est lente : planifiez la capacité et le calendrier
  • La similarité cosinus, le produit scalaire ou la distance euclidienne doivent correspondre à votre modèle de plongement
💡

Astuce

Si vous utilisez déjà Postgres, commencez par pgvector

Il conserve vos vecteurs, métadonnées et données relationnelles existantes dans un seul système que vous sauvegardez et sécurisez déjà. De nombreux systèmes RAG privés n'ont jamais besoin de le dépasser ; ne passez à une base vectorielle dédiée que lorsque l'échelle ou le rappel l'exige vraiment.

Étape 5 : Récupération et prompt ancré

Au moment de la requête, vous encodez la question, récupérez les k fragments les plus similaires (filtrés selon le niveau d’accès de l’utilisateur) et assemblez une invite qui transmet ces fragments au modèle avec des consignes strictes : répondre uniquement à partir du contexte fourni, citer les sources et dire « Je ne sais pas » quand le contexte ne contient pas la réponse. C’est cette dernière instruction qui transforme un hallucinateur confiant en un assistant digne de confiance. Le filtre d’accès doit être intégré à la requête elle-même, de sorte qu’un utilisateur ne puisse jamais récupérer un fragment qu’il n’est pas autorisé à voir :

def retrieve(question: str, user, k: int = 6):
    qvec = embed(question)                       # SAME model used at index time

    # pgvector similarity search WITH access control pushed into the SQL.
    rows = db.execute(
        """
        SELECT id, title, text, (embedding <=> %(q)s) AS distance
        FROM chunks
        WHERE acl_level <= %(level)s              -- never return chunks above the user's level
        ORDER BY embedding <=> %(q)s              -- cosine distance, ANN-indexed
        LIMIT %(k)s
        """,
        {"q": qvec, "level": user.acl_level, "k": k},
    ).fetchall()

    # Abstain instead of answering from weak evidence.
    return [r for r in rows if r.distance < RELEVANCE_THRESHOLD]
SYSTEM = (
    "Answer the question using ONLY the context below. "
    "Cite the source id in brackets after each claim, e.g. [doc-12]. "
    "If the context does not contain the answer, say you don't know."
)

context = "\n\n".join(f"[{c.id}] {c.title}\n{c.text}" for c in top_k_chunks)
prompt = f"{SYSTEM}\n\nContext:\n{context}\n\nQuestion: {question}"
answer = llm.complete(prompt)

Étape 6 : Évaluation : la partie que les équipes sautent et regrettent

Sans évaluation, vous réglez à l’aveugle. La qualité d’un système RAG comporte deux volets, et vous devez mesurer les deux, car une excellente réponse est impossible si la récupération a fourni au modèle les mauvais fragments.

1

Évaluer la récupération

Constituez un ensemble de questions associées à des fragments pertinents connus, puis mesurez si la récupération les fait remonter (rappel et précision à k). Si le bon fragment n’est pas récupéré, aucune invite ne pourra sauver la réponse.

2

Évaluer les réponses

Pour les mêmes questions, jugez les réponses générées selon leur fidélité (aucune affirmation hors contexte), leur pertinence et l’exactitude des citations. La norme pratique consiste à utiliser un LLM comme juge, complété par une vérification humaine ponctuelle.

3

Suivre dans le temps

Exécutez l’évaluation à chaque modification : nouveau découpage, nouveau modèle d’encodage, nouvelle invite. Un système RAG est un ensemble de réglages ; l’évaluation est le seul moyen de savoir quel ajustement a été bénéfique.

2 volets

qualité de la récupération et qualité des réponses: mesurez les deux, sinon vous avancez à l’aveugle

Publicité

Maîtriser les hallucinations

L’ancrage contextuel n’empêche pas automatiquement un modèle d’inventer, mais plusieurs contrôles combinés vous mènent près du but : demandez au modèle de s’abstenir quand le contexte est insuffisant, exigez des citations pour que les affirmations soient traçables, fixez un seuil de pertinence pour que les récupérations faibles déclenchent un « Je ne sais pas » plutôt qu’une supposition, et envisagez une étape de reclassement pour placer les fragments vraiment pertinents en tête avant la génération.

Danger

Une réponse fausse mais assurée est pire que l’absence de réponse

Dans un système de connaissances privé, les utilisateurs font confiance aux résultats. Un assistant qui invente une politique de remboursement ou une procédure de sécurité cause un préjudice réel. Orientez votre système vers l’abstention : « Je n’ai pas trouvé cette information » est une fonctionnalité, pas un échec.

La liste de contrôle pour un RAG privé

Avantages

  • Modèles d’encodage et de génération locaux : les données ne quittent jamais votre réseau
  • Contrôle d’accès basé sur les métadonnées, appliqué au moment de la récupération
  • Citations sur chaque réponse pour la traçabilité et la confiance
  • Un jeu d’évaluation couvrant à la fois la qualité de la récupération et celle des réponses
  • Un pipeline de réindexation qui s’exécute lorsque les données sources changent

Inconvénients

  • Pas de mélange de modèles d’encodage sans réindexation complète
  • Pas d’impasse sur l’évaluation : on ne peut pas améliorer ce qu’on ne mesure pas
  • Pas de diffusion de réponses sans filtrage par contrôle d’accès
  • Pas de déploiement qui hallucine au lieu de s’abstenir

! Erreurs courantes à éviter

  • Encoder les fragments avec un modèle et les requêtes avec un autre.

    Utilisez exactement le même modèle d’encodage et la même version pour les deux ; en changer implique de tout réencoder.

  • Verser des documents entiers sous forme de fragments uniques.

    Découpez en morceaux cohérents et autonomes avec chevauchement, et préfixez par le titre de la section.

  • Laisser le modèle répondre à partir de récupérations faibles.

    Fixez un seuil de pertinence et demandez-lui de dire « Je ne sais pas » plutôt que de deviner.

  • Sauter l’évaluation et régler à l’aveugle.

    Mesurez séparément la qualité de la récupération et celle des réponses sur un jeu de questions fixe, à chaque modification.

? Foire aux questions

Quand utiliser le RAG plutôt que le fine-tuning ? +

Utilisez le RAG pour fournir à un modèle des faits à jour et attribuables à une source ; la mise à jour des connaissances consiste alors à réindexer un document, pas à réentraîner. Le fine-tuning enseigne un style ou des compétences, il ne modifie pas les faits.

Quelle base de données vectorielle choisir ? +

Si vous utilisez déjà Postgres, commencez par pgvector: il conserve les vecteurs, les métadonnées et les données relationnelles dans un seul système sauvegardé. Ne passez à un moteur spécialisé comme Qdrant, Milvus ou Weaviate que lorsque l’échelle ou le rappel l’exigent.

Quelle taille pour mes fragments ? +

Quelques centaines de tokens avec un léger chevauchement constituent un bon point de départ, mais la taille idéale dépend du contenu. Ajustez-la en fonction de votre jeu d’évaluation plutôt que de deviner.

Comment garantir la confidentialité ? +

Exécutez des modèles d’encodage et de génération ouverts en local afin que le texte ne quitte jamais votre réseau, et appliquez un contrôle d’accès par utilisateur via des filtres de métadonnées au moment de la récupération.

Comment empêcher les hallucinations ? +

Ancrez le modèle dans le seul contexte récupéré, exigez des citations, fixez un seuil de pertinence pour l’abstention et orientez le système vers « Je n’ai pas trouvé cette information » plutôt qu’une supposition assurée.

Succès

Le RAG, c’est de la plomberie bien faite

Il n’y a pas de composant magique dans le RAG: la qualité vient de la bonne exécution de chaque étape peu glamour : une ingestion propre, un découpage intelligent, des encodages cohérents, une récupération filtrée, une invite disciplinée et une évaluation sans relâche. Maîtrisez ces éléments entre vos murs et vous obtiendrez un assistant privé auquel vos utilisateurs pourront vraiment faire confiance.

Bishrul Haq

Written by

Bishrul Haq

Software engineer writing practical tutorials on Laravel, PHP, Python, and the tools behind real projects. More about me

Newsletter

Want more posts like this?

Get practical software notes and tutorials delivered when something new is published.

Pas de spam. Désinscription à tout moment.

Qu’en avez-vous pensé ?

Commentaires

0
Se connecter ou Créer un compte pour participer à la discussion et réagir à cet article.

Aucun commentaire pour l’instant. Soyez la première personne à donner votre avis.

Related posts

Algorithmes de tri essentiels pour les étudiants en informatique

Les algorithmes sont couramment enseignés dans les cursus d'informatique et de génie logiciel, en licence ou en master. Certains les trouvent difficiles à comprendre parce qu'ils les apprennent par cœur.

il y a 6 ans

GraphQL dans Laravel avec Lighthouse

Dans le développement web moderne, GraphQL s’est imposé comme une alternative puissante aux API REST grâce à sa flexibilité et son efficacité.

il y a 1 an

Construire des interfaces réactives modernes avec Laravel 12 et Livewire 4 : guide de mise en production

Un parcours complet de Livewire 4 dans Laravel 12, pensé pour la production : objets formulaire, composants paresseux, interopérabilité avec Alpine, téléversement de fichiers, tests Pest et les pièges de déploiement que personne ne mentionne.

il y a 2 mois

Créer des panneaux d'administration robustes avec Laravel 12 et Filament v5 : guide de mise en production

Livrez un véritable panneau d'administration Filament v5 sur Laravel 12 : ressources, RBAC avec Spatie, multi-location, widgets personnalisés et une checklist de déploiement pour les équipes qui dépassent le stade du hello-world.

il y a 2 mois

Optimiser Laravel 12 avec Octane et FrankenPHP : guide de performance en production

Réduisez la latence de Laravel 12 de plus de moitié avec Octane et FrankenPHP: installation, configuration, audit des singletons et benchmarks, avec les pièges de production qui frappent les équipes dès la deuxième semaine.

il y a 2 mois