Au-delà du RAG naïf
Le RAG basique (embed query → retrieve → generate) échoue sur les questions complexes, ambiguës ou abstraites. Les techniques avancées transforment la query avant le retrieval pour améliorer la qualité des résultats.
HyDE (Hypothetical Document Embeddings)
Principe : Demander au LLM de générer un document hypothétique qui répondrait à la question, puis utiliser ce document comme requête de recherche.
from langchain.chains import HypotheticalDocumentEmbedder
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
base_embeddings = OpenAIEmbeddings()
hyde = HypotheticalDocumentEmbedder.from_llm(
llm=llm,
base_embeddings=base_embeddings,
prompt_key="web_search" # ou custom prompt
)
# L'embedding est calculé sur le document hypothétique
results = vectorstore.similarity_search_by_vector(
hyde.embed_query("Quels sont les avantages du RAG ?")
)Pourquoi ça fonctionne : Le document hypothétique est plus proche sémantiquement des vrais documents que la question elle-même.
Query Expansion (Multi-Query)
Générer plusieurs variantes de la question pour élargir le retrieval :
from langchain.retrievers.multi_query import MultiQueryRetriever
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=ChatOpenAI(model="gpt-4o")
)
# Génère 3-5 variantes et fusionne les résultats
docs = retriever.invoke("Comment optimiser un pipeline RAG ?")Exemple de variantes générées : - "Quelles sont les meilleures pratiques pour améliorer la performance d'un RAG ?" - "Techniques d'optimisation pour le retrieval augmented generation" - "Comment réduire les hallucinations dans un système RAG ?"
Step-back Prompting pour le RAG
Poser une question plus abstraite avant la question spécifique :
step_back_prompt = """Étant donné cette question spécifique,
formule une question plus générale qui aiderait à y répondre.
Question: {question}
Question générale:"""Permet de récupérer du contexte de fond en plus des détails spécifiques.
Query Decomposition
Décomposer une question complexe en sous-questions :
decompose_prompt = """Décompose cette question en 2-4 sous-questions
indépendantes qui permettront d'y répondre complètement.
Question: {question}
Sous-questions:"""Chaque sous-question récupère ses propres documents, le tout est synthétisé.
Comparatif des techniques
- HyDE : Meilleur pour les questions abstraites, ajoute 1 appel LLM
- Multi-Query : Meilleur pour les questions ambiguës, plus de documents récupérés
- Step-back : Meilleur pour les questions nécessitant du contexte de fond
- Decomposition : Meilleur pour les questions multi-facettes
Recommandation pratique
Combinez Multi-Query + Reranker pour le meilleur rapport qualité/complexité en production.