IVF_PQ
El índice IVF_PQ es un algoritmo de indexación basado en la cuantización para la búsqueda aproximada del vecino más próximo en espacios de alta dimensión. Aunque no es tan rápido como algunos métodos basados en grafos, IVF_PQ suele requerir bastante menos memoria, lo que lo convierte en una opción práctica para grandes conjuntos de datos.
Resumen
IVF_PQ son las siglas de Inverted File with Product Quantization (Archivo invertido con cuantificación de productos), un enfoque híbrido que combina indexación y compresión para una búsqueda y recuperación vectorial eficientes. Aprovecha dos componentes básicos: El archivo invertido (IVF ) y la cuantificación de productos (PQ).
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.
PQ
La cuantificación de productos (PQ) es un método de compresión de vectores de alta dimensión que reduce significativamente los requisitos de almacenamiento y permite realizar rápidas operaciones de búsqueda de similitudes.
El proceso PQ consta de las siguientes etapas
proceso pq-1
- Descomposición dimensional: El algoritmo comienza descomponiendo cada vector de alta dimensión en
m
subvectores de igual tamaño. Esta descomposición transforma el espacio original de D dimensiones enm
subespacios disjuntos, donde cada subespacio contiene D/m dimensiones. El parámetrom
controla la granularidad de la descomposición e influye directamente en la relación de compresión. - Generación del libro de códigos del subespacio: Dentro de cada subespacio, el algoritmo aplica la agrupación k-means para aprender un conjunto de vectores representativos (centroides). Estos centroides forman colectivamente un libro de códigos para ese subespacio. El número de centroides de cada libro de códigos viene determinado por el parámetro
nbits
, donde cada libro de códigos contiene 2^nbits de centroides. Por ejemplo, sinbits = 8
, cada libro de códigos contendrá 256 centroides. A cada centroide se le asigna un índice único connbits
bits. - Cuantificaciónvectorial: Para cada subvector del vector original, PQ identifica su centroide más cercano dentro del subespacio correspondiente utilizando un tipo de métrica específico. Este proceso asigna cada subvector a su vector representativo más cercano en el libro de códigos. En lugar de almacenar todas las coordenadas del subvector, sólo se conserva el índice del centroide correspondiente.
- Representación comprimida: La representación comprimida final consta de
m
índices, uno de cada subespacio, denominados colectivamente códigos PQ. Esta codificación reduce los requisitos de almacenamiento de D × 32 bits (suponiendo números en coma flotante de 32 bits) a m × nbits bits, con lo que se consigue una compresión sustancial al tiempo que se conserva la capacidad de aproximar distancias vectoriales.
Para obtener más información sobre el ajuste y la optimización de los parámetros, consulte Parámetros del índice.
Ejemplo de compresión
Considere un vector con D = 128 dimensiones utilizando números de coma flotante de 32 bits. Con los parámetros PQ m = 64 (subvectores) y nbits = 8 (por tanto k = 2^8 = 256 centroides por subespacio), podemos comparar los requisitos de almacenamiento:
- Vector original: 128 dimensiones × 32 bits = 4.096 bits
- Vector comprimido PQ: 64 subvectores × 8 bits = 512 bits
Esto supone una reducción de 8 veces en los requisitos de almacenamiento.
Cálculo de distancias con PQ
Cuando se realiza una búsqueda de similitud con un vector de consulta, PQ permite un cálculo eficiente de la distancia a través de los siguientes pasos:
Preprocesamiento de la consulta
- El vector de consulta se descompone en
m
subvectores, que coinciden con la estructura de descomposición original de PQ. - Para cada subvector de consulta y su correspondiente libro de códigos (que contiene 2^nbits de centroides), se calculan y almacenan las distancias a todos los centroides.
- Esto genera
m
tablas de búsqueda, donde cada tabla contiene distancias de 2^nbits.
- El vector de consulta se descompone en
Aproximación de distancias
Para cualquier vector de base de datos representado por códigos PQ, su distancia aproximada al vector de consulta se calcula del siguiente modo:
- Para cada uno de los subvectores de
m
, recupere la distancia precalculada de la tabla de consulta correspondiente utilizando el índice centroide almacenado. - Sume estas distancias
m
para obtener la distancia aproximada basada en un tipo métrico específico (por ejemplo, la distancia euclídea).
- Para cada uno de los subvectores de
proceso pq-1
IVF + PQ
El índice IVF_PQ combina los puntos fuertes de IVF y PQ para acelerar las búsquedas. El proceso funciona en dos pasos:
- Filtrado grueso con IVF: IVF particiona el espacio vectorial en clusters, reduciendo el alcance de la búsqueda. En lugar de evaluar todo el conjunto de datos, el algoritmo se centra sólo en los clusters más cercanos al vector de consulta.
- Comparación detallada con PQ: dentro de los conglomerados seleccionados, PQ utiliza representaciones vectoriales comprimidas y cuantizadas para calcular rápidamente distancias aproximadas.
El rendimiento del índice IVF_PQ depende en gran medida de los parámetros que controlan los algoritmos IVF y PQ. El ajuste de estos parámetros es crucial para lograr los resultados óptimos para un conjunto de datos y una aplicación determinados. Encontrará información más detallada sobre estos parámetros y cómo ajustarlos en Parámetros del índice.
Crear índice
Para construir un índice IVF_PQ
sobre un campo vectorial en Milvus, utilice el método add_index()
, especificando los parámetros index_type
, metric_type
, y 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_PQ", # 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={
"m": 4, # Number of sub-vectors to split eahc vector into
} # Index building params
)
En esta configuración:
index_type
: El tipo de índice a construir. En este ejemplo, establezca el valorIVF_PQ
.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.m
: Número de subvectores en los que se divide el vector.
Para conocer más parámetros de construcción disponibles para el índice
IVF_PQ
, consulte Parámetros de construcción del índice.
Una vez configurados los parámetros del índice, puede crear el índice utilizando el método create_index()
directamente 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": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # 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 a buscar.
Para conocer más parámetros de búsqueda disponibles para el índice
IVF_PQ
, 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 | nlist | 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: 128 | Los valores mayores de nlist mejoran la recuperación al crear clusters más refinados, pero aumentan el tiempo de creación del índice. Optimice en función del tamaño del conjunto de datos y de los recursos disponibles.En la mayoría de los casos, se recomienda establecer un valor dentro de este intervalo: [32, 4096]. |
PQ | m | Número de subvectores (utilizados para la cuantificación) en los que se dividirá cada vector de alta dimensión durante el proceso de cuantificación. | Tipo: Entero Rango: [1, 65536] Valor por defecto: Ninguno | Un valor más alto de m puede mejorar la precisión, pero también aumenta la complejidad computacional y el uso de memoria.m debe ser un divisor de la dimensión del vector(D) para garantizar una descomposición adecuada. Un valor comúnmente recomendado es m = D/2.En la mayoría de los casos, le recomendamos que establezca un valor dentro de este rango: [D/8, D]. |
nbits | El número de bits utilizados para representar el índice del centroide de cada subvector en la forma comprimida. Determina directamente el tamaño de cada libro de códigos, que contendrá 2^nbits de centroides. Por ejemplo, si nbits se establece en 8, cada subvector estará representado por un índice centroide de 8 bits. Esto permite 2^8 (256) centroides posibles en el libro de códigos para ese subvector. | Tipo: Entero Rango: [1, 64] Valor por defecto: 8 | Un valor más alto de nbits permite libros de códigos más grandes, lo que potencialmente conduce a representaciones más precisas de los vectores originales. Sin embargo, también implica utilizar más bits para almacenar cada índice, lo que se traduce en una menor compresión.En la mayoría de los casos, recomendamos establecer un valor dentro de este rango: [1, 16]. |
Parámetros de búsqueda específicos de cada índice
En la tabla siguiente se enumeran 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 | nprobe | El número de clusters para buscar candidatos. | Tipo Entero Rango: [1, nlist] Valor por defecto: 8 | Los valores más altos permiten buscar en más grupos, 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 nprobe proporcionalmente a nlist para equilibrar velocidad y precisión.En la mayoría de los casos, se recomienda establecer un valor dentro de este rango: [1, nlist]. |