Stratégie d'embeddings pour les systèmes RAG avancés
Pourquoi la stratégie d'embeddings est la décision architecturale la plus sous-estimée dans la conception de systèmes RAG.
Stratégie d'embedding pour systèmes RAG avancés
Le choix de la stratégie d'embedding est la décision architecturale la plus sous-estimée dans la conception d'un système RAG. On déploie souvent le premier modèle disponible, on l'utilise en production pendant six mois, puis on découvre que 30% des requêtes échouent par manque de précision — et que migrer un index vectoriel de plusieurs millions de vecteurs est une opération douloureuse.
Voici le panorama des stratégies disponibles et le cadre pour choisir la bonne.
Dense vs Sparse : deux philosophies de représentation
Les embeddings denses (BERT, E5, GTE, OpenAI) projettent un texte dans un espace vectoriel continu de dimension fixe (768 à 3072 dimensions). La similarité sémantique se mesure par proximité cosinus. Puissants pour la compréhension sémantique, mais opaques et peu efficaces sur les requêtes lexicales exactes.
Les embeddings sparse (BM25, SPLADE, BGE-M3 en mode sparse) produisent des vecteurs de très haute dimension (taille du vocabulaire) mais très creux. La plupart des dimensions sont à zéro — seuls les termes présents ont des poids non-nuls. Excellents pour les requêtes lexicales précises, noms propres, identifiants techniques.
La dichotomie n'est plus aussi stricte : BGE-M3 produit simultanément des représentations denses, sparse et multi-vecteurs depuis un seul modèle, ce qui en fait une option très attractive pour les systèmes hybrides.
Bi-encodeurs vs Cross-encodeurs
Bi-encodeur : encode séparément la requête et le document, compare les représentations. Rapide à l'inférence (O(1) par requête sur un index pré-calculé). Adapté au retrieval à grande échelle.
Cross-encodeur : encode conjointement la requête et le document. Voit l'interaction entre les deux. Beaucoup plus précis mais quadratique en complexité — impossible à utiliser pour le retrieval initial, indispensable pour le re-ranking.
# Architecture recommandée : bi-encoder pour retrieval, cross-encoder pour re-ranking
from sentence_transformers import SentenceTransformer, CrossEncoder
# Retrieval : bi-encoder (rapide, scalable)
bi_encoder = SentenceTransformer("BAAI/bge-large-en-v1.5")
query_embedding = bi_encoder.encode(query)
candidates = vector_store.search(query_embedding, top_k=100)
# Re-ranking : cross-encoder (précis, appliqué aux top-K candidats seulement)
cross_encoder = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")
scores = cross_encoder.predict([(query, doc.text) for doc in candidates])
reranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
final_context = [doc for doc, _ in reranked[:5]]ColBERT : l'interaction tardive
ColBERT (Contextualized Late Interaction over BERT) est une architecture qui combine les avantages des bi-encodeurs et des cross-encodeurs. Elle encode séparément la requête et les documents en multi-vecteurs (un vecteur par token), puis calcule une similarité par interaction tardive (MaxSim operator).
Score(Q, D) = Σ_qi max_dj (qi · dj)
Le gain est significatif : ColBERT atteint des performances proches du cross-encoder avec une complexité de retrieval bien inférieure. RAGatouille facilite l'intégration de ColBERT dans des pipelines LangChain/LlamaIndex.
Adaptation au domaine
Un modèle généraliste sur un corpus spécialisé sous-performe systématiquement. Les options pour l'adaptation :
- Fine-tuning avec contrastive learning : construire des paires (requête, document positif, documents négatifs) et fine-tuner avec une loss InfoNCE
- Domain-adaptive pre-training : continuer le pre-training sur votre corpus avant le fine-tuning de retrieval
- Matryoshka Representation Learning (MRL) : modèles qui supportent des dimensions réduites sans perte proportionnelle de qualité (OpenAI text-embedding-3-* l'implémente nativement)
Comparaison de performances sur benchmarks MTEB
Snapshot : données consultées en janvier 2025. Les scores MTEB, les prix et les modèles disponibles évoluent rapidement — vérifier le MTEB Leaderboard avant toute décision. Ne pas adosser un choix produit à ce tableau seul.
| Modèle | MTEB (mean) | Dim. | Tokens max | Coût/M tokens | Source |
|---|---|---|---|---|---|
| text-embedding-3-large | 64.6 | 3072 | 8191 | $0.13 | MTEB Jan 2025 |
| text-embedding-3-small | 62.3 | 1536 | 8191 | $0.02 | MTEB Jan 2025 |
| BAAI/bge-large-en-v1.5 | 63.9 | 1024 | 512 | Gratuit (local) | MTEB Jan 2025 |
| E5-mistral-7b-instruct | 66.6 | 4096 | 32768 | Gratuit (local) | MTEB Jan 2025 |
| BGE-M3 | 65.0 | 1024 | 8192 | Gratuit (local) | MTEB Jan 2025 |
| voyage-large-2 | 67.1 | 1536 | 16000 | $0.12 | MTEB Jan 2025 |
| jina-embeddings-v3 | 65.9 | 1024 | 8192 | $0.02 | MTEB Jan 2025 |
Recommandations pratiques
-
Évaluez sur vos données, pas sur les leaderboards : un jeu de test propriétaire de 200-500 paires (requête, document pertinent) est systématiquement plus prédictif qu'un benchmark générique. Un modèle classé 3ème sur MTEB peut être meilleur que le 1er sur votre corpus spécifique. Construire cet eval set avant de choisir un modèle est la décision la plus rentable du projet.
-
Pour les systèmes budget-contraints :
bge-large-en-v1.5hébergé localement offre le meilleur rapport qualité/coût. Pas de coût marginal, 512 tokens max est suffisant pour la plupart des chunks bien conçus. -
Pour les systèmes haute précision : combinez
voyage-large-2ouE5-mistralpour le bi-encoder avec un cross-encoderms-marcopour le re-ranking. Ajoutez ColBERT si le budget le permet. -
Pour le multilingue :
multilingual-e5-largeouBGE-M3— ce dernier étant particulièrement robuste sur les requêtes mixtes langues. -
Dimensionnalité : ne réduisez les dimensions que si la contrainte est réelle (coût de stockage, latence). Avec MRL, préférez une réduction native plutôt qu'une PCA post-hoc.
La stratégie d'embedding est un investissement long terme. Migrer un index de production est coûteux — faites le bon choix dès la conception.