← Volver al Blog
Infraestructura

Operar redes RAG a escala: caché, contrapresión y aislamiento de fallos para pipelines de recuperación

Jonatan M. Collymoore Por Jonatan M. Collymoore • 12 min de lectura

Operar RAG a escala: caché, contrapresión y aislamiento de fallos

La guía anterior, Arquitectura de red para sistemas RAG, estableció la arquitectura de referencia: colocar la base de datos vectorial cerca de la aplicación, mantener las llamadas de embedding, búsqueda vectorial, reranking y LLM dentro de una ruta crítica medida, reutilizar conexiones de larga duración mediante pooling y ejecutar BM25 junto con la recuperación vectorial en paralelo cuando el producto necesita tanto recall como precisión. Esa arquitectura basta para construir un sistema de producción funcional. No basta para mantenerlo estable cuando aumenta la concurrencia, el proveedor de embeddings se ralentiza, el índice vectorial se reconstruye o un tenant ruidoso envía mil solicitudes de recuperación en un minuto.

A escala, las redes RAG dejan de ser un problema de ubicación y se convierten en un problema de plano de control. La pregunta ya no es solo "¿Dónde vive Qdrant, Pinecone o Weaviate?" La pregunta pasa a ser: ¿cómo descarta carga la red de recuperación, reutiliza embeddings costosos, aísla dominios de fallo, evita que los pools de conexiones se estampen y previene que una dependencia lenta consuma todos los workers de agentes? Un pipeline RAG es una cadena de saltos de red, y la cadena falla operativamente cuando un salto no tiene presupuesto, cola, circuit breaker ni fallback local.

Esta guía es el manual operativo para esa siguiente capa: topología de caché, contrapresión, colas, pooling de conexiones de bases de datos vectoriales, fanout de búsqueda híbrida, aislamiento de rerankers, optimización del egreso de embeddings y runbooks de fallo. Asume que el pipeline central ya existe: embed → search → rerank → LLM → response. El objetivo es hacer que ese pipeline sea predecible bajo carga.

El presupuesto de latencia en producción

Un sistema RAG saludable tiene un presupuesto de latencia explícito antes de que el LLM empiece a generar. Como punto de partida ilustrativo, no como estándar universal, los flujos interactivos pueden apuntar a una recuperación por debajo de 500 ms en p95, con un presupuesto extendido cercano a 800 ms cuando se requiere reranking o búsqueda en múltiples índices. Valide estos presupuestos con pruebas de carga específicas de la carga de trabajo, expectativas de los usuarios y SLOs del producto. Si la recuperación tarda dos segundos antes del primer token, los usuarios perciben todo el sistema de IA como lento aunque el modelo transmita rápidamente después.

# Ejemplo de presupuesto de latencia RAG interactivo, p95
query validation/authz        10-25ms
embedding service             50-180ms  # SaaS; 15-60ms con GPU self-hosted
vector search                 20-120ms  # depende de filtros, conteo de shards y tamaño del índice
BM25 search                   15-80ms   # rama paralela, no aditiva si se fusiona correctamente
result merge/fusion            5-25ms
reranker                      60-220ms  # opcional, pero a menudo crítico para la precisión
context assembly              10-40ms
---------------------------------------
retrieval before LLM         170-690ms

Los números importan porque las decisiones de arquitectura de red cambian qué etapas son secuenciales y cuáles pueden ejecutarse en paralelo. El embedding suele ser secuencial: el sistema no puede buscar en un índice vectorial hasta que tiene un vector de consulta. BM25 puede ejecutarse en paralelo con el embedding si solo necesita el texto bruto de la consulta. El reranking es secuencial después de recuperar candidatos, pero puede aislarse en un conjunto más pequeño de candidatos. La generación con LLM queda aguas abajo de todo, salvo que la aplicación transmita una respuesta parcial antes de que termine la recuperación, algo riesgoso para flujos de trabajo factuales.

