Módulo 4: Búsqueda por Proximidad

2. kNN Conceptual: K Vecinos Más Cercanos

Descripción

El algoritmo kNN (k-Nearest Neighbors) es la base conceptual de toda búsqueda por proximidad: dados N vectores, encuentra los K más cercanos a la query. Aquí verás cómo funciona conceptualmente y por qué la búsqueda exhaustiva (revisar todos los vectores) no escala.


¿Qué es kNN?

Definición: Dado un vector query, encontrar los K vectores más cercanos (vecinos) en un conjunto de datos.

Ejemplo:

Dataset: 1 millón de vectores (documentos)
Query: "animal doméstico"
K = 10

Resultado: Los 10 documentos con mayor similaridad coseno

Búsqueda exhaustiva (fuerza bruta)

Algoritmo:

1. Para cada vector en el dataset:
     Calcular similaridad(query, vector)
2. Ordenar todos los vectores por similaridad
3. Retornar los top-K

Ejemplo con 5 vectores:

Query: [2, 3]

Vectores:
A = [2, 3]   → similaridad = 1.00
B = [3, 4]   → similaridad = 0.99
C = [1, 5]   → similaridad = 0.85
D = [9, 1]   → similaridad = 0.35
E = [0, -2]  → similaridad = -0.12

Top-3: A, B, C ✅

Complejidad de búsqueda exhaustiva

Operaciones por query:

  • N cálculos de similaridad (N = tamaño del dataset)
  • Ordenar N resultados

Complejidad: O(N × d) donde d = dimensionalidad (1536 para OpenAI)

Problemas de escalabilidad:

DatasetCálculos por queryTiempo (estimado)
1,000 vectores1,000~1ms ✅
100,000100,000~100ms ⚠️
1M1,000,000~1s ❌
10M10,000,000~10s ❌
100M100,000,000~100s ❌

Conclusión: Búsqueda exhaustiva NO escala para millones de vectores.


¿Por qué no escala?

Problema 1: Demasiados cálculos

Con 10M vectores y 1536 dimensiones:

10M × 1536 = 15.36 mil millones de operaciones por query

Incluso con hardware rápido, toma segundos.


Problema 2: Latencia inaceptable

En producción:

  • Búsqueda debe responder en < 100ms (idealmente < 50ms)
  • Búsqueda exhaustiva con 10M vectores → 10+ segundos

La solución: Búsqueda aproximada

Idea: No revisar TODOS los vectores. Usar estructura de datos inteligente que permite "saltar" a regiones relevantes del espacio.

Trade-off:

  • ✅ Mucho más rápido (1000x-10000x)
  • ⚠️ Puede perder algunos resultados (~1-5% error)

¿Por qué es aceptable?

Si los "verdaderos" top-10 son:

1. Doc A (score 0.95)
2. Doc B (score 0.94)
3. Doc C (score 0.93)
...
10. Doc J (score 0.85)

Y el índice aproximado retorna:

1. Doc A (score 0.95) ✅
2. Doc B (score 0.94) ✅
3. Doc D (score 0.92) ← Doc C perdido, pero D es casi igual
...
10. Doc K (score 0.84) ← Doc J perdido, pero K es casi igual

Los usuarios no notarían la diferencia (Doc D es casi tan bueno como Doc C).


Tipos de índices aproximados

1. HNSW (Hierarchical Navigable Small World)

  • Grafo jerárquico
  • Muy rápido, ~99% precisión
  • Más memoria

2. IVF (Inverted File Index)

  • Clustering + búsqueda en clusters
  • Rápido, ~95-98% precisión
  • Menos memoria

3. LSH (Locality-Sensitive Hashing)

  • Hashing especial
  • Muy rápido, menor precisión
  • Menos usado en producción moderna

Verás cada uno en detalle en cápsulas siguientes.


Resumen

Puntos clave:

  • kNN: Encontrar K vecinos más cercanos
  • Exhaustivo: O(N × d) → No escala a millones
  • Aproximado: 1000x más rápido con ~1-5% error
  • Trade-off aceptable: Velocidad > perfección para UX

Próxima cápsula: 03-search-indexes.md — Tipos de índices, comparación.