RAG (Retrieval-Augmented Generation) = pattern dominant 2024-2026 pour combiner LLM (GPT-4, Claude, Llama) avec données privées (docs, KB, base produit). MVPs RAG simples partout, mais RAG production = différent. Voici patterns architecture qui marchent vraiment 2026.
TL;DR
- Chunking intelligent > chunking naïf 500 tokens.
- Hybrid search (vector + keyword BM25) > vector seul.
- Re-ranking essentiel (Cohere, Voyage, Cross-encoder).
- Citations + source attribution non négociable.
- Multi-step RAG (decompose, route, synthesize) pour requêtes complexes.
Architecture RAG production 2026
`
- Ingestion pipeline :
Docs sources → parser → chunker → embedder → vector DB
- Query pipeline :
User query → query rewriter → hybrid search → re-ranker
→ context assembly → LLM → citation
`
Pattern 1 — Chunking intelligent
Chunking naïf (à éviter)
`python
chunks = split_every_500_tokens(document) # ❌ MVP, pas production
`
Problèmes :
- Coupures milieu phrases / sections
- Perte contexte structurel (titres → paragraphes)
- Embeddings dégradés
Chunking sémantique production
`python
def smart_chunk(doc):
# 1. Préserver structure
sections = parse_markdown(doc) # ou XML, HTML
chunks = []
for section in sections:
# 2. Chunks par section, max 800 tokens
if token_count(section) <= 800:
chunks.append({
'text': section.text,
'metadata': {
'title': section.title,
'level': section.level,
'parent_titles': section.parents
}
})
else:
# 3. Sous-chunks avec overlap 100 tokens
sub = split_with_overlap(section, max=800, overlap=100)
chunks.extend(sub)
# 4. Enrichir chaque chunk avec contexte parent
for chunk in chunks:
chunk['contextualized'] = (
f"Document: {doc.title}\n"
f"Section: {' > '.join(chunk['metadata']['parent_titles'])}\n\n"
f"{chunk['text']}"
)
return chunks
`
Pattern 2 — Hybrid Search (vector + BM25)
Vector seul rate les requêtes avec termes exacts (codes produits, IDs). BM25 seul rate sémantique. Combiner :
`python
def hybrid_search(query, k=20):
# 1. Vector search (sémantique)
query_embedding = embed(query)
vector_results = vector_db.search(query_embedding, k=k)
# 2. Keyword search (BM25)
keyword_results = bm25_index.search(query, k=k)
# 3. Reciprocal Rank Fusion (RRF)
fused = {}
for rank, doc in enumerate(vector_results):
fused[doc.id] = fused.get(doc.id, 0) + 1 / (60 + rank)
for rank, doc in enumerate(keyword_results):
fused[doc.id] = fused.get(doc.id, 0) + 1 / (60 + rank)
# 4. Top k par score fusionné
return sorted(fused.items(), key=lambda x: -x[1])[:k]
`
Pattern 3 — Re-ranking obligatoire
Hybrid search retrieve top 20-50 candidats. Re-ranker (cross-encoder) re-trie par pertinence vraie.
`python
import cohere
co = cohere.Client(api_key=...)
def rerank(query, candidates, top_n=5):
docs = [c.text for c in candidates]
response = co.rerank(
model='rerank-english-v3.0', # ou 'rerank-multilingual-v3.0'
query=query,
documents=docs,
top_n=top_n
)
return [candidates[r.index] for r in response.results]
`
Re-rankers populaires 2026 :
Besoin d'un site web professionnel ?
Kolonell crée des sites web qui attirent des clients, optimisés pour le marché sénégalais. Devis gratuit en 2 minutes.
- Cohere Rerank : managed, multilingual, fast
- Voyage rerank-2 : excellent qualité
- BGE Reranker : open source, à self-host
- OpenAI text-embedding-3-large : usable mais slower
Re-ranking coût ~$1-3 / 1000 queries Cohere. ROI massif sur qualité.
Pattern 4 — Multi-step RAG (Decompose-then-Recombine)
Pour requêtes complexes, single-shot RAG fail. Décomposer :
`python
def multi_step_rag(query):
# Step 1 : Décomposer en sous-questions
subquestions = llm_decompose(query)
# Ex: "Compare Stripe vs PayPal pour SaaS Africa"
# → ["Quel est le pricing Stripe?", "Quel est pricing PayPal?",
# "Couverture Stripe Africa?", "Couverture PayPal Africa?"]
# Step 2 : RAG indépendant chaque
contexts = []
for sq in subquestions:
ctx = rag_retrieve(sq)
contexts.append((sq, ctx))
# Step 3 : Synthèse finale avec tous contexts
response = llm_synthesize(query, contexts)
return response
`
Augmente latence (3-5x) mais qualité spectaculaire pour comparatifs / analyses.
Pattern 5 — Citations + source attribution
Pas de RAG production sans citations. Confiance = vérifiabilité.
`python
def generate_with_citations(query, contexts):
prompt = f"""
Réponds à la question en utilisant uniquement les sources.
Pour chaque affirmation, cite la source [1], [2], etc.
Sources :
{format_sources(contexts)}
Question : {query}
Réponse (avec citations) :
"""
response = llm.complete(prompt)
return parse_citations(response, contexts)
`
UI doit afficher citations cliquables vers source.
Pattern 6 — Caching intelligent
`python
import hashlib
class RAGCache:
def cache_key(self, query):
# Normaliser : lowercase, strip, hash
return hashlib.md5(query.lower().strip().encode()).hexdigest()
def get(self, query):
# Semantic cache : embeddings similar > 0.95 → cache hit
query_emb = embed(query)
for cached_emb, response in self.cache:
if cosine(query_emb, cached_emb) > 0.95:
return response
return None
`
Économise 30-50 % API calls en production.
Vector DBs 2026 comparées
| Vector DB | Best for | Pricing |
|---|---|---|
| Pinecone | Managed, enterprise | $70+/mo starter |
| Qdrant | Self-host, OSS | Free + cloud $25+ |
| Weaviate | Hybrid (vector + filter) | OSS + cloud |
| Postgres + pgvector | Combine relational | $0 (déjà DB) |
| MongoDB Atlas Vector | Already MongoDB | $0 (déjà DB) |
| Chroma | Dev/prototype | OSS |
| Milvus / Zilliz | High scale | Cloud $50+ |
Pour startup avec MongoDB déjà : Atlas Vector Search = no-brainer.
Embeddings 2026 leaders
- OpenAI text-embedding-3-large : excellent, $0.13/1M tokens
- OpenAI text-embedding-3-small : bon rapport, $0.02/1M
- Voyage voyage-3 : très bon qualité, multilingual
- Cohere embed-multilingual-v3 : multilingual best
- BGE-M3 : open source, self-host friendly
Erreurs RAG fréquentes
- Chunks trop petits (< 200 tokens) — perte contexte.
- Chunks trop grands (> 2000) — embeddings noyés.
- Pas de metadata filtering — recherche tout le corpus tout le temps.
- Pas de re-ranking — qualité dégradée.
- Pas de citations — hallucinations cachées.
- Pas de évaluation continue — drift silencieux.
Eval RAG en production
`python
# Métriques RAG
retrieval_recall = relevant_docs_in_top_k / total_relevant_docs
retrieval_precision = relevant_docs_in_top_k / k
answer_faithfulness = supported_claims / total_claims
answer_relevance = LLM_judge(query, answer)
answer_correctness = LLM_judge(answer, ground_truth)
`
Outils : Ragas, LangSmith, Phoenix Arize.
Coût RAG production estimé
| Composant | Coût mensuel |
|---|---|
| Embedding 1M docs | $20 (OpenAI small) |
| Vector DB | $50-300 |
| Re-ranker | $50-200 (selon volume) |
| LLM calls (10K req/jour) | $300-2000 |
| Total RAG SaaS moyen | $500-2500/mois |
FAQ
Q : RAG vs fine-tuning ?
R : RAG pour knowledge dynamique. Fine-tuning pour style/format/domaine spécifique. Souvent les deux combinés.
Q : Open source RAG framework ?
R : LlamaIndex, LangChain pour starter. À production, custom code souvent meilleur.
Q : Combien de chunks retrieve ?
R : Hybrid 20-50 → re-rank → top 5-10 dans context final. Plus = noise.
Conclusion
RAG production 2026 ≠ RAG MVP. Patterns : smart chunking, hybrid search, re-ranking, citations, eval continu. Coût $500-2500/mois SaaS moyen. Investment dans qualité retrieval = ROI massif vs LLM seul.
Mohamed Bah
Fondateur, Kolonell
Passionné par le digital et l'entrepreneuriat en Afrique, Mohamed accompagne les entreprises sénégalaises dans leur transformation digitale depuis 2020. Fondateur de Kolonell, il croit que chaque PME mérite une présence en ligne professionnelle et accessible.