La red RAG más rápida no es la que tiene menos servicios. Es aquella en la que cada servicio tiene un presupuesto medido, cada llamada costosa se reutiliza y cada dependencia lenta queda impedida de capturar el pool de workers.

Topología: dónde debería vivir cada servicio RAG

La topología recomendada separa el stack RAG en cinco zonas de red: ingreso, runtime de agentes, datos de recuperación, inferencia y egreso. Los límites son importantes porque los sistemas de recuperación manejan documentos sensibles y porque las APIs de embedding a menudo transmiten texto bruto a proveedores externos.

Internet / users
  → ingress gateway / WAF
  → agent runtime zone
      → embedding gateway / cache
      → vector DB zone (Qdrant / Weaviate / Pinecone private endpoint)
      → keyword search zone (OpenSearch / Elasticsearch / Postgres FTS)
      → reranker service zone
      → LLM gateway
  → response stream

Qdrant o Weaviate self-hosted deberían ubicarse en la zona de datos de recuperación, accesibles solo desde runtimes de agentes, trabajos de indexación y sondas de observabilidad. En Kubernetes, esto normalmente implica un namespace dedicado con NetworkPolicies de denegación por defecto e ingreso explícito en los puertos HTTP y gRPC de Qdrant. Para clústeres de alto rendimiento, mantenga la aplicación y los nodos vectoriales en la misma región y, preferiblemente, en la misma zona de disponibilidad, salvo que el requisito de disponibilidad del negocio justifique latencia cross-AZ. Una penalización cross-AZ de 2 a 5 ms parece pequeña hasta que se aplica a cada búsqueda, cada scroll, cada fanout de shard y cada reintento.

Pinecone y Weaviate Cloud deberían alcanzarse mediante conectividad privada cuando esté disponible: PrivateLink, VPC peering o un endpoint privado compatible con el proveedor. Si el acceso por internet público es la única opción, enrute el tráfico a través de un gateway NAT controlado o un proxy de egreso con destinos en allowlist y seguimiento de conexiones separado del egreso general de la aplicación. No permita que el tráfico de recuperación de documentos comparta la misma ruta de salida indiferenciada que descargas de paquetes, automatización de navegador y herramientas arbitrarias de agentes.

BM25 o búsqueda sparse no debería ser una ocurrencia tardía. Si la búsqueda por palabras clave se ejecuta en OpenSearch o Elasticsearch, colóquela cerca de la base de datos vectorial y del runtime de la aplicación. La recuperación híbrida a menudo duplica el número de llamadas backend por consulta de usuario, pero no debería duplicar la latencia si las ramas se ejecutan de forma concurrente y fusionan los resultados después de que ambas devuelvan respuesta.

Pooling de conexiones entre runtimes de agentes y bases de datos vectoriales

Los runtimes de agentes son irregulares. Una sola tarea de usuario puede disparar una llamada de recuperación, mientras que un flujo autónomo puede disparar decenas de llamadas a herramientas, búsquedas de memoria y recuperaciones de seguimiento. Sin pooling, cada recuperación paga establecimiento TCP, negociación TLS, autenticación y calentamiento de conexión. Con pooling agresivo pero sin límites, una ráfaga de agentes puede abrir cientos de streams hacia la base de datos vectorial y hacer que la base parezca poco saludable incluso cuando CPU y disco están bien.

Un punto de partida práctico para un despliegue self-hosted de Qdrant es un cliente compartido por proceso de runtime, keepalive HTTP/2 o gRPC habilitado y un pool dimensionado por concurrencia en lugar de por conteo de CPU:

# Pseudoconfiguración ilustrativa; ajuste con pruebas de carga
max_vector_connections = min(concurrent_agent_workers * 2, 100)
max_inflight_searches_per_worker = 4
connect_timeout_ms = 300
read_timeout_ms = 900
keepalive_time_s = 30
keepalive_timeout_s = 10
retry_budget = 1 retry only for idempotent reads

