?
SkillavancéVérifié le 2025-05

RAG avancé : query expansion et HyDE

Techniques avancées pour améliorer la qualité du retrieval sur des questions complexes.

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.

Sources

RAGHyDEquery-expansion