Les systèmes de génération augmentée par récupération (RAG) traditionnels supposent souvent que les documents récupérés sont toujours pertinents par rapport à la requête de l'utilisateur. Cependant, dans des scénarios réels, les récupérateurs peuvent échouer en raison de requêtes ambiguës, de magasins de vecteurs obsolètes ou d'un mauvais alignement des embeddings. Lorsqu'un système RAG génère une réponse basée sur un contexte non pertinent, le résultat est souvent une hallucination. Le RAG correctif (CRAG) s'attaque à ce problème en introduisant une couche d'évaluation automatisée qui évalue la qualité des fragments récupérés et déclenche des mécanismes de secours, tels que des recherches web, si nécessaire.
L'architecture du CRAG
La philosophie fondamentale derrière le CRAG est « évaluer, puis agir ». Au lieu de transmettre aveuglément les documents récupérés au grand modèle de langage (LLM), le CRAG utilise un classifieur léger ou le LLM lui-même pour juger la pertinence des résultats top-k. Ce jugement catégorise généralement la récupération en trois états :
- Correct : Les documents récupérés contiennent suffisamment d'informations pour répondre à la requête. Le système procède avec le RAG standard.
- Ambigu : Les documents peuvent être utiles mais manquent de complétude. Le système peut affiner la recherche ou enrichir le prompt.
- Incorrect : Les documents sont non pertinents. Le système abandonne le contexte local et déclenche une recherche web pour trouver des informations fraîches et fiables.
Implémentation de l'évaluation de la pertinence
Bien que des modèles de classification dédiés puissent être utilisés, une approche courante et efficace pour le CRAG consiste à utiliser le LLM pour effectuer une classification zéro-shot ou few-shot de la qualité de la récupération. Ci-dessous, un exemple en Python utilisant LangChain pour démontrer comment structurer cette logique.
from langchain_community.llms import OpenAI
from langchain.prompts import ChatPromptTemplate
def assess_relevance(query: str, context: str, llm: OpenAI) -> str:
"""
Utilise un LLM pour évaluer si le contexte récupéré est pertinent par rapport à la requête.
Retourne 'Correct', 'Ambiguous' ou 'Incorrect'.
"""
prompt_template = ChatPromptTemplate.from_template(
"""
You are a relevance classifier. Analyze the following query and retrieved context.
Query: {query}
Context: {context}
Determine the relevance of the context to the query.
- Correct: The context directly answers the query.
- Ambiguous: The context is partially relevant but missing key details.
- Incorrect: The context is completely unrelated.
Respond with only one word: Correct, Ambiguous, or Incorrect.
"""
)
chain = prompt_template | llm
return chain.invoke({"query": query, "context": context}).content.strip()
# Example usage logic
query = "What is the latest status of the Paris Agreement?"
retrieved_context = "The Earth is the third planet from the Sun..."
relevance_score = assess_relevance(query, retrieved_context, llm)
if relevance_score == "Incorrect":
# Trigger Web Search Fallback
print("Retrieval failed. Triggering web search...")
# web_search_results = search_engine(query)
# final_context = web_search_results
elif relevance_score == "Ambiguous":
print("Retrieval ambiguous. Augmenting with additional sources...")
else:
print("Retrieval successful. Using local context.")
Le mécanisme de secours par recherche web
Lorsque l'évaluation produit un résultat « Incorrect », le CRAG transfère la charge de la recherche d'informations de la base de données vectorielle statique vers les API de recherche web dynamiques. Cela garantit que le LLM a accès à des données à jour et factuellement précises, réduisant considérablement les taux d'hallucination. Il est crucial de mettre en œuvre la limitation de débit et la mise en cache pour ces recherches web afin de gérer efficacement les coûts et les quotas d'API.
Conclusion
Le RAG correctif représente une étape significative en avant dans la construction d'applications LLM robustes. En ne faisant pas aveuglément confiance au processus de récupération, les développeurs peuvent créer des systèmes qui s'auto-corrigent et s'adaptent aux requêtes utilisateur complexes. L'implémentation du CRAG nécessite des calculs supplémentaires pour l'étape d'évaluation, mais le compromis est une précision et une fiabilité des réponses nettement améliorées, en faisant un motif essentiel pour les pipelines RAG de niveau production.