Para Pinecone y otras bases de datos vectoriales SaaS, el SDK puede ocultar el pool, pero el comportamiento de red sigue existiendo. Inspeccione la reutilización de conexiones en el proxy de egreso o el gateway NAT. Si cada consulta crea una nueva conexión TCP saliente, el SDK está mal configurado, el ciclo de vida del proceso es demasiado corto o la aplicación está instanciando clientes por solicitud. En runtimes de agentes serverless, los cold starts pueden hacerlo inevitable; compénselo agrupando recuperaciones en lotes, usando workers calientes para tenants de alto volumen o añadiendo un servicio gateway de recuperación que mantenga conexiones upstream persistentes.

Optimización del egreso del servicio de embeddings

Las llamadas de embedding son la fuente más común de costo de egreso evitable y latencia evitable. El embedding en tiempo de consulta suele ser pequeño, pero el embedding en tiempo de indexación puede transmitir millones de chunks. Si cada chunk se envía como una solicitud HTTPS individual, el costo de red queda dominado por el overhead de solicitud y el churn de conexiones en lugar de por los bytes del payload.

Use tres controles:

# Pseudocódigo ilustrativo; adáptelo a su implementación
sha256(
  model_id + "\n" +
  chunking_policy_version + "\n" +
  normalized_text
)

# Política de caché
query_embedding_ttl: 15m
document_embedding_ttl: until document_version or model_version changes
negative_cache_for_provider_429: 30-120s jittered

No ignore la selección de región. Un RTT de 70 ms hacia un proveedor de embeddings se paga antes de que pueda empezar la búsqueda vectorial. Si usa OpenAI, Cohere, Voyage u otro proveedor SaaS de embeddings, mida el RTT desde la subred de la aplicación, no desde su laptop. Si aloja embeddings por cuenta propia, coloque el servicio de embeddings cerca del runtime de agentes y dimensione el batching de GPU para que el tiempo de red no desaparezca solo para ser reemplazado por tiempo de cola.

Redes para búsqueda híbrida: paralelas, acotadas y fusionadas

La búsqueda híbrida mejora el recall al combinar coincidencia léxica sparse con similitud vectorial densa. La trampa de red es ejecutar BM25 después de la búsqueda vectorial, o la búsqueda vectorial después de BM25, simplemente porque el código de la aplicación se escribió de forma secuencial. En la mayoría de los sistemas, BM25 puede empezar de inmediato con la consulta en texto bruto mientras la solicitud de embedding está en curso. La búsqueda vectorial empieza tan pronto como vuelve el embedding. Las dos ramas se encuentran después en una etapa de fusión.

t=0ms    start BM25(query text)
t=0ms    start embed(query text)
t=90ms   embedding returns
t=91ms   start vector search(query vector)
t=130ms  BM25 returns
t=170ms  vector search returns
t=175ms  reciprocal-rank fusion
t=180ms  reranker top 40 → top 8
t=330ms  send context to LLM

El fanout debe estar acotado. Defina timeouts independientes para cada rama y fusione resultados parciales cuando una rama no crítica incumpla su presupuesto. Por ejemplo, si BM25 se usa como refuerzo de recall, una respuesta solo vectorial puede ser aceptable cuando OpenSearch está degradado. Si la búsqueda vectorial es la ruta principal de recuperación para preguntas semánticas, el fallback solo con BM25 debería estar claramente marcado o limitarse a flujos donde la evidencia por palabras clave sea suficiente.

Contrapresión y colas

El modo de fallo que derriba sistemas RAG no siempre es una caída. Con más frecuencia es una dependencia lenta que provoca acumulación de solicitudes. Los workers de agentes esperan al embedding. Los pools de conexiones se llenan. Los reintentos multiplican el tráfico. La base de datos vectorial ve búsquedas duplicadas. La cola del reranker crece. Al final, el LLM recibe menos solicitudes, pero la aplicación ya está saturada.

La contrapresión debe existir en cada límite costoso:

