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
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.
É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.
É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.
É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.
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.
qualité de la récupération et qualité des réponses: mesurez les deux, sinon vous avancez à l’aveugle
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.
Commentaires
0Aucun commentaire pour l’instant. Soyez la première personne à donner votre avis.