Optimización de sistemas RAG: equilibrio entre precisión de recuperación y calidad de generación

Usuario pregunta «cómo restablecer contraseña»; el sistema devuelve «requisitos de complejidad» y «configuración de seguridad». Brecha semántica + debilidad en match exacto + chunks que cortan contexto.
Reescritura de query +15%-25%; Hybrid +30%-50% recall; chunk semántico +11% vs fijo. Este artículo recorre query, híbrido, rerank, chunking y evaluación con marco precisión-latencia.
1. Tres cuellos de botella RAG
Antes de tocar Embedding o vector DB, entiende el problema compuesto.
Brecha semántica
«El sistema se cayó» vs «recuperación ante anomalía del servicio». El embedding no lee mentes.
Caso banco: «tarjeta congelada» → devolvió «proceso de bloqueo/perdida». Tras mapear «congelada» → «gestión de bloqueo de cuenta», recall mejoró.
Match exacto
Vector fuerte en semántica, débil en exactitud.
«Ventas Q3 2024» vs «tercer trimestre 2024»: OK. «Trimestre con más ventas»: necesita agregación, no solo similitud.
«OAuth 2.0» vs «OAuth 1.0»: cercanos en espacio vectorial, protocolos distintos.
Informe Tencent Cloud 2026: solo vector ~60-70% en dominios pro; híbrido >80%.
Contexto fragmentado
Chunk fijo puede partir firma y cuerpo de función.
«La desventaja es…» en un chunk; el detalle en otro → respuesta incompleta.
Diagnóstico antes de medicina.
2. Procesamiento de Query
Entender la intención
«¿Cómo se usa esto?» sin contexto es ambiguo. Usa historial y página actual.
Dimensiones:
- Intención (uso, fallo, comparación)
- Entidades (producto, versión, fecha)
- Condiciones implícitas (rol, entorno)
«Fallo al resetear contraseña» → fallo + reset + ya intentó reset.
Etiquetar intención
Etiquetas: «cuenta», «pago», «fallo técnico», «consulta función». Clasificar y buscar solo en subconjunto.
VectorHub: +15-25% precisión; mis pruebas ~20%.
from langchain_core.runnables import RunnableLambda
def classify_intent(query: str) -> str:
# Ejemplo simple: coincidencia por palabras clave
if "contraseña" in query or "inicio de sesión" in query:
return "cuenta"
elif "pago" in query or "reembolso" in query:
return "pago"
return "consulta_general"
intent_chain = RunnableLambda(classify_intent)
En producción, LLM para clasificar — más preciso, más costo.
Plantillas de reescritura
| Pregunta original | Reescrita |
|---|---|
| ¿Cómo se usa? | Pasos de uso de [producto] |
| ¿Por qué error? | Causa y solución de [error] |
| ¿Hay atajo? | Atajos de [función] |
Dominio fijo: plantillas mantenibles. Abierto: LLM en tiempo real.
3. Búsqueda híbrida + rerank
Por qué una sola vía no basta
Vector = lector semántico; BM25 = lector literal. Juntos cubren ambos.
Tres fases: BM25 → vector → rerank
- BM25: recall ancho por keywords
- Vector: complemento semántico
- Cross-Encoder: score fino query-documento
Dasroot: Hybrid + RRF + rerank +30-50% recall vs solo vector.
RRF
RRF_score = 1/(k + rank_BM25) + 1/(k + rank_vector)
k ≈ 60.
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
from langchain_community.vectorstores import FAISS
bm25_retriever = BM25Retriever.from_documents(documents)
vector_retriever = FAISS.from_documents(documents, embeddings).as_retriever()
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6]
)
Más peso BM25 en docs con keywords claros; más vector en FAQ y discusiones.
Rerank Cross-Encoder
+~2% precisión, +~100 ms por candidato.
300-500 ms aceptables → añade rerank. Tiempo real estricto → solo Hybrid.
Mide primero Hybrid; añade rerank si falta recall.
4. Chunking y metadatos
Semántico vs fijo
RecursiveCharacterTextSplitter:
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=150,
separators=["\n\n", "\n", ". ", " ", ""]
)
CSDN: 62% fijo vs 73% semántico (+11 pp).
Solapamiento
150-200 tokens de overlap → +25% recall (CSDN y pruebas propias). Demasiado overlap = ruido y costo.
Filtro por metadatos
results = vectorstore.similarity_search(
query="proceso de reembolso",
filter={"year": 2024, "category": "finanzas"}
)
Eficiencia y calidad cuando hay taxonomía clara.
5. Generación y evaluación
Contexto al LLM
No volcar todo: fusionar, deduplicar, priorizar entidades (NER).
Ventana deslizante e importancia (TF-IDF/BM25) en generación: mejora marginal ~3-5%.
Ragas
| Métrica | Significado | Objetivo |
|---|---|---|
| Faithfulness | Respuesta fiel al contexto | ≥ 0,80 |
| Context Precision | Relevancia del retrieval | ≥ 0,70 |
| Context Recall | Cobertura | ≥ 0,75 |
| Answer Relevance | Responde la pregunta | ≥ 0,80 |
from ragas import evaluate
from ragas.metrics import faithfulness, context_precision, answer_relevance
results = evaluate(
dataset=eval_dataset,
metrics=[faithfulness, context_precision, answer_relevance]
)
Ciclo cerrado
- Baseline Ragas pre-lanzamiento
- Re-evaluar tras cada cambio
- Muestreo online
- Siguiente ajuste según métrica débil
Conclusión
Conocimiento dinámico → RAG. Estable → considera fine-tuning.
Latencia estricta → Hybrid sin rerank. Precisión prioritaria → + Cross-Encoder.
Empieza por Ragas: Precision baja → retrieval; Faithfulness baja → contexto/generación.
No hay bala de plata; con métricas sabes hacia dónde avanzas.
FAQ
¿Problema de recuperación más común en RAG?
¿Por qué Hybrid Search supera solo vector?
¿Impacto del chunking?
¿Vale Cross-Encoder rerank?
¿Cómo leer métricas Ragas?
¿RAG o fine-tuning?
4 min de lectura · Publicado el: 21 abr 2026 · Actualizado el: 21 ago 2026
Guía de ingeniería RAG
Si llegaste desde búsqueda, lo más rápido es ir al artículo anterior o siguiente de esta misma serie.
Anterior
Selección de bases de datos vectoriales para RAG: comparación en profundidad entre Pinecone, Weaviate y Milvus
Guía de selección de bases de datos vectoriales para RAG: comparación en profundidad de la arquitectura, el rendimiento, los precios y los escenarios de uso de Pinecone, Weaviate y Milvus. Incluye código de integración con LangChain y fórmulas de cálculo de costos reales para elegir el motor de recuperación adecuado para tu aplicación de IA.
Parte 2 de 5
Siguiente
Enrutamiento de consultas RAG en la práctica: colaboración multi-vectorial y distribución inteligente de recuperación
Guía práctica de enrutamiento de consultas RAG: comparación sistemática de enrutamiento lógico, semántico y EnsembleRetriever, con implementación completa en LangChain, incluyendo estrategias de optimización de costos como Semantic Caching y Tiered Retrieval.
Parte 4 de 5



Comentarios
Inicia sesión con GitHub para dejar un comentario