# Pseudoconfiguración ilustrativa; no son valores universales
tenant_default_qps: 5
premium_tenant_qps: 25
max_inflight_embeddings_per_tenant: 20
max_inflight_vector_searches_per_collection: 100
reranker_queue_max_depth: 500
retrieval_deadline_ms: 800
serve_partial_if_bm25_missing: true
serve_partial_if_vector_missing: false

Los reintentos necesitan presupuestos. Reintentar una vez cada salto fallido puede duplicar el tráfico durante una caída. Use un solo reintento únicamente para lecturas idempotentes, con jitter, y nunca reintente cuando queden menos de 150 ms en el deadline global de recuperación. Cuando el proveedor devuelva 429, trátelo como una señal de contrapresión, no como un error misterioso. Almacene brevemente esa señal negativa en caché y desacelere a los llamadores.

Patrones de aislamiento de fallos

Una red RAG en producción debería degradarse de forma deliberada. El gateway de recuperación o el runtime de agentes necesita una tabla de decisión para cada dependencia:

Dependency          Failure mode        Response
embedding API       429 / timeout       use cached query embedding if present; otherwise fail fast
vector DB           timeout             try read replica once; otherwise no-answer with explanation
BM25 search         timeout             continue vector-only if confidence threshold met
reranker            saturated           skip rerank; use RRF/top-k with lower confidence
LLM provider        timeout             preserve retrieval trace; retry answer generation only

Las réplicas de lectura de la base de datos vectorial deberían aislarse de la presión de indexación. Si los trabajos de ingesta comparten los mismos nodos y ruta de red que el tráfico de consultas, las operaciones masivas de embedding y upsert pueden degradar la búsqueda orientada al usuario. Use pools de workers separados, claves de API separadas y, cuando sea posible, políticas de red separadas para cargas de indexación y de consulta. En Qdrant, colecciones separadas o réplicas de shards pueden ayudar a aislar tenants; en Pinecone, considere índices separados para cargas ruidosas cuando el aislamiento a nivel de namespace sea insuficiente.

Observabilidad para la red de recuperación

Registre la traza de recuperación para cada solicitud. La traza debería incluir tiempos de embedding, búsqueda vectorial, BM25, fusión, rerank, ensamblaje de contexto y tiempo hasta el primer token del LLM. Agregue p50, p95 y p99 por tenant, colección, modelo, región y proveedor.

{
  "request_id": "rag_01J...",
  "tenant": "acme",
  "embedding_ms": 94,
  "vector_search_ms": 48,
  "bm25_ms": 31,
  "fusion_ms": 6,
  "rerank_ms": 126,
  "context_tokens": 6420,
  "retrieval_total_ms": 323,
  "vector_pool_wait_ms": 4,
  "egress_region": "us-east-1",
  "fallbacks": []
}

La alerta más útil no es "RAG va lento". Alerte sobre indicadores adelantados. Los umbrales iniciales ilustrativos incluyen tiempo de espera del pool de conexiones por encima de 50 ms, tasa de 429 en embeddings por encima del 1 %, profundidad de cola del reranker por encima del 70 % de su límite configurado, p95 de búsqueda vectorial por encima de su presupuesto durante cinco minutos y tasa de timeout de recuperación por encima del 2 %. Son ejemplos, no valores universales, y deberían calibrarse con líneas base observadas, presupuestos de error y SLOs específicos de la carga de trabajo.

Runbook operativo

Cuando la latencia de recuperación aumente bruscamente, siga un orden fijo. Primero, separe el problema por salto. Si el tiempo de embedding es alto, inspeccione el estado del proveedor, el RTT de egreso, el seguimiento de conexiones NAT y la reutilización de clientes. Si la búsqueda vectorial es alta, revise QPS específico de la colección, salud de shards, selectividad de filtros, tamaño de payload y tiempo de espera del pool. Si el reranking es alto, revise profundidad de cola y cantidad de candidatos. Si el LLM empieza tarde pero la recuperación parece normal, inspeccione el ensamblaje de contexto y el tamaño del payload de tokens.

