Módulo 4: Búsqueda por Proximidad

3. Índices de Búsqueda: Exactos vs Aproximados

Descripción

Aquí comparas los tipos principales de índices para búsqueda vectorial: exactos (garantizan encontrar los verdaderos top-K pero lentos) vs aproximados (rápidos pero pueden perder algunos resultados). Entenderás el trade-off fundamental de vector databases.


Clasificación de índices

Índices exactos:

  • Brute force (fuerza bruta): Revisar todos los vectores
  • KD-Tree: Árbol de partición del espacio (NO funciona bien en alta dimensión)
  • Ball Tree: Variante de KD-Tree (tampoco escala bien)

Problema: Todos sufren la "maldición de la dimensionalidad" → Lentos en 1536D.


Índices aproximados (ANN - Approximate Nearest Neighbors):

  • HNSW: Grafo navegable jerárquico ⭐ (más usado)
  • IVF: Clustering + búsqueda en clusters
  • LSH: Locality-Sensitive Hashing
  • ScaNN: Google's optimized ANN (variante avanzada)
  • ANNOY: Spotify's ANN (árboles aleatorios)

Ventaja: Escalan a millones/miles de millones de vectores.


Comparación: Exacto vs Aproximado

AspectoExacto (brute force)Aproximado (HNSW/IVF)
Precisión100% ✅~95-99% ⚠️
VelocidadO(N) - Lento ❌O(log N) - Rápido ✅
MemoriaBaja (solo vectores)Media-Alta (índice extra)
EscalabilidadHasta ~100K ⚠️Millones/miles de millones ✅
Build timeNingunoMinutos-horas (una vez)
Uso típicoDatasets pequeñosProducción (millones vectores)

¿Cuándo usar cada uno?

Usa búsqueda exacta cuando:

  • Dataset < 100,000 vectores
  • Latencia no es crítica (> 500ms aceptable)
  • Necesitas garantía 100% de los top-K correctos

Ejemplo: Búsqueda en biblioteca personal (10K documentos).


Usa búsqueda aproximada cuando:

  • Dataset > 100,000 vectores
  • Latencia crítica (< 100ms requerido)
  • 95-99% precisión es suficiente (casi siempre lo es)

Ejemplo: Semantic search en producción (millones de documentos).


Parámetros de precisión vs velocidad

Los índices aproximados permiten ajustar el trade-off:

HNSW:

ef_search = 50  → Rápido, ~95% precisión
ef_search = 200 → Lento, ~99% precisión

IVF:

nprobe = 1   → Muy rápido, ~90% precisión
nprobe = 10  → Rápido, ~95% precisión
nprobe = 100 → Lento, ~99% precisión

Principio: Más búsqueda → Más precisión → Más tiempo.


Visualización del trade-off

Precisión
   ↑
100%|    • Brute force
    |
 99%|         • HNSW (ef=200)
    |
 95%|              • HNSW (ef=50)
    |                   • IVF (nprobe=10)
 90%|                        • LSH
    |
    └─────────────────────────────→ Velocidad
      Lento                   Rápido

Sweet spot típico: ~98% precisión con velocidad 1000x más rápida que brute force.


Construcción del índice

Brute force: No necesita construcción (solo guardar vectores).

Índices aproximados: Requieren "construcción" (build time):

1. Tomar todos los vectores del dataset
2. Construir estructura de datos (grafo, clusters, hashes)
3. Guardar índice en disco/memoria

Tiempo: Minutos-horas dependiendo de tamaño
Frecuencia: Una vez (o cuando agregues muchos vectores nuevos)

Importante: Build time es una inversión inicial. Después, las queries son muy rápidas.


Índices en vector databases

Pinecone:

  • Usa HNSW por defecto
  • Configuración automática (no ajustas parámetros manualmente)

Weaviate:

  • HNSW por defecto
  • Opción de configurar ef_construction, ef_search

Qdrant:

  • HNSW optimizado
  • Control fino de parámetros

FAISS (Facebook):

  • Múltiples índices (IVF, HNSW, PQ, etc.)
  • Requiere configuración manual

Milvus:

  • Soporte para HNSW, IVF, ANNOY, ScaNN
  • Configurable según caso de uso

Resumen

Puntos clave:

  • Exacto: 100% precisión, no escala (< 100K vectores)
  • Aproximado: 95-99% precisión, escala a millones ✅
  • Trade-off ajustable: Precisión vs velocidad (parámetros)
  • Producción: Casi siempre aproximado (HNSW o IVF)
  • Build time: Inversión inicial, queries después muy rápidas

Próxima cápsula: 04-hnsw-and-graphs.md — Cómo funciona HNSW (el índice más usado).