HNSW_PQ
HNSW_PQ aprovecha los gráficos Hierarchical Navigable Small World (HNSW) con Product Quantization (PQ), creando un método avanzado de indexación vectorial que ofrece un equilibrio controlable entre tamaño y precisión. En comparación con HNSW_SQ, este tipo de índice ofrece una mayor tasa de recuperación con el mismo nivel de compresión, aunque con una menor velocidad de procesamiento de consultas y un mayor tiempo de construcción del índice.
Resumen
HNSW_PQ combina dos técnicas de indexación: HNSW para una navegación rápida basada en grafos y PQ para una compresión vectorial eficiente.
HNSW
HNSW construye un grafo multicapa en el que cada nodo corresponde a un vector del conjunto de datos. En este grafo, los nodos se conectan en función de su similitud, lo que permite recorrer rápidamente el espacio de datos. La estructura jerárquica permite al algoritmo de búsqueda reducir el número de vecinos candidatos, lo que acelera considerablemente el proceso de búsqueda en espacios de gran dimensión.
Para más información, consulte HNSW.
PQ
PQ es una técnica de compresión vectorial que descompone los vectores de alta dimensión en subvectores más pequeños, que luego se cuantizan y comprimen. La compresión reduce drásticamente los requisitos de memoria y acelera los cálculos de distancia.
Para más información, consulte IVF_PQ.
HNSW + PQ
HNSW_PQ combina los puntos fuertes de HNSW y PQ para permitir una búsqueda aproximada eficiente del vecino más próximo. Utiliza PQ para comprimir los datos (reduciendo así el uso de memoria) y, a continuación, construye un grafo HNSW sobre estos vectores comprimidos para permitir una rápida recuperación de candidatos. Durante la búsqueda, el algoritmo puede refinar opcionalmente los resultados de los candidatos utilizando datos de mayor precisión para mejorar la exactitud. A continuación se explica cómo funciona el proceso:
Compresión de datos: PQ divide cada vector en varios subvectores y los cuantifica utilizando un libro de códigos de centroides, controlado por parámetros como
m(recuento de subvectores) ynbits(bits por subvector).Construcción de gráficos: Los vectores comprimidos se utilizan para construir un gráfico HNSW. Como los vectores se almacenan de forma comprimida, el gráfico resultante suele ser más pequeño, requiere menos memoria y puede recorrerse más rápidamente, lo que acelera significativamente el paso de recuperación de candidatos.
Recuperación de candidatos: Cuando se ejecuta una consulta, el algoritmo utiliza los datos comprimidos en el grafo HNSW para identificar de forma eficiente un grupo de vecinos candidatos. Esta búsqueda basada en el gráfico reduce drásticamente el número de vectores que deben tenerse en cuenta, lo que mejora la latencia de la consulta en comparación con las búsquedas de fuerza bruta.
(Opcional) Perfeccionamiento de resultados: Los resultados candidatos iniciales pueden refinarse para obtener una mayor precisión, basándose en los siguientes parámetros:
refine: Controla si se activa este paso de refinamiento. Si se establece entrue, el sistema recalcula las distancias utilizando representaciones de mayor precisión o sin comprimir.refine_type: Especifica el nivel de precisión de los datos utilizados durante el refinamiento (por ejemplo, SQ6, SQ8, BF16). Una elección de mayor precisión, comoFP32, puede producir resultados más precisos, pero requiere más memoria. Debe superar la precisión del conjunto de datos comprimido original ensq_type.refine_k: Actúa como factor de ampliación. Por ejemplo, si su k superior es 100 yrefine_kes 2, el sistema vuelve a clasificar los 200 candidatos superiores y devuelve los 100 mejores, mejorando la precisión general.
Para obtener una lista completa de parámetros y valores válidos, consulte Parámetros del índice.
Crear un índice
Para construir un índice HNSW_PQ sobre un campo vectorial en Milvus, utilice el método add_index(), especificando los parámetros 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="HNSW_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": 30, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
"m": 384,
"nbits": 8,
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
En esta configuración:
index_type: El tipo de índice a construir. En este ejemplo, establezca el valorHNSW_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. Para más información, consulte Parámetros de creación de índices.
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": {
"ef": 10, # Parameter controlling query time/accuracy trade-off
"refine_k": 1 # The magnification factor
}
}
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. Para obtener más información, consulte Parámetros de búsqueda específicos del índice.
Parámetros del índice
Esta sección proporciona una visión general de los parámetros utilizados para construir un índice y realizar búsquedas en el índice.
Parámetros de creación de índices
En la siguiente tabla se enumeran los parámetros que se pueden configurar en params al crear un índice.
Parámetro |
Descripción |
Rango de valores |
Sugerencia de ajuste |
|
|---|---|---|---|---|
HNSW |
|
Número máximo de conexiones (o aristas) que puede tener cada nodo en el grafo, incluyendo tanto las aristas salientes como las entrantes. Este parámetro afecta directamente tanto a la construcción del índice como a la búsqueda. |
Tipo: Entero Rango: [2, 2048] Valor por defecto: |
Un valor mayor de Considere reducir En la mayoría de los casos, se recomienda establecer un valor dentro de este rango: [5, 100]. |
|
Número de vecinos candidatos considerados para la conexión durante la construcción del índice. Se evalúa un conjunto mayor de candidatos para cada elemento nuevo, pero el número máximo de conexiones realmente establecidas sigue estando limitado por |
Tipo: Entero Rango: [1, int_max] Valor por defecto: |
Un Considere la posibilidad de reducir En la mayoría de los casos, se recomienda establecer un valor dentro de este intervalo: [50, 500]. |
|
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 |
|
|
Un indicador booleano que controla si se aplica un paso de refinamiento durante la búsqueda. El refinamiento consiste en volver a clasificar los resultados iniciales calculando las distancias exactas entre el vector de consulta y los candidatos. |
Tipo: Booleano Rango: [ Valor por defecto: |
Establezca |
|
|
Determina la precisión de los datos utilizados durante el proceso de refinamiento. Esta precisión debe ser superior a la de los vectores comprimidos (como se establece en los parámetros |
Tipo: Cadena Rango:[ Valor por defecto: Ninguno |
Utilice |
Parámetros de búsqueda específicos del índice
La siguiente tabla enumera los parámetros que pueden configurarse en search_params.params cuando se realizan búsquedas en el índice.
Parámetro |
Descripción |
Rango de valores |
Sugerencia de ajuste |
|
|---|---|---|---|---|
HNSW |
|
Controla la amplitud de la búsqueda durante la recuperación del vecino más cercano. Determina cuántos nodos son visitados y evaluados como vecinos más cercanos potenciales. Este parámetro sólo afecta al proceso de búsqueda y se aplica exclusivamente a la capa inferior del gráfico. |
Tipo: Integer Rango: [1, int_max] Valor por defecto: limit (TopK vecinos más cercanos a devolver) |
Un valor mayor de Considere la posibilidad de reducir En la mayoría de los casos, se recomienda establecer un valor dentro de este rango: [K, 10K]. |
PQ |
|
El factor de ampliación que controla cuántos candidatos adicionales se examinan durante la etapa de refinamiento (reordenación), en relación con los K resultados principales solicitados. |
Tipo: Float Rango: [1, float_max) Valor por defecto: 1 |
Los valores más altos de |