Capítulo 3: Depuración de pipelines RAG
Modos de fallo comunes
1. Se recuperan documentos incorrectos
Síntomas: El LLM da respuestas incorrectas o irrelevantes
Causas:
- Tamaño de fragmento inadecuado
- Modelo de embedding incorrecto
- Filtros de metadatos ausentes
Soluciones:
# Verifique qué se está recuperando
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. El LLM ignora el contexto
Síntomas: La respuesta no refleja los documentos recuperados
Causas:
- Problemas con la plantilla de prompt
- Contexto demasiado largo
- Contexto no formateado claramente
Soluciones:
# Mejor estructura de prompt
prompt = """
CONTEXT (use this information to answer):
{context}
QUESTION: {question}
INSTRUCTIONS: Answer ONLY using the context above.
If the context doesn't contain the answer, say "I don't know."
ANSWER:"""
3. Alucinaciones
Síntomas: Respuestas seguras pero incorrectas
Causas:
- Se recuperaron documentos incorrectos
- El LLM extrapola más allá del contexto
Soluciones:
- Mejorar la calidad de la recuperación
- Usar prompts de fundamentación explícitos
- Bajar la temperatura
Trazado con LangSmith
from langsmith import Client
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-key"
# Ahora todas las llamadas de LangChain son trazadas
# Vea en smith.langchain.com
Lista de verificación para depuración
| Paso | Verificar | Herramienta |
|---|---|---|
| 1 | ¿Embeddings funcionan? | Probar consulta de embedding |
| 2 | ¿Se recuperan los documentos correctos? | Imprimir documentos recuperados |
| 3 | ¿El contexto cabe en el prompt? | Verificar número de tokens |
| 4 | ¿El LLM ve el contexto? | Imprimir prompt completo |
| 5 | ¿La respuesta está fundamentada? | Comparar con el contexto |
Optimización de rendimiento
Reducir latencia
# Recuperación asíncrona
async def fast_rag(query):
# Embedding y recuperación en paralelo
embedding_task = embed_async(query)
embedding = await embedding_task
docs = await retrieve_async(embedding)
return await generate_async(query, docs)
Reducir costos
- Utilice modelos más pequeños cuando sea posible
- Cachee consultas frecuentes
- Procese embeddings en lotes
- Limite el tamaño del contexto