Módulo 6: Diseño de Sistemas de Búsqueda
4. Query Processing: De Query a Resultados
Descripción
Query processing es la fase online: convertir la query del usuario en resultados relevantes. Cubre embedding de query, búsqueda kNN, reranking, y optimización de latencia.
Flujo de query processing
User Query
↓
1. Query embedding (OpenAI API)
↓
2. kNN search (Vector DB)
↓
3. Metadata filtering (opcional)
↓
4. Reranking (opcional)
↓
5. Top-K resultados
Paso 1: Query embedding
Input: Query del usuario (texto)
Output: Vector 1536D (o 768D, 3072D según modelo)
Ejemplo:
Query: "cómo implementar RAG con Pinecone"
→ OpenAI API (text-embedding-3-small)
→ [0.23, -0.45, 0.12, ..., -0.34]
Latencia: 50-200ms (OpenAI API)
Paso 2: kNN search
Input: Query embedding
Output: Top-K candidatos (k=100 típico)
Ejemplo Pinecone:
Query embedding: [0.23, -0.45, ...]
Index: "production-docs"
Top-K: 100
Filters: {"source": "guia-rag.pdf"}
→ Retorna 100 chunks con mayor coseno
Latencia: 10-50ms (con HNSW)
Paso 3: Metadata filtering
¿Qué es?
Filtrar resultados por metadata ANTES o DESPUÉS de kNN.
Pre-filtering (antes de kNN):
1. Filtrar por metadata: source = "guia-rag.pdf"
2. kNN solo en ese subconjunto
Ventaja: Más rápido (busca en subconjunto).
Desventaja: Si filtro es muy restrictivo, pocos resultados.
Post-filtering (después de kNN):
1. kNN retorna top-100
2. Filtrar top-100 por metadata
Ventaja: Garantiza K resultados.
Desventaja: Puede descartar buenos candidatos.
Paso 4: Reranking
¿Por qué reranking?
Problema:
kNN retorna top-100 basado en coseno
→ Pero coseno es similaridad de embeddings
→ NO considera interacción query-documento específica
Solución: Cross-encoder
Model: ms-marco-MiniLM (especializado en reranking)
Para cada (query, documento):
→ Score de relevancia [0-1]
→ Reordenar top-100 por este score
→ Retornar top-10 final
Ejemplo:
Query: "cómo usar Pinecone"
kNN top-3:
1. Doc A: "Pinecone es un vector database..." (coseno: 0.89)
2. Doc B: "Guía para usar Pinecone paso a paso" (coseno: 0.87)
3. Doc C: "Comparación Pinecone vs Weaviate" (coseno: 0.86)
Cross-encoder:
1. Doc B: Score 0.95 (más relevante: es guía de uso)
2. Doc A: Score 0.75 (definición general)
3. Doc C: Score 0.60 (comparación, no uso directo)
Ranking final:
1. Doc B ✅
2. Doc A
3. Doc C
Latencia: 100-300ms (Cohere Rerank API)
Paso 5: Retornar resultados
Output típico:
{
"query": "cómo usar Pinecone",
"results": [
{
"id": "chunk-456",
"score": 0.95,
"text": "Guía para usar Pinecone...",
"metadata": {
"source": "guia-rag.pdf",
"page": 12
}
},
{
"id": "chunk-123",
"score": 0.75,
"text": "Pinecone es un vector database...",
"metadata": {
"source": "intro.pdf",
"page": 3
}
}
],
"latency_ms": 320
}
Trade-offs
kNN only (sin reranking):
- ✅ Latencia baja (60-250ms)
- ❌ Precisión limitada
kNN + reranking:
- ✅ Mejor precisión (reordena con cross-encoder)
- ❌ Latencia más alta (160-550ms)
Decisión: Usa reranking si precisión > velocidad (ej: búsqueda científica). Omite si velocidad crítica (ej: chat en vivo).
Optimización de latencia
Técnica 1: Cachear embeddings de queries frecuentes
Query: "qué es RAG"
→ Revisar cache
→ Si existe: Usar embedding cacheado (latencia: 0ms)
→ Si NO: Generar embedding (latencia: 50-200ms)
Impacto: 50-200ms ahorrados en queries repetidas.
Técnica 2: Reducir top-K
Top-100 vs Top-50
→ kNN más rápido (menos candidatos a evaluar)
→ Reranking más rápido (menos cross-encoder evaluations)
Trade-off: Menos candidatos → Menor recall.
Técnica 3: Usar reranking selectivo
Si query es simple (1-3 palabras):
→ kNN only
Si query es compleja (pregunta larga):
→ kNN + reranking
Ejemplo completo
Query: "diferencia entre HNSW e IVF"
Paso 1: Embedding
OpenAI API → [0.23, -0.45, ...]
Latencia: 120ms
Paso 2: kNN
Pinecone.query(
vector=[0.23, -0.45, ...],
top_k=100,
filter={"tags": "indexes"}
)
→ 100 candidatos
Latencia: 30ms
Paso 3: Reranking
Cohere Rerank API:
query="diferencia entre HNSW e IVF"
documents=[top-100]
→ Top-10 reordenados
Latencia: 200ms
Paso 4: Retornar
Top-10 resultados
Latencia total: 120 + 30 + 200 = 350ms
Resumen
Puntos clave:
- Query processing: Embedding → kNN → Reranking
- Latencia típica: 160-550ms (con reranking)
- Reranking: Cross-encoder mejora precisión
- Optimización: Cache, reducir top-K, reranking selectivo
Próxima cápsula: 05-ranking-strategies.md — Score fusion, RRF, MMR.