Aller au contenu principal

Implémenter le flux RAG

Mis à jour le 30 juillet 2026

Toutes les pièces du RAG sont maintenant sur la table : le découpage de documents, les embeddings, la base vectorielle. Cette leçon les assemble en pipeline complet — cinq étapes qui mènent d’un document brut à une recherche sémantique opérationnelle. Chaque étape tient en quelques lignes, précisément parce que le travail de fond a été fait dans les leçons précédentes.

Les cinq étapes

1. Découper le texte par section

chunks = chunk_by_section(text)

Notre rapport annuel est découpé selon la stratégie choisie précédemment — par sections, dont les frontières épousent la structure logique du document. À la sortie : une liste de segments de texte, chacun portant une idée à peu près autonome.

2. Générer les embeddings

embeddings = generate_embedding(chunks)

Chaque segment est converti en vecteur numérique qui capture son sens. La fonction accepte la liste entière : les modèles d’embeddings traitent les lots efficacement, et un seul appel vaut mieux que des dizaines.

3. Stocker en base vectorielle

store = VectorIndex()

for embedding, chunk in zip(embeddings, chunks):
    store.add_vector(embedding, {"content": chunk})

Le zip réunit chaque vecteur et son segment d’origine, et c’est le point le plus important de cette étape : on stocke l’embedding et le texte original, ensemble. L’embedding seul est inutile pour nous — un tableau de nombres sans signification directe pour un humain. On a besoin du contenu lisible qu’il représente, et c’est le dictionnaire de métadonnées attaché au vecteur qui le transporte.

4. Générer l’embedding de la requête

user_embedding = generate_embedding(
    "Qu'a fait le département d'ingénierie logicielle l'an dernier ?"
)

Au moment de la question, même conversion, même modèle : la question de l’utilisateur devient un vecteur dans le même espace sémantique que les segments. C’est cette symétrie qui rend la comparaison possible — question et documents parlent désormais la même langue mathématique.

5. Rechercher les documents pertinents

results = store.search(user_embedding, 2)

for doc, distance in results:
    print(distance, "\n", doc["content"][0:200], "\n")

La recherche compare le vecteur de la question à tous les vecteurs stockés et retourne les deux plus proches, chacun accompagné de son score de distance cosinus. Le second argument — ici 2 — contrôle le nombre de résultats : un curseur à régler selon la taille de vos segments et le budget de contexte que vous voulez consacrer à la récupération.

Comprendre les résultats

Sur notre exemple, le segment le mieux classé est bien celui qui traite du département d’ingénierie logicielle — la recherche a fonctionné sans qu’aucun mot-clé n’ait été programmé. Lisez les scores avec la bonne convention : plus la distance est faible, plus le contenu est similaire à la requête. Les scores absolus varient selon le modèle d’embeddings ; ce sont les écarts relatifs entre résultats qui guident l’interprétation — un premier résultat nettement détaché est un signal de confiance, un peloton serré suggère que plusieurs sections se disputent la pertinence.

Pourquoi stocker le contenu avec les embeddings

Revenons une dernière fois sur le choix de l’étape 3, car il conditionne l’étape suivante du projet. Quand la recherche retourne les embeddings les plus similaires, il faut le texte original pour comprendre ce qui a été trouvé — et surtout pour l’utiliser : ce sont ces segments lisibles, pas leurs vecteurs, qui seront injectés dans le prompt de Claude pour fonder sa réponse. Une base vectorielle sans les contenus attachés serait une table des matières sans livre. La prochaine leçon boucle précisément cette boucle : brancher les résultats de recherche sur le prompt, et obtenir des réponses fondées sur le document.

Points clés à retenir

  • Le pipeline RAG tient en cinq étapes : découper, vectoriser, stocker, vectoriser la question, rechercher
  • Stockez toujours le texte original avec son embedding — le vecteur seul est illisible et inutilisable en prompt
  • Question et segments sont vectorisés par le même modèle : c’est ce qui rend leur comparaison valide
  • Distance cosinus : plus elle est faible, plus le segment est proche de la question
  • Les segments retrouvés alimenteront le prompt de Claude — c’est l’objet de la leçon suivante