SCANN

Alimenté par la bibliothèque ScaNN de Google, l'index SCANN de Milvus est conçu pour relever les défis de la recherche de similarité vectorielle à l'échelle, en trouvant un équilibre entre vitesse et précision, même sur de grands ensembles de données qui poseraient traditionnellement des problèmes à la plupart des algorithmes de recherche.

Vue d'ensemble

ScaNN est conçu pour résoudre l'un des plus grands défis de la recherche vectorielle : trouver efficacement les vecteurs les plus pertinents dans des espaces à haute dimension, même lorsque les ensembles de données deviennent plus grands et plus complexes. Son architecture décompose le processus de recherche vectorielle en plusieurs étapes distinctes :

Scann Scann

  1. Partitionnement: Divise l'ensemble de données en grappes. Cette méthode réduit l'espace de recherche en se concentrant uniquement sur les sous-ensembles de données pertinents au lieu d'analyser l'ensemble des données, ce qui permet de gagner du temps et d'économiser des ressources de traitement. ScaNN utilise souvent des algorithmes de regroupement, tels que les k-moyennes, pour identifier les grappes, ce qui lui permet d'effectuer des recherches de similarité plus efficacement.

  2. Quantification: ScaNN applique un processus de quantification connu sous le nom de quantification vectorielle anisotrope après le partitionnement. La quantification traditionnelle se concentre sur la minimisation de la distance globale entre les vecteurs originaux et compressés, ce qui n'est pas idéal pour des tâches telles que la recherche du produit intérieur maximal (MIPS), où la similarité est déterminée par le produit intérieur des vecteurs plutôt que par la distance directe. La quantification anisotrope donne la priorité à la préservation des composantes parallèles entre les vecteurs, c'est-à-dire les parties les plus importantes pour le calcul de produits intérieurs précis. Cette approche permet à ScaNN de maintenir une précision MIPS élevée en alignant soigneusement les vecteurs compressés sur la requête, ce qui permet des recherches de similarité plus rapides et plus précises.

  3. Re-classement: La phase de reclassement est l'étape finale, au cours de laquelle ScaNN affine les résultats de la recherche obtenus lors des étapes de partitionnement et de quantification. Ce reclassement applique des calculs précis de produit intérieur aux meilleurs vecteurs candidats, ce qui garantit la précision des résultats finaux. Le reclassement est crucial dans les moteurs de recommandation à grande vitesse ou dans les applications de recherche d'images où le filtrage et le regroupement initiaux servent de couche grossière et où l'étape finale garantit que seuls les résultats les plus pertinents sont renvoyés à l'utilisateur.

Les performances de SCANN sont contrôlées par deux paramètres clés qui vous permettent d'affiner l'équilibre entre vitesse et précision :

  • with_raw_data: Contrôle si les données vectorielles originales sont stockées avec les représentations quantifiées. L'activation de ce paramètre améliore la précision lors du reclassement, mais augmente les besoins en stockage.

  • reorder_k: Détermine le nombre de candidats affinés lors de la phase finale de reclassement. Des valeurs élevées améliorent la précision mais augmentent la latence de la recherche.

Pour obtenir des conseils détaillés sur l'optimisation de ces paramètres en fonction de votre cas d'utilisation spécifique, reportez-vous à la section Paramètres d'index.

Création d'un index

Pour construire un index SCANN sur un champ de vecteurs dans Milvus, utilisez la méthode add_index(), en spécifiant les paramètres index_type, metric_type et d'autres paramètres pour l'index.

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
)

Dans cette configuration :

  • index_type: Le type d'index à construire. Dans cet exemple, définissez la valeur SCANN.

  • metric_type: La méthode utilisée pour calculer la distance entre les vecteurs. Les valeurs prises en charge sont COSINE, L2 et IP. Pour plus d'informations, reportez-vous à la section Types de métriques.

  • params: Options de configuration supplémentaires pour la construction de l'index.

    • with_raw_data: Stockage ou non des données vectorielles d'origine avec la représentation quantifiée.

    Pour en savoir plus sur les paramètres de construction disponibles pour l'index SCANN, reportez-vous à Paramètres de construction de l'index.

