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:

Scann Exploración

  1. 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.

  2. 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.

  3. 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 valor SCANN.

  • metric_type: El método utilizado para calcular la distancia entre vectores. Los valores soportados incluyen COSINE, L2, y IP. 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

nlist

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.

with_raw_data

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: true, false

Valor por defecto: true

Establezca true para una mayor precisión de búsqueda y cuando el espacio de almacenamiento no sea una preocupación primordial. Los datos vectoriales originales permiten realizar cálculos de similitud más precisos durante la reclasificación.

Establezca false para reducir la sobrecarga de almacenamiento y el uso de memoria, especialmente para grandes conjuntos de datos. Sin embargo, esto puede reducir ligeramente la precisión de la búsqueda, ya que la fase de reclasificación utilizará vectores cuantizados.

Recomendado: Utilice true para aplicaciones de producción en las que la precisión sea fundamental.

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

reorder_k

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 reorder_k suele aumentar la precisión de la búsqueda, ya que se tienen en cuenta más candidatos durante la fase final de refinamiento. Sin embargo, esto también aumenta el tiempo de búsqueda debido al cálculo adicional.

Considere la posibilidad de aumentar reorder_k cuando sea fundamental lograr una alta recuperación y la velocidad de búsqueda sea menos importante. Un buen punto de partida es de 2 a 5 veces el limit deseado (TopK resultados a devolver).

Considere la posibilidad de reducir reorder_k para dar prioridad a las búsquedas más rápidas, especialmente en situaciones en las que es aceptable una ligera reducción de la precisión.

En la mayoría de los casos, le recomendamos que establezca un valor dentro de este rango:[límite, límite * 5].

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].

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

¿Fue útil esta página?