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
| Aspecto | Exacto (brute force) | Aproximado (HNSW/IVF) |
|---|---|---|
| Precisión | 100% ✅ | ~95-99% ⚠️ |
| Velocidad | O(N) - Lento ❌ | O(log N) - Rápido ✅ |
| Memoria | Baja (solo vectores) | Media-Alta (índice extra) |
| Escalabilidad | Hasta ~100K ⚠️ | Millones/miles de millones ✅ |
| Build time | Ninguno | Minutos-horas (una vez) |
| Uso típico | Datasets pequeños | Producció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).