Une fois les paramètres de l'index configurés, vous pouvez créer l'index en utilisant directement la méthode create_index() ou en passant les paramètres de l'index dans la méthode create_collection. Pour plus d'informations, reportez-vous à la section Créer une collection.

Recherche sur l'index

Une fois l'index construit et les entités insérées, vous pouvez effectuer des recherches de similarité sur l'index.

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
)

Dans cette configuration :

  • params: Options de configuration supplémentaires pour la recherche sur l'index.

    • reorder_k: Nombre de candidats à affiner pendant la phase de reclassement.
    • nprobe: Nombre de grappes à rechercher.

    Pour en savoir plus sur les paramètres de recherche disponibles pour l'index SCANN, reportez-vous à Paramètres de recherche spécifiques à l'index.

Paramètres de l'index

Cette section donne un aperçu des paramètres utilisés pour construire un index et effectuer des recherches sur l'index.

Paramètres de construction d'index

Le tableau suivant répertorie les paramètres qui peuvent être configurés sur params lors de la création d'un index.

Paramètre

Description de l'index

Plage de valeurs

Suggestion de réglage

nlist

Nombre d'unités de cluster

[1, 65536]

Une valeur élevée de nlist augmente l'efficacité de l'élagage et accélère généralement la recherche grossière, mais les partitions peuvent devenir trop petites, ce qui peut réduire le rappel ; une valeur plus faible de nlist analyse des grappes plus grandes, ce qui améliore le rappel mais ralentit la recherche.

with_raw_data

Stocker ou non les données vectorielles d'origine avec la représentation quantifiée. Lorsque cette option est activée, elle permet d'effectuer des calculs de similarité plus précis lors de la phase de reclassement en utilisant les vecteurs originaux au lieu des approximations quantifiées.

Type: Booléen

Portée: true, false

Valeur par défaut: true

Définie sur true pour une plus grande précision de recherche et lorsque l'espace de stockage n'est pas une préoccupation majeure. Les données vectorielles originales permettent des calculs de similarité plus précis lors du reclassement.

La valeur false permet de réduire l'espace de stockage et l'utilisation de la mémoire, en particulier pour les grands ensembles de données. Toutefois, la précision de la recherche peut s'en trouver légèrement diminuée, car la phase de reclassement utilise des vecteurs quantifiés.

Recommandé: Utilisez true pour les applications de production où la précision est essentielle.

Paramètres de recherche spécifiques à l'index

Le tableau suivant répertorie les paramètres qui peuvent être configurés dans search_params.params lors d'une recherche sur l'index.

Paramètre

Description du paramètre

Plage de valeurs

Suggestion d'ajustement

reorder_k

Contrôle le nombre de vecteurs candidats qui sont affinés pendant la phase de reclassement. Ce paramètre détermine le nombre de candidats les mieux classés lors des étapes initiales de partitionnement et de quantification qui sont réévalués à l'aide de calculs de similarité plus précis.

Type: Entier

Plage de valeurs: [1, int_max]

Valeur par défaut: Aucune

Une valeur plus élevée de reorder_k permet généralement d'améliorer la précision de la recherche, car davantage de candidats sont pris en compte lors de la phase finale d'affinage. Toutefois, cela augmente également le temps de recherche en raison des calculs supplémentaires.

Envisagez d'augmenter reorder_k lorsqu'il est essentiel d'obtenir un rappel élevé et que la vitesse de recherche n'est pas une préoccupation majeure. Un bon point de départ est 2-5x votre limit désiré (TopK résultats à retourner).

Envisagez de diminuer reorder_k pour privilégier les recherches plus rapides, en particulier dans les scénarios où une légère réduction de la précision est acceptable.

Dans la plupart des cas, nous vous recommandons de fixer une valeur comprise dans cette fourchette :[limite, limite * 5].

nprobe

Nombre de grappes à rechercher pour les candidats.

Type: Entier

Plage de valeurs: [1, nlist]

Valeur par défaut: 8

Des valeurs plus élevées permettent de rechercher davantage de grappes, ce qui améliore le rappel en élargissant la portée de la recherche, mais au prix d'une latence accrue de la requête.

Réglez nprobe proportionnellement à nlist pour équilibrer la vitesse et la précision.

Dans la plupart des cas, nous vous recommandons de définir une valeur comprise dans cette fourchette : [1, nlist].

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?