+170 XP

Retrieval-augmented generation (RAG) : donner vos données aux modèles

Demandez à ChatGPT « Combien de jours de congés ai-je après trois ans ici ? » et il n'en a aucune idée. Il n'a jamais lu le règlement intérieur de votre entreprise. Il peut inventer une réponse avec assurance, ce qui est pire que de ne rien dire.

Le RAG corrige cela. C'est la technique derrière presque tous les produits « chat with your documents » que vous avez vus : bots de support client, assistants RH internes, outils de recherche juridique. À la fin de cette leçon, vous comprendrez exactement comment ça fonctionne, et vous en verrez le cœur en une vingtaine de lignes de Python.

Le problème que le RAG résout

Un large language model (LLM) comme GPT-5 ou Claude sait ce qui figurait dans ses données d'entraînement. Il ne sait pas :

  • Les politiques internes de votre entreprise
  • Les notes de réunion de la semaine dernière
  • Vos dossiers clients confidentiels
  • Tout ce qui a changé après sa date de training cutoff

Vous pourriez essayer de coller l'intégralité de votre règlement de 200 pages dans le chat. Mais les modèles ont une context window : une limite sur la quantité de texte qu'ils peuvent lire d'un coup. Même avec les grandes fenêtres actuelles, tout déverser est lent, coûteux, et rend le modèle moins précis (il se laisse distraire par du texte hors sujet).

L'insight du RAG : ne donnez pas tout au modèle. Trouvez les quelques paragraphes pertinents et ne lui donnez que ceux-là.

Les trois étapes du RAG

Voyez le RAG comme un bibliothécaire intelligent. Vous posez une question, le bibliothécaire court chercher les trois pages les plus pertinentes et les remet au modèle avec votre question.

  1. Retrieval : chercher dans vos documents les chunks les plus pertinents pour la question.
  2. Augmentation : coller ces chunks dans le prompt.
  3. Generation : le modèle répond en s'appuyant sur ce texte collé.

Toute la magie est à l'étape 1. Comment un ordinateur sait-il quels paragraphes sont « pertinents » ? C'est là que les embeddings entrent en jeu.

Les embeddings : transformer le sens en nombres

Un embedding est une liste de nombres qui représente le *sens* d'un morceau de texte. Des sens proches donnent des nombres proches.

« Combien de congés payés ai-je ? » et « Quelle est la politique de vacances ? » n'ont presque aucun mot en commun. Mais leurs embeddings se retrouvent tout près l'un de l'autre, parce qu'ils veulent dire à peu près la même chose. C'est la clé : les embeddings permettent de chercher par le sens, pas par mot-clé.

Vous créez des embeddings en appelant un modèle d'embedding (OpenAI, Google et Cohere en proposent tous à bas coût). Vous récupérez une longue liste de nombres, souvent 1 536, pour chaque chunk de texte.

Envie d'une intuition visuelle ? L'embedding projector de Google vous permet de survoler de vrais embeddings de mots en 3D : projector.tensorflow.org.

Construire le chatbot du règlement intérieur

Construisons-le d'abord conceptuellement, puis en code.

Étape 1 : découper le règlement en chunks

Vous ne pouvez pas embedder un document de 200 pages en un seul bloc. Vous le découpez en chunks, généralement quelques paragraphes chacun (disons 500 mots). Chaque chunk devient une unité recherchable.

Ainsi notre règlement devient peut-être 400 chunks : un sur le congé parental, un sur les notes de frais, un sur l'acquisition des congés, etc.

Étape 2 : embedder chaque chunk et le stocker

Vous passez chaque chunk dans le modèle d'embedding et stockez les nombres obtenus dans une base de données vectorielle (une base conçue pour chercher par similarité). Parmi les plus utilisées en 2026 : Chroma, Pinecone et pgvector. Pour de petits projets, vous n'en avez même pas besoin : une simple liste en mémoire suffit.

Cette étape se fait une fois, en amont. On l'appelle « l'indexation ».

Étape 3 : répondre à une question

Quand un utilisateur demande quelque chose :

  1. Embedder sa question.
  2. Trouver les chunks dont les embeddings sont les plus proches de celui de la question.
  3. Coller ces chunks dans le prompt.
  4. Envoyer le tout au modèle.

What is Retrieval-Augmented Generation (RAG)?

Watch on YouTube

L'esquisse de code

Voici tout le pattern en Python exécutable, avec OpenAI. Peu importe si vous ne codez pas ; lisez les commentaires et vous suivrez la logique.

python
from openai import OpenAI
import numpy as np

client = OpenAI()  # utilise votre clé API

# 1. Notre « règlement », découpé en chunks
chunks = [
    "Employees accrue 15 vacation days per year. After 3 years, this increases to 20 days.",
    "Expense reports must be submitted within 30 days using the Concur portal.",
    "Parental leave is 16 weeks of paid time off for all new parents.",
]

def embed(text):
    # Transforme le texte en une liste de nombres (son embedding)
    resp = client.embeddings.create(
        model="text-embedding-3-small", input=text
    )
    return np.array(resp.data[0].embedding)

# 2. Embedder chaque chunk une fois (l'« index »)
chunk_vectors = [embed(c) for c in chunks]

# 3. Un utilisateur pose une question
question = "How many vacation days do I get after three years?"
q_vector = embed(question)

# 4. Trouver le chunk le plus similaire (similarité cosinus)
def similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

scores = [similarity(q_vector, cv) for cv in chunk_vectors]
best_chunk = chunks[int(np.argmax(scores))]

