En esta guía, aprenderás a:
- Obtener una breve introducción a la búsqueda vectorial
- Conocer vecinos más cercanos aproximados (ANN) y Hierarchical Navigable Small World (HNSW)
- Conocer bit cuantizado (QBit)
- Usar QBit para realizar búsquedas vectoriales con el conjunto de datos DBPedia
Introducción a la búsqueda vectorial
Comprender los embeddings
embedding dado:
Vecinos más cercanos aproximados (ANN)
Cuantización
- Mantener la copia cuantizada junto a la columna original - Esto duplica el almacenamiento, pero es una opción segura porque siempre podemos volver a la precisión completa
- Reemplazar por completo los valores originales (convirtiéndolos a un tipo menor durante la inserción) - Esto ahorra espacio y E/S, pero no tiene vuelta atrás
Hierarchical Navigable Small World (HNSW)
Comparación de enfoques
Profundización en QBit
Bit cuantizado (QBit)
BFloat16, Float32 y Float64 aprovechando la forma en que se representan los números de coma flotante: como bits.
En lugar de almacenar cada número completo, QBit divide los valores en planos de bits: el primer bit de cada valor, el segundo, el tercero, y así sucesivamente.
Este enfoque resuelve la principal limitación de la cuantización tradicional. No hace falta almacenar datos duplicados ni arriesgarse a que los valores pierdan significado. Además, evita los cuellos de botella de RAM de HNSW, ya que QBit trabaja directamente con los datos almacenados en lugar de mantener un índice en memoria.
LimitaciónAunque QBit acelera la búsqueda vectorial, su complejidad computacional sigue siendo O(n). En otras palabras: si tu conjunto de datos es lo bastante pequeño como para que un índice HNSW quepa cómodamente en RAM, esa sigue siendo la opción más rápida.
El tipo de dato
FixedString(N) independiente: cadenas de longitud fija de N bytes almacenadas consecutivamente en memoria, sin separadores entre ellas. Todos esos grupos se agrupan luego en una sola Tuple, que constituye la estructura subyacente de QBit.
Ejemplo: Si partimos de un vector de 8 elementos Float64, cada grupo contendrá 8 bits. Como un Float64 tiene 64 bits, terminamos con 64 grupos (uno por cada bit). Por lo tanto, la disposición interna de QBit(Float64, 8) se asemeja a una Tuple de 64 columnas FixedString(1).
El cálculo de la distancia
L2DistanceTransposed con un parámetro de precisión:
Optimización de E/S
Optimización del cálculo
Optimización de BFloat16
Complejidad de Float64
Ejemplo con DBpedia
Configuración
Consulta de búsqueda
Comparar el rendimiento con la búsqueda por fuerza bruta
Comparar el rendimiento con la búsqueda por fuerza bruta
Idea clave
Conclusión
Adaptado de la entrada del blog de Raufs Dunamalijevs, publicada el 28 de octubre de 2025