Cambiar tema

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

Easton editorial illustration: multi-tenant AI service platform

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.

62%
Precisión chunk fijo
500 tokens
73%
Precisión chunk semántico
Límites de párrafo
11%
Diferencia
Una variable
Source: Datos de prueba

«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 originalReescrita
¿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

  1. BM25: recall ancho por keywords
  2. Vector: complemento semántico
  3. 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étricaSignificadoObjetivo
FaithfulnessRespuesta fiel al contexto≥ 0,80
Context PrecisionRelevancia del retrieval≥ 0,70
Context RecallCobertura≥ 0,75
Answer RelevanceResponde 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

  1. Baseline Ragas pre-lanzamiento
  2. Re-evaluar tras cada cambio
  3. Muestreo online
  4. 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?
Brecha semántica: «el sistema se cayó» vs «procedimiento de recuperación ante anomalía del servicio». Relacionados en significado, distintos en palabras; el vector puede fallar.
¿Por qué Hybrid Search supera solo vector?
Vector = semántica; BM25 = keywords exactos. BM25 recupera términos, vector añade similitud; RRF fusiona. Recall +30%-50% en pruebas.
¿Impacto del chunking?
Grande. Mismo doc: fijo 500 tokens 62% precisión, semántico 73% (+11 pp). Solapamiento 150-200 tokens +25% recall.
¿Vale Cross-Encoder rerank?
Según latencia. +~2% precisión, +~100 ms. Consultoría 300-500 ms: sí. Chat en tiempo real: solo Hybrid.
¿Cómo leer métricas Ragas?
Faithfulness ≥0,80; Context Precision ≥0,70; Context Recall ≥0,75; Answer Relevance ≥0,80. Bajo Precision → retrieval; bajo Faithfulness → generación/contexto.
¿RAG o fine-tuning?
Conocimiento dinámico (noticias, anuncios) → RAG. Dominio estable (ley, normas) → fine-tuning. Empresas suelen combinar: RAG dinámico + fine-tuning de estilo.

4 min de lectura · Publicado el: 21 abr 2026 · Actualizado el: 21 ago 2026

Comentarios

Inicia sesión con GitHub para dejar un comentario

Easton BlogEaston Blog