Chapitre 3 : Débogage des pipelines RAG
Modes d'échec courants
1. Documents incorrects récupérés
Symptômes : LLM donne des réponses incorrectes ou non pertinentes
Causes :
- Taille de fragment inadéquate
- Mauvais modèle d'embedding
- Filtres de métadonnées manquants
Solutions :
# Vérifiez ce qui est récupéré
docs = retriever.get_relevant_documents(query)
for doc in docs:
print(f"Score: {doc.metadata.get('score')}")
print(f"Content: {doc.page_content[:200]}...")
print("---")
2. LLM ignore le contexte
Symptômes : La réponse ne reflète pas les documents récupérés
Causes :
- Problèmes de modèle de prompt
- Contexte trop long
- Contexte mal formaté
Solutions :
# Meilleure structure de prompt
prompt = """
CONTEXTE (utilisez ces informations pour répondre) :
{context}
QUESTION : {question}
INSTRUCTIONS : Répondez UNIQUEMENT en utilisant le contexte ci-dessus.
Si le contexte ne contient pas la réponse, dites "Je ne sais pas."
RÉPONSE :"""
3. Hallucinations
Symptômes : Réponses confiantes mais incorrectes
Causes :
- Documents incorrects récupérés
- LLM extrapolant au-delà du contexte
Solutions :
- Améliorer la qualité de la récupération
- Utiliser des prompts de fondement explicites
- Réduire la température
Traçage avec LangSmith
from langsmith import Client
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-key"
# Maintenant, tous les appels LangChain sont tracés
# Voir sur smith.langchain.com
Liste de vérification pour le débogage
| Étape | Vérification | Outil |
|---|---|---|
| 1 | Embeddings fonctionnent ? | Tester la requête d'embedding |
| 2 | Bons documents récupérés ? | Imprimer les documents récupérés |
| 3 | Contexte adapté au prompt ? | Vérifier le nombre de tokens |
| 4 | LLM voit le contexte ? | Imprimer le prompt complet |
| 5 | Réponse fondée ? | Comparer au contexte |
Optimisation des performances
Réduire la latence
# Récupération asynchrone
async def fast_rag(query):
# Embedding et récupération en parallèle
embedding_task = embed_async(query)
embedding = await embedding_task
docs = await retrieve_async(embedding)
return await generate_async(query, docs)
Réduire les coûts
- Utiliser des modèles plus petits lorsque possible
- Mettre en cache les requêtes fréquentes
- Regrouper les embeddings
- Limiter la taille du contexte