# 5. Insérer le meilleur chunk dans le prompt
prompt = f"""Answer using ONLY the context below.
If the answer isn't there, say you don't know.

Context: {best_chunk}

Question: {question}"""

answer = client.chat.completions.create(
    model="gpt-5",
    messages=[{"role": "user", "content": prompt}],
)
print(answer.choices[0].message.content)

Ce qui se passe : l'embedding de la question est le plus proche du chunk *congés* (pas des frais, pas du congé parental). On ne colle que ce chunk, et le modèle répond « 20 jours » directement depuis vos données.

Remarquez l'instruction du prompt : « Answer using ONLY the context below. » C'est ce qui garde le modèle honnête. Ça l'empêche d'inventer des réponses et l'ancre dans votre texte.

Vérification des acquis

1. Quel est l'insight central de l'approche RAG pour répondre à des questions à partir de vos données ?

2. Pourquoi coller simplement un règlement de 200 pages dans la fenêtre de chat est-il généralement une mauvaise solution ?

3. Pourquoi une recherche fondée sur les embeddings peut-elle rapprocher « Combien de congés payés ai-je ? » et « Quelle est la politique de vacances ? » alors qu'elles ne partagent presque aucun mot ?

CHOIX MULTIPLES

4. Sélectionnez TOUTES les limitations réelles d'un LLM de base que le RAG vise à corriger.

Sélectionnez toutes les réponses correctes.

CHOIX MULTIPLES

5. Sélectionnez TOUTES les affirmations qui décrivent correctement les trois étapes du RAG (Retrieval, Augmentation, Generation).

Sélectionnez toutes les réponses correctes.

Pourquoi le RAG bat les alternatives

On demande souvent : pourquoi ne pas simplement fine-tuner le modèle sur mes données ? (Le fine-tuning consiste à réentraîner le modèle pour que vos données vivent à l'intérieur.)

Le RAG gagne généralement pour la connaissance d'entreprise parce que :

  • Il se met à jour instantanément. Une politique change ? Ré-embeddez un chunk. Avec le fine-tuning, il faudrait réentraîner.
  • Il cite ses sources. Vous savez exactement quel chunk a produit la réponse, donc vous pouvez afficher « d'après la page 14 du règlement ».
  • Il est moins cher et plus rapide à mettre en place.
  • Il réduit l'hallucination. Le modèle répond à partir du texte qu'il a sous les yeux, pas d'une mémoire floue.

Le fine-tuning est meilleur pour changer le *style ou le comportement* du modèle (toujours répondre en langage juridique, toujours utiliser notre voix de marque). Le RAG est meilleur pour lui fournir des *faits*. Beaucoup de systèmes réels utilisent les deux.

Là où le RAG déraille (et comment corriger)

Le RAG n'est pas magique. Les échecs les plus fréquents :

Mauvais chunking. Si vous coupez une phrase en deux, le retrieval casse. Correctif : découpez par paragraphe ou par section, et laissez les chunks se chevaucher légèrement pour ne pas perdre le contexte aux bords.

Récupérer les mauvais chunks. Si la question est vague, vous risquez de remonter du texte hors sujet. Correctif : récupérez les 3 à 5 meilleurs chunks au lieu d'un seul, pour donner plus de matière au modèle.

La réponse s'étend sur plusieurs chunks. « Comparez nos politiques de voyage 2024 et 2025 » nécessite deux sections. Correctif : récupérez plus de chunks et laissez le modèle faire la synthèse.

Index obsolète. Vous avez mis à jour le règlement mais oublié de ré-embedder. Le bot donne d'anciennes réponses. Correctif : ré-indexez selon un calendrier.

Vous n'avez pas toujours besoin de le construire

En 2026, vous pouvez obtenir du RAG sans écrire le code ci-dessus :

  • ChatGPT et Claude vous laissent uploader des fichiers dans un Project, et ils y font du retrieval automatiquement.
  • Les Custom GPTs et Claude Projects permettent de construire un bot de règlement intérieur en uploadant des documents, sans aucun code.
  • NotebookLM de Google est du RAG dans un habillage accessible : vous uploadez des sources, posez des questions, et obtenez des réponses avec des citations renvoyant au passage exact.

Utilisez-les pour un usage réduit ou personnel. Construisez le pipeline vous-même quand vous avez besoin de contrôle, de scalabilité, d'un hébergement privé ou d'une intégration dans un produit.

Points clés

  • RAG = récupérer les chunks pertinents, les coller dans le prompt, laisser le modèle répondre. Il ancre le modèle dans *vos* données plutôt que dans l'internet ouvert.
  • Les embeddings sont le moteur. Ils transforment le texte en nombres pour chercher par le sens, en rapprochant « politique de vacances » et « congés payés » même sans mot commun.
  • Demandez toujours au modèle de répondre uniquement à partir du contexte fourni. Cette seule ligne réduit fortement l'hallucination et vous permet de tracer les réponses jusqu'à une source.
  • Commencez en no-code. Utilisez NotebookLM, un Custom GPT ou un Claude Project pour prototyper votre bot de règlement dès aujourd'hui, puis passez à une vraie base vectorielle (Chroma, pgvector) quand vous en aurez dépassé les limites.
  • La qualité du chunking décide de la qualité du retrieval. Découpez par section, autorisez un léger chevauchement, et ré-indexez dès que vos documents changent.

À faire, tiré de cette leçon

Ces actions sont compilées dans le plan d'action du rôle.

  • Passez le RAG et collez de petits ensembles de documents directement dans le prompt
Voir le plan d'action complet →

Articles liés

Les articles récents du blog qui s'appuient sur cette leçon.