IVF_SQ8
El índice IVF_SQ8 es un algoritmo de indexación basado en la cuantización, diseñado para afrontar los retos de la búsqueda de similitudes a gran escala. Este tipo de índice consigue búsquedas más rápidas con una huella de memoria mucho menor en comparación con los métodos de búsqueda exhaustiva.
Descripción general
El índice IVF_SQ8 se basa en dos componentes clave:
Archivo invertido (IVF): Organiza los datos en clusters, permitiendo al algoritmo de búsqueda centrarse sólo en los subconjuntos de vectores más relevantes.
Cuantización escalar (SQ8): Comprime los vectores a una forma más compacta, reduciendo drásticamente el uso de memoria y manteniendo al mismo tiempo la precisión suficiente para realizar cálculos rápidos de similitud.
IVF
IVF es como crear un índice en un libro. En lugar de escanear cada página (o, en nuestro caso, cada vector), se buscan palabras clave específicas (clusters) en el índice para encontrar rápidamente las páginas (vectores) relevantes. En nuestro caso, los vectores se agrupan en clusters, y el algoritmo buscará dentro de unos pocos clusters que estén cerca del vector de consulta.
El funcionamiento es el siguiente
Agrupación: El conjunto de datos vectoriales se divide en un número determinado de clusters, utilizando un algoritmo de agrupación como k-means. Cada cluster tiene un centroide (un vector representativo del cluster).
Asignación: Cada vector se asigna al cluster cuyo centroide está más próximo a él.
Índice invertido: Se crea un índice que asigna el centroide de cada cluster a la lista de vectores asignados a ese cluster.
Búsqueda: Cuando se buscan los vecinos más cercanos, el algoritmo de búsqueda compara el vector de consulta con los centroides de los clústeres y selecciona el clúster o clústeres más prometedores. A continuación, la búsqueda se reduce a los vectores que se encuentran dentro de esos clusters seleccionados.
Para obtener más información sobre los detalles técnicos, consulte IVF_FLAT.
SQ8
La cuantificación escalar (SQ) es una técnica utilizada para reducir el tamaño de vectores de alta dimensión sustituyendo sus valores por representaciones más pequeñas y compactas. La variante SQ8 utiliza enteros de 8 bits en lugar de los típicos números en coma flotante de 32 bits para almacenar el valor de cada dimensión de un vector. Esto reduce enormemente la cantidad de memoria necesaria para almacenar los datos.
A continuación se explica cómo funciona SQ8:
Identificación de rangos: En primer lugar, se identifican los valores mínimo y máximo dentro del vector. Este rango define los límites para la cuantización.
Normalización: Normalice los valores del vector a un rango entre 0 y 1 utilizando la fórmula:
Esto asegura que todos los valores se mapean proporcionalmente dentro de un rango estandarizado, preparándolos para la compresión.
Compresión de 8 bits: Multiplique el valor normalizado por 255 (el valor máximo para un entero de 8 bits) y redondee el resultado al entero más cercano. Esto comprime cada valor en una representación de 8 bits.
Supongamos que tiene un valor de dimensión de 1,2, con un valor mínimo de -1,7 y un valor máximo de 2,3. La siguiente figura muestra cómo se aplica SQ8 para convertir un valor float32 en un entero int8.
Ivf Sq8
IVF + SQ8
El índice IVF_SQ8 combina IVF y SQ8 para realizar búsquedas de similitud de forma eficiente:
IVF reduce el ámbito de búsqueda: El conjunto de datos se divide en clusters, y cuando se realiza una consulta, IVF compara primero la consulta con los centroides de los clusters, seleccionando los clusters más relevantes.
SQ8 acelera el cálculo de distancias: Dentro de los clusters seleccionados, SQ8 comprime los vectores en enteros de 8 bits, lo que reduce el uso de memoria y acelera los cálculos de distancia.
Al utilizar IVF para centrar la búsqueda y SQ8 para acelerar los cálculos, IVF_SQ8 consigue tanto tiempos de búsqueda rápidos como eficiencia de memoria.
Crear un índice
Para construir un índice IVF_SQ8 en un campo vectorial en Milvus, utilice el método add_index(), especificando el index_type, metric_type, y parámetros adicionales para el índice.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_SQ8", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 64, # Number of clusters to create using the k-means algorithm during index building
} # Index building params
)
En esta configuración:
index_type: El tipo de índice a construir. En este ejemplo, establezca el valorIVF_SQ8.metric_type: El método utilizado para calcular la distancia entre vectores. Los valores soportados incluyenCOSINE,L2, yIP. Para más detalles, consulte Tipos de métricas.params: Opciones de configuración adicionales para construir el índice.nlist: Número de conglomerados que se crearán utilizando el algoritmo k-means durante la construcción del índice.
Para conocer más parámetros de construcción disponibles para el índice
IVF_SQ8, consulte Parámetros de construcción del índice.
Una vez configurados los parámetros del índice, puede crear el índice utilizando directamente el método create_index() o pasando los parámetros del índice en el método create_collection. Para más detalles, consulte Crear colección.
Búsqueda en el índice
Una vez creado el índice e insertadas las entidades, puede realizar búsquedas de similitud en el índice.
search_params = {
"params": {
"nprobe": 8, # Number of clusters to search for candidates
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=10, # TopK results to return
search_params=search_params
)
En esta configuración:
params: Opciones de configuración adicionales para la búsqueda en el índice.nprobe: Número de clusters para buscar candidatos.
Para conocer más parámetros de búsqueda disponibles para el índice
IVF_SQ8, consulte Parámetros de búsqueda específicos del índice.
Parámetros del índice
En esta sección se ofrece una descripción general de los parámetros utilizados para crear un índice y realizar búsquedas en él.
Parámetros de creación de índices
La siguiente tabla enumera los parámetros que pueden configurarse en params al crear un índice.
Parámetro |
Descripción |
Rango de valores |
Sugerencia de ajuste |
|
|---|---|---|---|---|
IVF |
|
El número de clusters a crear usando el algoritmo k-means durante la construcción del índice. |
Tipo: Entero Rango: [1, 65536] Valor por defecto: |
Los valores mayores de |
Parámetros de búsqueda específicos del índice
La siguiente tabla enumera los parámetros que pueden configurarse en search_params.params al buscar en el índice.
Parámetro |
Descripción |
Rango de valores |
Sugerencia de ajuste |
|
|---|---|---|---|---|
IVF |
|
El número de clusters para buscar candidatos. |
Tipo: Entero Rango: [1, nlist] Valor por defecto: |
Los valores más altos permiten buscar en más conglomerados, lo que mejora la recuperación al ampliar el alcance de la búsqueda, pero a costa de aumentar la latencia de la consulta. Establezca En la mayoría de los casos, se recomienda establecer un valor dentro de este rango: [1, nlist]. |