Módulo 4: Búsqueda por Proximidad
7. Ejercicio Integrador: Diseñar Estrategia de Búsqueda
Descripción del ejercicio
Este es el ejercicio integrador del Módulo 4. Aquí vas a aplicar todo lo visto: dado un caso de uso (tamaño de dataset, requisitos de latencia y precisión), decidirás qué índice usar, qué parámetros configurar, y justificarás tus decisiones.
Parte 1: Casos de uso
Para cada caso, decide:
- ¿Qué índice usar? (Brute force, HNSW, IVF, IVF-PQ)
- ¿Qué parámetros configurar?
- ¿Qué precisión y latencia esperas?
Caso 1: Blog personal
Contexto:
- 1,000 artículos
- Búsqueda semántica en el blog
- Tráfico bajo (10 queries/día)
Requisitos:
- Latencia: < 500ms aceptable
- Precisión: Alta preferida
- Budget: Mínimo (hosting barato)
Ver solución
Índice: Brute force
Justificación:
- 1,000 vectores → Brute force es ~10ms (muy rápido)
- Sin inversión en índice complejo
- Precisión 100% garantizada
- Tráfico bajo → No necesita optimización extrema
Implementación: Vector database simple o incluso cálculos in-memory.
Caso 2: E-commerce con catálogo mediano
Contexto:
- 200,000 productos
- Búsqueda semántica de productos
- Tráfico medio (1,000 queries/día)
Requisitos:
- Latencia: < 100ms
- Precisión: ~98%
- Budget: Medio
Ver solución
Índice: HNSW
Parámetros:
ef_construction = 200
M = 32
ef_search = 100
Esperado:
- Latencia: ~20-30ms
- Precisión: ~98%
- Memoria: ~600K vectores equivalentes (3x)
Justificación:
- 200K vectores → Sweet spot para HNSW
- Latencia y precisión cumplen requisitos
- Costo moderado de infraestructura
Vector database: Weaviate o Qdrant (HNSW por defecto)
Caso 3: Empresa con documentación masiva
Contexto:
- 50 millones de documentos internos
- Búsqueda semántica para empleados
- Tráfico alto (100,000 queries/día)
Requisitos:
- Latencia: < 50ms
- Precisión: ~95% aceptable
- Budget memoria: Limitado
Ver solución
Índice: IVF con Product Quantization (IVF-PQ)
Parámetros:
nlist = 7000 (sqrt(50M) aprox)
nprobe = 15
PQ compression = 8x
Esperado:
- Latencia: ~30-40ms
- Precisión: ~94-96%
- Memoria: ~6.25M vectores equivalentes (compresión 8x)
Justificación:
- 50M vectores → HNSW sería costosísimo en memoria
- IVF-PQ comprime 8x → Viable económicamente
- Precisión ~95% es aceptable (los "perdidos" son marginales)
Vector database: FAISS o Milvus (soporte completo IVF-PQ)
Parte 2: Ajustar parámetros
Escenario:
Tienes un sistema HNSW con:
Dataset: 5M vectores
ef_construction = 200
M = 32
ef_search = 100
Resultados actuales:
- Latencia: 25ms (promedio)
- Precisión: 98%
Pregunta 2.1:
Usuario se queja de que búsqueda es "lenta" (espera < 15ms). ¿Qué ajustas?
Ver solución
Ajuste: Reducir ef_search
ef_search = 50 (de 100)
Esperado:
- Latencia: ~15ms ✅
- Precisión: ~96% (ligera caída)
Justificación: Menos nodos explorados → Más rápido, ligeramente menos preciso. Trade-off aceptable si 96% es suficiente.
Pregunta 2.2:
Usuario reporta que algunos resultados relevantes no aparecen. ¿Qué ajustas?
Ver solución
Ajuste: Aumentar ef_search
ef_search = 200 (de 100)
Esperado:
- Latencia: ~40ms (más lento)
- Precisión: ~99% ✅
Justificación: Más nodos explorados → Mayor probabilidad de encontrar todos los top-K. Usuario prefiere precisión sobre velocidad.
Parte 3: Escalabilidad
Pregunta 3.1:
Tu sistema tiene actualmente 1M vectores con HNSW. Estimas crecer a 10M en 6 meses. ¿Qué planeas?
Ver reflexión
Opción A: Mantener HNSW
- Ventaja: Misma precisión (~99%)
- Desventaja: Memoria crece 10x (costoso)
- Requiere: Upgrade de infraestructura
Opción B: Migrar a IVF-PQ
- Ventaja: Memoria crece menos (compresión)
- Desventaja: Precisión cae a ~95%
- Requiere: Rebuild completo del índice
Decisión: Depende de presupuesto vs requisitos de precisión.
Recomendación: Empezar planificación de migración a IVF si presupuesto es limitado.
Pregunta 3.2:
Actualmente insertas 10,000 vectores nuevos/día. ¿Cómo manejas inserciones?
Ver reflexión
Con HNSW:
Opción 1 (incremental): Insertar directamente
- Problema: Calidad del grafo degrada con el tiempo
- Solución: Rebuild periódico (ej: cada semana)
Opción 2 (batch): Acumular inserciones, rebuild 1x/semana
- Ventaja: Calidad del grafo óptima
- Desventaja: Nuevos vectores no disponibles inmediatamente
Con IVF:
Insertar directamente (reasignar a cluster)
- Más fácil que HNSW
- Re-clustering periódico (ej: cada mes)
Decisión típica: Batch semanal con HNSW (balance calidad-frecuencia).
Parte 4: Debugging
Problema: Latencia alta (200ms vs esperado 30ms)
Posibles causas:
- ef_search demasiado alto
- Dataset mucho más grande de lo esperado
- Cold start (primer query después de deployment)
- Índice no cargado en memoria (leyendo de disco)
¿Cómo investigas?
Ver guía
Paso 1: Verificar tamaño de dataset
Si dataset creció de 1M a 10M → Esperado que sea más lento
Paso 2: Revisar configuración
ef_search = 500 → Demasiado alto, reducir a 100
Paso 3: Warm-up
Hacer queries dummy después de deployment
Paso 4: Monitorear memoria
Si índice no cabe en RAM → Swap to disk → Lento
Solución: Upgrade RAM o usar IVF-PQ (compresión)
Resumen del ejercicio
Lo que hiciste:
- ✅ Decidiste índices para 3 casos de uso
- ✅ Ajustaste parámetros según requisitos
- ✅ Planeaste escalabilidad (1M → 10M)
- ✅ Debuggeaste problemas comunes
Intuición consolidada:
"No hay un índice perfecto para todo. La decisión depende de tamaño, latencia, precisión y presupuesto. HNSW es el sweet spot para mayoría de casos (100K-10M); IVF-PQ para escala masiva."
Conclusión del Módulo 4
Felicidades por completar el Módulo 4: Búsqueda por Proximidad. 🎉
Lo que lograste:
- ✅ Entiendes el problema de búsqueda en millones de vectores
- ✅ Conoces kNN conceptualmente
- ✅ Comparas índices (exactos vs aproximados)
- ✅ Entiendes HNSW (grafos jerárquicos)
- ✅ Entiendes IVF (clustering)
- ✅ Decides qué índice usar según caso
- ✅ Ajustas parámetros para optimizar
Intuición clave del módulo:
Vector databases no hacen búsqueda exhaustiva (lenta). Usan índices aproximados (HNSW, IVF) que son 1000x más rápidos con ~95-99% precisión. El trade-off (velocidad vs perfección) es aceptable en producción.
Próximo módulo: Módulo 5: Keyword vs Semantic Search — Comparar búsqueda tradicional vs vectorial, cuándo usar cada una.