Búsqueda eficiente de trillones de vectores: un desafío

Fuentes: Querying 3 billion vectors

Este artículo explora el desafío de realizar búsquedas de similitud vectorial a gran escala, específicamente con 3 mil millones de vectores. El problema surge al intentar encontrar elementos semánticamente similares, una técnica crucial en aplicaciones como búsqueda, recomendaciones y recuperación generativa (como se ve en plataformas como Cursor). Inicialmente, el autor implementó una solución ingenua que comparaba cada uno de los vectores de consulta con todos los vectores de documento, lo que resultó extremadamente lento, incluso con un conjunto de datos reducido de solo 3.000 vectores. La operación básica, el cálculo del producto punto, era el cuello de botella principal.

Para optimizar el rendimiento, el autor aplicó la vectorización de NumPy, una técnica que permite realizar operaciones en matrices enteras de manera eficiente, en lugar de iterar elemento por elemento. Esta simple optimización redujo drásticamente el tiempo de ejecución de 2 segundos a solo 0.01 segundos para el conjunto de datos reducido. A pesar de esta mejora significativa, escalar a 3 millones de vectores aún requirió 12 segundos. Una optimización adicional, el uso del tipo de dato np.float32 en lugar de np.float64, mejoró aún más el rendimiento.

El artículo luego aborda el problema de la memoria (OOM - Out of Memory). Calcular el producto punto entre 3 mil millones de vectores, cada uno con 768 dimensiones y utilizando np.float32 (4 bytes por elemento), requiere aproximadamente 8.6 TB de memoria, lo que supera la capacidad de la mayoría de los sistemas. Para superar esta limitación, el autor menciona la necesidad de implementar técnicas más avanzadas, como las sugeridas por Jeff Dean, que implican el uso de técnicas de procesamiento distribuido, como MapReduce, y el uso de generadores para procesar los datos en lotes más pequeños, evitando así la carga completa de los datos en la memoria. La solución ideal implicaría dividir el problema en partes más pequeñas y procesarlas en paralelo, posiblemente utilizando un clúster de máquinas.