SCANN
Impulsado por la biblioteca ScaNN de Google, el índice SCANN de Milvus está diseñado para abordar los retos de la búsqueda de similitud vectorial a escala, logrando un equilibrio entre velocidad y precisión, incluso en grandes conjuntos de datos que tradicionalmente plantearían retos para la mayoría de los algoritmos de búsqueda.
Visión general
ScaNN está diseñado para resolver uno de los mayores retos de la búsqueda vectorial: encontrar de forma eficiente los vectores más relevantes en espacios de gran dimensión, incluso cuando los conjuntos de datos son cada vez más grandes y complejos. Su arquitectura divide el proceso de búsqueda vectorial en distintas etapas:
Exploración
Partición: Divide el conjunto de datos en clusters. Este método reduce el espacio de búsqueda centrándose sólo en los subconjuntos de datos relevantes en lugar de escanear todo el conjunto de datos, lo que ahorra tiempo y recursos de procesamiento. ScaNN suele utilizar algoritmos de agrupación, como k-means, para identificar los clusters, lo que le permite realizar búsquedas de similitud de forma más eficiente.
Cuantización: ScaNN aplica un proceso de cuantificación conocido como cuantificación vectorial anisotrópica tras la partición. La cuantización tradicional se centra en minimizar la distancia total entre los vectores originales y los comprimidos, lo que no es ideal para tareas como la búsqueda del producto interior máximo (MIPS), en la que la similitud viene determinada por el producto interior de los vectores en lugar de por la distancia directa. En su lugar, la cuantización anisotrópica da prioridad a preservar los componentes paralelos entre vectores, o las partes más importantes para calcular productos internos precisos. Este enfoque permite a ScaNN mantener una alta precisión MIPS alineando cuidadosamente los vectores comprimidos con la consulta, lo que permite realizar búsquedas de similitud más rápidas y precisas.
Reclasificación: La fase de reordenación es el paso final, en el que ScaNN ajusta los resultados de las etapas de partición y cuantificación. Este reordenamiento aplica cálculos precisos del producto interno a los vectores candidatos más importantes, lo que garantiza que los resultados finales sean muy precisos. El reordenamiento es crucial en los motores de recomendación de alta velocidad o en las aplicaciones de búsqueda de imágenes, donde el filtrado y la agrupación iniciales sirven como capa gruesa, y la etapa final garantiza que sólo se devuelvan al usuario los resultados más relevantes.
El rendimiento de SCANN se controla mediante dos parámetros clave que permiten afinar el equilibrio entre velocidad y precisión:
with_raw_data: Controla si los datos vectoriales originales se almacenan junto con las representaciones cuantizadas. La activación de este parámetro mejora la precisión durante la reclasificación, pero aumenta los requisitos de almacenamiento.reorder_k: Determina cuántos candidatos se refinan durante la fase final de reclasificación. Los valores más altos mejoran la precisión pero aumentan la latencia de la búsqueda.
Para obtener información detallada sobre la optimización de estos parámetros para su caso de uso específico, consulte Parámetros del índice.
Crear índice
Para construir un índice SCANN en 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="SCANN", # 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={
"with_raw_data": True, # Whether to hold raw data
} # Index building params
)
En esta configuración:
index_type: El tipo de índice a construir. En este ejemplo, establezca el valorSCANN.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.with_raw_data: Si se almacenan los datos vectoriales originales junto con la representación cuantizada.
Para conocer más parámetros de construcción disponibles para el índice
SCANN, 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 al 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": {
"reorder_k": 10, # Number of candidates to refine
"nprobe": 8 # 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=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.reorder_k: Número de candidatos a refinar durante la fase de reordenación.nprobe: Número de clusters a buscar.
Para conocer más parámetros de búsqueda disponibles para el índice
SCANN, 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
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 |
|---|---|---|---|
|
Número de unidades de clúster |
[1, 65536] |
Una nlist más alta aumenta la eficiencia de la poda y normalmente acelera la búsqueda gruesa, pero las particiones pueden ser demasiado pequeñas, lo que puede reducir la recuperación; una nlist más baja explora clusters más grandes, mejorando la recuperación pero ralentizando la búsqueda. |
|
Si se almacenan los datos vectoriales originales junto con la representación cuantizada. Si esta opción está activada, permite realizar cálculos de similitud más precisos durante la fase de reordenación utilizando los vectores originales en lugar de aproximaciones cuantizadas. |
Tipo: Booleano Rango: Valor por defecto: |
Establezca Establezca Recomendado: Utilice |
Parámetros de búsqueda específicos del índice
En la tabla siguiente se enumeran 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 |
|---|---|---|---|
|
Controla el número de vectores candidatos que se refinan durante la fase de reordenación. Este parámetro determina cuántos candidatos principales de las etapas iniciales de partición y cuantificación se reevalúan utilizando cálculos de similitud más precisos. |
Tipo: Entero Rango: [1, int_max] Valor por defecto: Ninguno |
Un valor mayor de Considere la posibilidad de aumentar Considere la posibilidad de reducir En la mayoría de los casos, le recomendamos que establezca un valor dentro de este rango:[límite, límite * 5]. |
|
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 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 En la mayoría de los casos, se recomienda establecer un valor dentro de este rango: [1, nlist]. |