← Retour au cours
▶ Aperçu gratuit · Leçon offerte

Leçon 2 — RAG fondamentaux : chunking, embeddings, vector DB, hybrid search

⏱ 60 min · 🎬 Lecon · 🏆 20 XP
🎬
Vidéo en production
Notre équipe pédagogique tourne actuellement cette leçon avec un·e formateur·rice expert·e. Le contenu textuel ci-dessous est complet et utilisable dès maintenant.

Leçon 2 — RAG fondamentaux

Chunking, embeddings, vector DB (Qdrant, Pinecone, Weaviate), hybrid search BM25 + dense.

Objectifs de la leçon

  • Comprendre le pattern Retrieval-Augmented Generation (Lewis 2020)
  • Maîtriser le chunking et choisir une stratégie selon le type de document
  • Choisir un modèle d'embedding (OpenAI, Cohere, Voyage, BGE, E5)
  • Comparer Qdrant, Pinecone, Weaviate, Chroma, Milvus, pgvector
  • Combiner BM25 + dense pour du hybrid search

1. Pourquoi RAG ?

Un LLM brut a deux faiblesses : knowledge cutoff (ne connaît pas vos données ni les événements récents) et hallucinations. Le RAG y répond en récupérant les passages pertinents d'une base documentaire et en les injectant dans le prompt.

Lewis P. et al., « Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks », NeurIPS 2020, arXiv:2005.11401 — papier fondateur RAG par Facebook AI.

2. Pipeline RAG canonique

1. INGESTION (offline)
   Documents → Parse (PDF/HTML/MD) → Chunk → Embed → Vector DB

2. QUERY (online)
   User question → Embed → Vector search (top-k)
                    ↓
              Pass(es) → LLM with context → Answer

3. Parsing de documents

FormatOutil recommandé
PDF natifPyMuPDF (fitz), Unstructured.io
PDF scannéOCR (Tesseract, AWS Textract, Azure Document Intelligence, Mistral OCR)
HTMLBeautifulSoup, Readability, Trafilatura
DOCXpython-docx
Codetree-sitter, langchain-text-splitters Language
TableauxCamelot, Tabula, Unstructured

4. Stratégies de chunking

StratégiePrincipeQuand l'utiliser
Fixed-sizeN tokens avec chevauchementTexte brut homogène
Recursive characterSplit par séparateurs hiérarchiquesMixte (Markdown, légal, manuels)
Sentence-awareDécoupe en phrases (spaCy, NLTK)Texte conversationnel
Semantic chunkingCoupe sur la dissimilarité embedding voisineDocuments thématiquement variés
Document layout-awarePréserve titres, sections (Unstructured)Documents structurés (juridique, scientifique)
Parent-childIndex sur petits chunks, retourne le parentRAG avancé (voir leçon 3)

Recursive character splitter (LangChain)

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=512,
    chunk_overlap=64,
    separators=["\n\n", "\n", ". ", " ", ""]
)
chunks = splitter.split_text(long_text)
Règle pratique : chunk_size 256-1024 tokens, overlap 10-20 %. Trop petit = perte de contexte ; trop grand = embedding peu spécifique + dilution dans le prompt LLM.

5. Embeddings — choisir le modèle

ModèleDimAPI/OpenParticularité
OpenAI text-embedding-3-large3072 (réductible)APIExcellent défaut, multilingue
Cohere embed-v31024APIMultilingue 100 langues, compression INT8
Voyage AI voyage-31024APITrès bon RAG, multilingue
BGE-large-en/multilingual1024OpenTop open-source (BAAI, MTEB leader)
E5-Mistral 7B4096OpenÉtat de l'art mais coûteux
nomic-embed-text-v1.5768 (Matryoshka)OpenCompact, multilingue
all-MiniLM-L6-v2384OpenLéger CPU, baseline
Référence comparative : MTEB Leaderboard (Massive Text Embedding Benchmark)

6. Vector databases — comparatif

