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
Ivf Pq 1
Descomposición dimensional: El algoritmo comienza descomponiendo cada vector de alta dimensión en
msubvectores de igual tamaño. Esta descomposición transforma el espacio original de D dimensiones enmsubespacios disjuntos, donde cada subespacio contiene D/m dimensiones. El parámetromcontrola 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 2nbits de centroides. Por ejemplo, sinbits = 8, cada libro de códigos contendrá 256 centroides. A cada centroide se le asigna un índice único connbitsbits.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.
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 =28 = 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
msubvectores, 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 centroides de 2nbits ), se calculan y almacenan las distancias a todos los centroides.
Esto genera
mtablas de búsqueda, donde cada tabla contiene distancias de 2nbits.
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 búsqueda correspondiente utilizando el índice centroide almacenado.Sume estas distancias
mpara obtener la distancia aproximada basada en un tipo métrico específico (por ejemplo, la distancia euclídea).
Ivf Pq 2
IVF + PQ
El índice IVF_PQ combina los puntos fuertes de IVF y PQ para acelerar las búsquedas. El proceso funciona en dos etapas:
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
anns_field="vector_field", # Vector field 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 |
|
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 |
PQ |
|
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 En la mayoría de los casos, le recomendamos que establezca un valor dentro de este rango: [D/8, D]. |
|
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. Cada libro de códigos contendrá centroides de 2nbits. Por ejemplo, si |
Tipo: Entero Rango: [1, 24] Valor por defecto: |
Un valor más alto de |
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 |
|
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]. |