# Lista de triaje
1. Compare retrieval_total_ms vs LLM time-to-first-token.
2. Break retrieval into embed/search/BM25/rerank/context timings.
3. Check pool_wait_ms before blaming the database.
4. Check NAT/egress connection counts before blaming SaaS providers.
5. Disable optional rerank for one tenant or one route, not globally.
6. Reduce top_k and candidate fanout before adding replicas.
7. Confirm indexer jobs are not sharing the query path.
8. Restore normal limits only after p95 is stable for 15 minutes.

Arquitectura de referencia

Una red RAG resiliente a escala moderada puede usar esta línea base:

La arquitectura no es específica de un proveedor. Qdrant, Pinecone y Weaviate difieren en modelo de despliegue, comportamiento de indexación y detalles de SDK, pero las reglas de red son las mismas: ubicar conjuntamente los saltos secuenciales críticos, reutilizar conexiones de larga duración mediante pooling, ejecutar ramas independientes de recuperación en paralelo, acotar el fanout, cachear transformaciones costosas y aislar los fallos antes de que los reintentos los amplifiquen.

Referencias oficiales

Preguntas frecuentes

¿Cuál es el presupuesto de latencia objetivo para la recuperación RAG en producción?

Para sistemas RAG interactivos, 500 ms en p95 puede usarse como objetivo inicial ilustrativo para la recuperación antes de la generación con LLM, con un presupuesto extendido cercano a 800 ms cuando se requiere reranking o búsqueda híbrida en múltiples índices. Mida embedding, búsqueda vectorial, BM25, rerank y ensamblaje de contexto por separado, y calibre el presupuesto final según los SLOs específicos de la carga de trabajo.

¿Cómo deberían dimensionarse los pools de conexiones de bases de datos vectoriales?

Empiece con un cliente compartido por proceso de runtime, conexiones HTTP/2 o gRPC de larga duración y un pool acotado según la concurrencia medida. Ajuste con el tiempo de espera del pool, la latencia p95 de búsqueda vectorial, pruebas de carga y métricas de conexión del lado de la base de datos, no solo con el conteo de CPU.

¿Cómo puede reducirse el egreso de la API de embeddings?

Agrupe chunks de documentos, almacene embeddings en caché por modelo, política de chunking y hash de texto normalizado, use TTL cortos para embeddings de consultas repetidas y enrute el tráfico del proveedor por un gateway de egreso dedicado con límites de tasa y observabilidad. La indexación masiva no debería compartir egreso sin restricciones con el tráfico de consultas orientado al usuario.

¿Cómo deberían conectarse en red BM25 y la búsqueda vectorial híbrida?

Ejecute las ramas de BM25 y embedding/búsqueda vectorial en paralelo siempre que sea posible, y luego fusione los resultados con reciprocal rank fusion o una estrategia similar. Asigne a cada rama su propio timeout y fusione resultados parciales solo cuando el producto pueda tolerar menor recall o precisión degradada.

Conclusión

Los sistemas RAG fallan a escala cuando sus supuestos de red permanecen implícitos. Un prototipo puede sobrevivir con un endpoint de base de datos vectorial, una clave de API de embeddings y unas pocas llamadas de función secuenciales. Un sistema de producción necesita deadlines, pools, cachés, colas y fallbacks. La arquitectura de red es la arquitectura de confiabilidad.

Para equipos que construyen sistemas RAG agénticos, el siguiente paso de madurez es tratar la recuperación como un componente de plataforma de primera clase. Ponga un gateway delante. Asígnele presupuestos. Trace cada salto. Separe el tráfico de consultas del tráfico de indexación. Mantenga visible el egreso de embeddings. Haga que la búsqueda híbrida sea paralela. Sobre todo, decida cómo se degrada el sistema antes de que el primer incidente fuerce la decisión.

¿Necesita infraestructura de IA resiliente?

Null Session Intelligence diseña sistemas de IA y recuperación seguros y medibles para entornos de producción.

Analice su arquitectura