IVF_SQ8

L'index IVF_SQ8 est un algorithme d'indexation basé sur la quantification, conçu pour relever les défis de la recherche de similarités à grande échelle. Ce type d'index permet d'effectuer des recherches plus rapides avec une empreinte mémoire beaucoup plus faible que les méthodes de recherche exhaustive.

Vue d'ensemble

L'index IVF_SQ8 repose sur deux éléments clés :

  • Fichier inversé (IVF) : Il organise les données en grappes, ce qui permet à l'algorithme de recherche de se concentrer uniquement sur les sous-ensembles de vecteurs les plus pertinents.

  • Quantification scalaire (SQ8) : Compresse les vecteurs sous une forme plus compacte, ce qui réduit considérablement l'utilisation de la mémoire tout en conservant une précision suffisante pour des calculs de similarité rapides.

IVF

Le FVI est comparable à la création d'un index dans un livre. Au lieu de parcourir chaque page (ou, dans notre cas, chaque vecteur), vous recherchez des mots-clés spécifiques (clusters) dans l'index pour trouver rapidement les pages (vecteurs) pertinentes. Dans notre scénario, les vecteurs sont regroupés en grappes et l'algorithme recherche dans quelques grappes proches du vecteur de la requête.

Voici comment cela fonctionne :

  1. Regroupement : Votre ensemble de données vectorielles est divisé en un nombre déterminé de grappes, à l'aide d'un algorithme de regroupement tel que les k-moyennes. Chaque grappe possède un centroïde (vecteur représentatif de la grappe).

  2. Affectation : Chaque vecteur est affecté à la grappe dont le centroïde est le plus proche.

  3. Index inversé : Un index est créé, mettant en correspondance chaque centroïde de grappe avec la liste des vecteurs assignés à cette grappe.

  4. Recherche : Lorsque vous recherchez les voisins les plus proches, l'algorithme de recherche compare le vecteur de votre requête aux centroïdes des clusters et sélectionne le(s) cluster(s) le(s) plus prometteur(s). La recherche est alors limitée aux vecteurs contenus dans les grappes sélectionnées.

Pour en savoir plus sur les détails techniques, reportez-vous à IVF_FLAT.

SQ8

La quantification scalaire (SQ) est une technique utilisée pour réduire la taille des vecteurs à haute dimension en remplaçant leurs valeurs par des représentations plus petites et plus compactes. La variante SQ8 utilise des entiers de 8 bits au lieu des nombres à virgule flottante typiques de 32 bits pour stocker chaque valeur dimensionnelle d'un vecteur. Cela permet de réduire considérablement la quantité de mémoire nécessaire pour stocker les données.

Voici comment fonctionne la variante SQ8 :

  1. Identification de la plage : Il faut d'abord identifier les valeurs minimales et maximales du vecteur. Cette plage définit les limites de la quantification.

  2. Normalisation : Normaliser les valeurs du vecteur dans une fourchette comprise entre 0 et 1 à l'aide de la formule :

    normalized_value=valueminmaxmin\text{normalized\_value} = \frac{\text{value} - \text{min}}{\text{max} - \text{min}}

    Cela permet de s'assurer que toutes les valeurs sont réparties proportionnellement dans une plage normalisée, ce qui les prépare à la compression.

  3. Compression 8 bits : Multiplier la valeur normalisée par 255 (la valeur maximale pour un entier de 8 bits) et arrondir le résultat à l'entier le plus proche. Cela permet de compresser chaque valeur en une représentation de 8 bits.

Supposons que vous ayez une valeur dimensionnelle de 1,2, avec une valeur minimale de -1,7 et une valeur maximale de 2,3. La figure suivante montre comment SQ8 est appliqué pour convertir une valeur float32 en un entier int8.

Ivf Sq8 Ivf Sq8

IVF + SQ8

L'index IVF_SQ8 combine IVF et SQ8 pour effectuer efficacement des recherches de similarité :

  1. IVF réduit l'étendue de la recherche: L'ensemble de données est divisé en grappes, et lorsqu'une requête est émise, IVF compare d'abord la requête aux centroïdes de la grappe, en sélectionnant les grappes les plus pertinentes.

  2. SQ8 accélère les calculs de distance: Au sein des grappes sélectionnées, SQ8 compresse les vecteurs en entiers de 8 bits, ce qui réduit l'utilisation de la mémoire et accélère les calculs de distance.

En utilisant IVF pour cibler la recherche et SQ8 pour accélérer les calculs, IVF_SQ8 permet d'obtenir à la fois des temps de recherche rapides et une efficacité de la mémoire.

Création d'un index

Pour construire un index IVF_SQ8 sur un champ de vecteurs dans Milvus, utilisez la méthode add_index(), en spécifiant les paramètres index_type, metric_type et des paramètres supplémentaires 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="IVF_SQ8", # 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={
        "nlist": 64, # Number of clusters to create using the k-means algorithm during index building
    } # Index building params
)

Dans cette configuration :

  • index_type: Le type d'index à construire. Dans cet exemple, la valeur est IVF_SQ8.

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

    • nlist: Nombre de clusters à créer à l'aide de l'algorithme k-means lors de la construction de l'index.

    Pour en savoir plus sur les paramètres de construction disponibles pour l'index IVF_SQ8, 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": {
        "nprobe": 8, # Number of clusters to search for candidates
    }
}

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.

    • nprobe: Nombre de clusters pour la recherche de candidats.

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

Paramètres de l'index

Cette section présente une vue d'ensemble 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

IVF

nlist

Le nombre de grappes à créer à l'aide de l'algorithme k-means pendant la construction de l'index.

Type: Entier Plage: [1, 65536]

Valeur par défaut: 128

Les valeurs élevées de nlist améliorent le rappel en créant des grappes plus fines, mais augmentent le temps de construction de l'index. Dans la plupart des cas, nous vous recommandons de définir une valeur comprise dans cette plage : [32, 4096].

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

Plage de valeurs

Suggestion de réglage

IVF

nprobe

Le nombre de grappes à rechercher pour les candidats.

Type: Entier Plage: [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. Définissez nprobe proportionnellement à nlist afin d'é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 ?