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
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.
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.
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 valeurSCANN.metric_type: La méthode utilisée pour calculer la distance entre les vecteurs. Les valeurs prises en charge sontCOSINE,L2etIP. 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 |
|---|---|---|---|
|
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. |
|
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: Valeur par défaut: |
Définie sur La valeur Recommandé: Utilisez |
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 |
|---|---|---|---|
|
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 Envisagez d'augmenter Envisagez de diminuer Dans la plupart des cas, nous vous recommandons de fixer une valeur comprise dans cette fourchette :[limite, limite * 5]. |
|
Nombre de grappes à rechercher pour les candidats. |
Type: Entier Plage de valeurs: [1, nlist] Valeur par défaut: |
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 Dans la plupart des cas, nous vous recommandons de définir une valeur comprise dans cette fourchette : [1, nlist]. |