Vector DBTypeHybrid searchParticularité
QdrantOpen-source + cloudOuiRust, payload filters puissants
PineconeSaaSOuiPremier acteur, managed pur
WeaviateOpen + cloudOui (BM25 natif)GraphQL, modules ML intégrés
Milvus / ZillizOpen + cloudOuiScale énorme (milliards)
ChromaOpen + cloudLimitéEmbeddable, dev local
pgvectorPostgres extensionVia FTSSimple, SQL, ACID
Elasticsearch / OpenSearchSearch engineExcellent (BM25 + dense)Stack existante
LanceDBEmbeddableOuiFormat columnar, scale efficient

6.1 Index ANN

  • HNSW (Hierarchical Navigable Small World) — défaut moderne, rapide et précis
  • IVF (Inverted File) — bon pour volumes énormes
  • IVF-PQ — quantization produit pour économiser la RAM
  • SCANN (Google) — variante optimisée

Qdrant en local + Python

from qdrant_client import QdrantClient, models
from openai import OpenAI

client = QdrantClient(url="http://localhost:6333")
oai = OpenAI()

# Création collection
client.recreate_collection(
    collection_name="docs",
    vectors_config=models.VectorParams(size=3072, distance=models.Distance.COSINE)
)

# Ingestion
points = []
for i, chunk in enumerate(chunks):
    emb = oai.embeddings.create(model="text-embedding-3-large", input=chunk).data[0].embedding
    points.append(models.PointStruct(id=i, vector=emb, payload={"text": chunk, "source": doc_id}))
client.upsert(collection_name="docs", points=points)

# Query
q = "Comment fonctionne Spark ?"
q_emb = oai.embeddings.create(model="text-embedding-3-large", input=q).data[0].embedding
results = client.search(collection_name="docs", query_vector=q_emb, limit=5)
for r in results:
    print(r.score, r.payload["text"][:100])

7. Hybrid search — BM25 + dense

Le dense (embeddings) capture la sémantique mais peut louper les termes rares (noms propres, identifiants techniques). BM25 (Okapi 1995) capture les termes exacts. La combinaison RRF (Reciprocal Rank Fusion) est nettement supérieure.

def reciprocal_rank_fusion(rankings, k=60):
    scores = {}
    for ranking in rankings:
        for rank, doc_id in enumerate(ranking):
            scores[doc_id] = scores.get(doc_id, 0) + 1.0 / (k + rank)
    return sorted(scores.items(), key=lambda x: -x[1])
Cormack G., Clarke C., Buettcher S., « Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods », SIGIR 2009.

8. Évaluer un RAG basique

  • Hit Rate @ K : le bon passage est-il dans le top-K ?
  • MRR (Mean Reciprocal Rank) : position moyenne du premier bon doc
  • nDCG : gain cumulé pondéré par rang
  • Faithfulness : la réponse cite-t-elle les passages récupérés ?
  • Answer Relevancy : la réponse adresse-t-elle la question ?

Voir leçon 5 pour les frameworks Ragas et LangSmith.

9. Synthèse et points-clés

  • RAG = ingestion + chunking + embedding + retrieval + génération
  • Chunk 256-1024 tokens, overlap 10-20 %, RecursiveCharacterTextSplitter en défaut
  • text-embedding-3-large ou BGE-large = défaut 2026
  • Qdrant / Pinecone / Weaviate = top vector DBs
  • HNSW = index ANN moderne
  • Hybrid search BM25 + dense avec RRF = standard
  • Mesurer : Hit Rate @ K, MRR, Faithfulness, Answer Relevancy

Pour aller plus loin

Continuez le parcours 🚀

Inscrivez-vous pour accéder aux 5 autres leçons + le quiz final.

Créer mon compte
🍪 Nous utilisons des cookies essentiels et, avec ton accord, des cookies analytiques. En savoir plus

⚙️ Préférences cookies

Choisis quels cookies tu acceptes — modifiable à tout moment.

🔐 Essentiels (obligatoires)Authentification, session, sécurité. Toujours actifs.
📊 Analytics anonymesMesure d'audience anonymisée — aucune donnée personnelle.
📣 MarketingPublicités ITAG pertinentes sur d'autres sites.
💬 Contactez-nous sur WhatsApp