IVF_FLAT
L'index IVF_FLAT est un algorithme d'indexation qui peut améliorer les performances de recherche pour les vecteurs à virgule flottante.
Ce type d'index est idéal pour les ensembles de données à grande échelle qui nécessitent des réponses rapides aux requêtes et une grande précision, en particulier lorsque le regroupement de votre ensemble de données peut réduire l'espace de recherche et que la mémoire disponible est suffisante pour stocker les données du regroupement.
Vue d'ensemble
Le terme IVF_FLAT signifie Inverted File Flat (fichier inversé plat), ce qui résume son approche à deux niveaux de l'indexation et de la recherche de vecteurs à virgule flottante :
- Fichier inversé (IVF) : Fait référence au regroupement de l'espace vectoriel en régions gérables à l'aide d'un regroupement par k-moyennes. Chaque groupe est représenté par un centroïde, qui sert de point de référence pour les vecteurs qu'il contient.
- Plat : indique qu'à l'intérieur de chaque grappe, les vecteurs sont stockés dans leur forme originale (structure plate), sans compression ni quantification, pour des calculs de distance précis.
La figure suivante montre comment cela fonctionne :
ivf-flat-1.png
Cette méthode d'indexation accélère le processus de recherche, mais elle présente un inconvénient potentiel : le candidat trouvé comme étant le plus proche de l'encastrement de la requête peut ne pas être celui qui est exactement le plus proche. Cela peut se produire si l'encastrement le plus proche de l'encastrement de la requête réside dans un groupe différent de celui sélectionné sur la base du centroïde le plus proche (voir la visualisation ci-dessous).
Pour résoudre ce problème, IVF_FLAT fournit deux hyperparamètres que nous pouvons régler :
nlist
: Spécifie le nombre de partitions à créer à l'aide de l'algorithme des k-moyennes.nprobe
: Spécifie le nombre de partitions à prendre en compte lors de la recherche de candidats.
Si nous fixons nprobe
à 3 au lieu de 1, nous obtenons le résultat suivant :
ivf-flat-2.png
En augmentant la valeur de nprobe
, vous pouvez inclure davantage de partitions dans la recherche, ce qui permet de s'assurer que l'intégration la plus proche de la requête n'est pas manquée, même si elle réside dans une partition différente. Cependant, cela se fait au prix d'une augmentation du temps de recherche, car davantage de candidats doivent être évalués. Pour plus d'informations sur le réglage des paramètres de l'index, voir Paramètres de l'index.
Construire un index
Pour construire un index IVF_FLAT
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_FLAT", # 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 for the index
} # Index building params
)
Dans cette configuration :
index_type
: Le type d'index à construire. Dans cet exemple, la valeur estIVF_FLAT
.metric_type
: La méthode utilisée pour calculer la distance entre les vecteurs. Les valeurs prises en charge sontCOSINE
,L2
etIP
. 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 grappes pour diviser l'ensemble de données.
Pour en savoir plus sur les paramètres de construction disponibles pour l'index
IVF_FLAT
, 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": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # 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 à rechercher.
Pour en savoir plus sur les paramètres de recherche disponibles pour l'index
IVF_FLAT
, 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 |
---|---|---|---|
nlist | Nombre de grappes à créer à l'aide de l'algorithme k-means lors de la construction de l'index. Chaque grappe, représentée par un centroïde, stocke une liste de vecteurs. L'augmentation de ce paramètre réduit le nombre de vecteurs dans chaque grappe, créant ainsi des partitions plus petites et plus ciblées. | Type: Entier Plage de valeurs: [1, 65536] Valeur par défaut: 128 | Les valeurs plus é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 des paramètres | Plage de valeurs | Suggestion de réglage |
---|---|---|---|
nprobe | 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. | Type: Entier Plage de valeurs: [1, nlist] Valeur par défaut: 8 | L'augmentation de cette valeur améliore la mémorisation mais peut ralentir la recherche. 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]. |