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.