RAG en producción: patrones que funcionan y los que no
Índice de contenidos
- Puntos clave
- Chunking: no es simple
- Hybrid search: BM25 + vectorial
- Re-ranking: de 100 candidatos a 10 relevantes
- Query transformation: atacar la raíz del retrieval malo
- Metadata filtering: pre-filtrar el espacio de búsqueda
- Evaluación continua: sin esto, todo lo demás es placebo
- Anti-patterns más comunes
- 1. Stuffing de contexto
- 2. Staleness de embeddings
- 3. Sin caché
- 4. Ignorar la latencia
- 5. Sin observabilidad
- Arquitectura de stack de producción típico
- Elección de base de datos vectorial
- Streaming responses
- Monitorización en producción
- Iteración: RAG no es “deploy y olvidar”
- Conclusión
Actualizado: 2026-05-03
Tras dos años de RAG en producción, los patrones que separan deployments exitosos de decepcionantes son claros. Este artículo compila las lecciones — técnicas que funcionan y anti-patterns a evitar — para equipos que ya tienen un RAG básico funcionando y quieren escalar con fiabilidad.
Puntos clave
- El chunking naive de 500 tokens en splits fijos es el error más común y el de mayor impacto en calidad de retrieval.
- Hybrid search (BM25 + vectorial) mejora el recall significativamente frente a solo vectorial — especialmente para nombres propios, códigos y términos exactos.
- Un pipeline de re-ranking reduce el contexto enviado al LLM de top-100 a top-10 con una mejora de precisión del 15-30 %.
- Sin un golden dataset y métricas de evaluación continua, las mejoras son placebos — no se puede optimizar lo que no se mide.
- RAG producción es disciplina de ingeniería, no magia: los patrones son conocidos, la ejecución varía.
Chunking: no es simple
Anti-pattern: chunking naive con splits fijos de 500 tokens, ignorando la estructura del documento.
Patrones que funcionan:
- Semantic chunking: split por fronteras semánticas, no por número de tokens.
- Hierarchical chunks: documento → secciones → párrafos, permitiendo retrieval a múltiples niveles de granularidad.
- Overlap estratégico: 10-20 % de overlap entre chunks para preservar contexto en los límites.
- Metadata-rich: tags, autor, fecha, sección por chunk — permite filtering eficaz.
Librerías: LangChain RecursiveCharacterTextSplitter, LlamaIndex SentenceSplitter, implementaciones custom según el tipo de documento.
Hybrid search: BM25 + vectorial
El search solo vectorial falla en casos de exact-match: SKUs de producto, nombres propios, códigos de error, términos técnicos poco frecuentes. La combinación:
- BM25 (keyword, exact match) + vectorial (semántico).
- Reciprocal Rank Fusion (RRF): merge de resultados de ambas vías.
- Resultado: recall significativamente mejor que cualquiera de las dos vías por separado.
Elasticsearch, OpenSearch, Weaviate y Qdrant ofrecen hybrid search nativo. Para el contexto de elección de base de datos vectorial, ver pgvector: madurez en 2024.
Re-ranking: de 100 candidatos a 10 relevantes
El pipeline estándar en producción madura:
- Retrieval: top-100 con embeddings (recall alto, precisión moderada).
- Re-ranking: cross-encoder (Cohere Rerank, BGE-reranker) → top-10 (precisión alta).
- Generación LLM con los top-10 en el contexto.
Mejora de precisión típica: 15-30 %. El re-ranking añade latencia (50-150 ms), pero el trade-off vale la pena para respuestas críticas.
Query transformation: atacar la raíz del retrieval malo
Las queries mal formuladas del usuario producen retrieval malo. Técnicas:
- HyDE (Hypothetical Document Embeddings): generar una respuesta hipotética, embeddearla y buscar con ella — el embedding de la respuesta es más cercano al embedding de documentos relevantes que el de la pregunta.
- Query expansion: añadir sinónimos y términos relacionados.
- Sub-queries: descomponer preguntas complejas en múltiples sub-búsquedas.
- Query classification: routear a índices o estrategias distintas según el tipo de pregunta.
El LLM puede hacer todas estas transformaciones en un paso pre-retrieval.
Metadata filtering: pre-filtrar el espacio de búsqueda
results = vectorstore.similarity_search(
query,
filter={"department": "engineering", "date": {"$gt": "2024-01-01"}}
)Filtrar antes del retrieval es más rápido y más relevante que buscar en todo el índice y filtrar después. Metadata bien diseñada al momento del chunking es la base — no se puede filtrar por lo que no se indexó.
Evaluación continua: sin esto, todo lo demás es placebo
Golden dataset: 100-500 pares query-respuesta curados manualmente, representativos de los casos de uso reales.
Métricas Ragas: – Faithfulness: ¿la respuesta está soportada por el contexto recuperado? – Answer relevance: ¿la respuesta responde la pregunta? – Context precision: ¿los chunks recuperados son relevantes?
Proceso:
- Evaluar contra golden dataset antes de cualquier cambio.
- A/B testing al cambiar componentes (modelo de embedding, chunking strategy, re-ranker).
- Human review periódica de una muestra de respuestas en producción.
- Dashboard continuo de métricas — el drift en calidad de retrieval es silencioso.
Sin evaluación, las mejoras son placebo. La mayoría de equipos que reportan “mejorar el RAG” no tienen métricas de línea base.
Anti-patterns más comunes
1. Stuffing de contexto
Enviar 20 chunks al LLM produce el efecto “lost in the middle”: el modelo ignora información relevante en el centro del contexto. Mejor: top-5 relevantes, forzar citación explícita.
2. Staleness de embeddings
Cambiar el modelo de embedding sin re-indexar el corpus produce inconsistencias silenciosas. Mejor: re-indexar completo o mantener consistencia estricta del modelo por versión del índice.
3. Sin caché
Las mismas queries repetidas generan el mismo coste de LLM repetidamente:
- Embedding cache: Redis por texto de query — el embedding de “¿cuánto cuesta el plan básico?” siempre es el mismo.
- Result cache: por query + filtros activos.
4. Ignorar la latencia
El target de producción es <2 s total. Retrieve + re-rank + LLM puede excederlo fácilmente:
- Paralelizar el retrieval con un prefetch de contexto al LLM.
- Streaming de la respuesta del LLM para mejorar la latencia percibida.
- Caché agresiva en los steps más lentos.
5. Sin observabilidad
Loguear query + chunks recuperados + respuesta generada. Revisar semanalmente. Sin datos, la iteración es ciega. Herramientas como Langfuse o Arize Phoenix permiten trazabilidad completa del pipeline.
Arquitectura de stack de producción típico
[Query del usuario]
↓
[Query analysis + transformation (HyDE, expansion)]
↓
[Hybrid search] → [Vector DB + BM25]
↓
[Re-ranker (cross-encoder)]
↓
[LLM con contexto top-10 + citación forzada]
↓
[Respuesta]Caché en cada step donde aplica. Para el componente de orquestación de agents que consultan el RAG, ver CrewAI: equipos de agentes.
Elección de base de datos vectorial
| Base de datos | Cuándo elegirla |
|---|---|
| pgvector | Si ya usas Postgres — la mayoría de casos |
| Qdrant | Purpose-built, alto rendimiento, soporte hybrid |
| Weaviate | Hybrid nativo, más features out-of-the-box |
| Pinecone | Managed serverless, simple, más caro |
| Elasticsearch / OpenSearch | Hybrid maduro, ya en el stack |
Decisión práctica: pgvector por defecto; base vectorial especializada si la escala lo requiere o si el hybrid search nativo es un requisito duro.
Streaming responses
# Retrieve primero
chunks = retriever.get_relevant_documents(query)
# Stream la respuesta del LLM
for token in llm.stream(prompt_with_context):
yield tokenLa latencia percibida mejora significativamente con streaming — el usuario ve la primera palabra antes de que la respuesta completa esté lista.
Monitorización en producción
Métricas a trackear:
- Retrieval recall: % de queries que recuperaron un documento relevante (requiere ground truth).
- Answer accuracy: vía Ragas sobre muestra.
- Latencia p50/p95/p99 del pipeline completo.
- Token usage por query.
- Coste por query.
- Satisfacción del usuario: thumbs up/down cuando aplica.
Dashboard continuo para detectar drift. La calidad del RAG no es estable — los documentos del corpus cambian, las queries de los usuarios evolucionan, los modelos se actualizan.
Iteración: RAG no es “deploy y olvidar”
- Añadir nuevos documentos continuamente con re-indexación incremental.
- Re-evaluar periódicamente contra el golden dataset.
- Actualizar la estrategia de chunking basándose en los failures más comunes.
- Intercambiar componentes (LLM, modelo de embeddings, re-ranker) cuando emergen mejores opciones — ver text-embedding-3 de OpenAI para el impacto en calidad de retrieval.
Conclusión
RAG en producción es disciplina de ingeniería, no magia. Los patrones son conocidos; la ejecución varía. Los equipos exitosos invierten en evaluación, observabilidad e iteración desde el principio. Los equipos que fallan despliegan “basic RAG” y esperan perfección. Para proyectos nuevos: aplicar estos patrones desde el día 1 es más barato que rearquitectar. Para sistemas existentes: auditar contra esta lista y priorizar las mejoras por impacto esperado.