Chapitre 2 : Multi-requête et Fusion
Récupération Multi-requête
Générez plusieurs variations de requêtes, récupérez pour chacune, combinez les résultats :
from langchain.retrievers.multi_query import MultiQueryRetriever
# Créer un récupérateur multi-requête
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)
# Génère automatiquement des variations
results = retriever.get_relevant_documents(
"Quels sont les avantages de RAG ?"
)
Exemple de Variations Générées
Original : "Quels sont les avantages de RAG ?"
Généré :
1. "Quels avantages RAG offre-t-il par rapport aux LLM traditionnels ?"
2. "Pourquoi devrais-je utiliser la génération augmentée par récupération ?"
3. "Comment RAG améliore-t-il la performance des systèmes d'IA ?"
Fusion RAG
Technique avancée combinant multi-requête avec fusion de rang réciproque :
def rag_fusion(query, llm, retriever, num_queries=4):
# Étape 1 : Générer des variations de requête
queries = generate_query_variations(query, llm, num_queries)
# Étape 2 : Récupérer pour chaque requête
all_results = []
for q in [query] + queries:
results = retriever.get_relevant_documents(q)
all_results.append(results)
# Étape 3 : Fusion de Rang Réciproque
fused = reciprocal_rank_fusion(all_results)
return fused[:5] # Top 5 résultats fusionnés
Avantages
| Avantage | Description |
|---|---|
| Couverture | Différents angles trouvent différents documents |
| Robustesse | Moins sensible à la formulation des requêtes |
| Qualité | La RRF promeut des documents constamment pertinents |
Quand Utiliser
✅ Utilisez la multi-requête lorsque :
- Les requêtes sont complexes ou multi-facettes
- Les utilisateurs expriment les choses différemment
- Un rappel plus élevé est nécessaire
❌ Évitez lorsque :
- La latence est critique
- Les requêtes sont simples et claires
- Le coût est une préoccupation