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 desplegar y olvidar
- Conclusión
- Fuentes
Actualizado: 2026-07-07
Tras dos años de RAG en producción, los patrones que separan sistemas fiables de los fallidos son claros: el chunking semántico mejora el retrieval, hybrid search (BM25 + vectorial) recupera lo que lo vectorial puro pierde, el re-ranking eleva la precisión un 15-30%, y sin evaluación continua con un golden dataset cualquier mejora es un placebo.
Tras dos años de RAG en producción, los patrones que separan despliegues 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, para un filtrado 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[1]: – 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[2] 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 token
La 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 desplegar 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.