Recherche vectorielle pour Amazon DocumentDB - Amazon DocumentDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Recherche vectorielle pour Amazon DocumentDB

La recherche vectorielle est une méthode utilisée en apprentissage automatique pour trouver des points de données similaires à un point de données donné en comparant leurs représentations vectorielles à l'aide de métriques de distance ou de similarité. Plus les deux vecteurs sont proches de l'espace vectoriel, plus les éléments sous-jacents sont considérés comme similaires. Cette technique permet de saisir le sens sémantique des données. Cette approche est utile dans diverses applications, telles que les systèmes de recommandation, le traitement du langage naturel et la reconnaissance d'images.

La recherche vectorielle pour Amazon DocumentDB associe la flexibilité et la riche capacité d'interrogation d'une base de données de documents basée sur JSON à la puissance de la recherche vectorielle. Si vous souhaitez utiliser vos données Amazon DocumentDB existantes ou une structure de données documentaire flexible pour créer des cas d'utilisation de l'apprentissage automatique et de l'IA générative, tels que l'expérience de recherche sémantique, la recommandation de produits, la personnalisation, les chatbots, la détection de fraudes et la détection d'anomalies, la recherche vectorielle pour Amazon DocumentDB est le choix idéal pour vous. La recherche vectorielle est disponible sur les clusters basés sur des instances Amazon DocumentDB 5.0.

Insertion de vecteurs

Pour insérer des vecteurs dans votre base de données Amazon DocumentDB, vous pouvez utiliser les méthodes d'insertion existantes :

Exemple

Dans l'exemple suivant, une collection de cinq documents dans une base de données de test est créée. Chaque document comprend deux champs : le nom du produit et son incorporation vectorielle correspondante.

db.collection.insertMany([ {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]}, {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]}, {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]}, {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]}, {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]} ]);

Création d'un index vectoriel

Amazon DocumentDB prend en charge à la fois les méthodes d'indexation Hierarchical Navigable Small World (HNSW) et les méthodes d'indexation de fichiers inversés avec compression plate (IVFFlat). Un index IVFFlat sépare les vecteurs en listes et recherche ensuite un sous-ensemble sélectionné de ces listes les plus proches du vecteur de requête. D'autre part, un indice HNSW organise les données vectorielles dans un graphique multicouche. Bien que les temps de construction de HNSW soient plus lents que ceux d'IVFFlat, il offre de meilleures performances de requête et un meilleur rappel. Contrairement à IVFFlat, HNSW ne comporte aucune étape d'apprentissage, ce qui permet de générer l'index sans aucun chargement de données initial. Dans la majorité des cas d'utilisation, nous recommandons d'utiliser le type d'index HNSW pour la recherche vectorielle.

Si vous ne créez pas d'index vectoriel, Amazon DocumentDB effectue une recherche avec le voisin le plus proche, garantissant ainsi un rappel parfait. Cependant, dans les scénarios de production, la rapidité est cruciale. Nous vous recommandons d'utiliser des index vectoriels, qui peuvent échanger un certain rappel contre une amélioration de la vitesse. Il est important de noter que l'ajout d'un index vectoriel peut entraîner des résultats de requête différents.

Modèles

Vous pouvez utiliser les runCommand modèles suivants createIndex pour créer un index vectoriel sur un champ vectoriel :

Using createIndex

Dans certains pilotes, tels que Mongosh et Java, l'utilisation vectorOptions des paramètres createIndex peut entraîner une erreur. Dans de tels cas, nous vous recommandons d'utiliser runCommand :

db.collection.createIndex( { "<vectorField>": "vector" }, { "name": "<indexName>", "vectorOptions": { "type": " <hnsw> | <ivfflat> ", "dimensions": <number_of_dimensions>, "similarity": " <euclidean> | <cosine> | <dotProduct> ", "lists": <number_of_lists> [applicable for IVFFlat], "m": <max number of connections> [applicable for HNSW], "efConstruction": <size of the dynamic list for index build> [applicable for HNSW] } } );
Using runCommand

Dans certains pilotes, tels que Mongosh et Java, l'utilisation vectorOptions des paramètres createIndex peut entraîner une erreur. Dans de tels cas, nous vous recommandons d'utiliser runCommand :

db.runCommand( { "createIndexes": "<collection>", "indexes": [{ key: { "<vectorField>": "vector" }, vectorOptions: { type: " <hnsw> | <ivfflat> ", dimensions: <number of dimensions>, similarity: " <euclidean> | <cosine> | <dotProduct> ", lists: <number_of_lists> [applicable for IVFFlat], m: <max number of connections> [applicable for HNSW], efConstruction: <size of the dynamic list for index build> [applicable for HNSW] }, name: "myIndex" }] } );
Paramètre Exigence Type de données Description Valeur (s)

name

facultatif

chaîne

Spécifie le nom de l'index.

Alphanumérique

type

facultatif

Spécifie le type d'index.

Supporté : hnsw ou ivfflat

Par défaut : HNSW (patch moteur 3.0.4574 et versions ultérieures)

dimensions

obligatoire

entier

Spécifie le nombre de dimensions des données vectorielles.

Maximum de 2 000 dimensions.

similarity

obligatoire

chaîne

Spécifie la métrique de distance utilisée pour le calcul de similarité.

  • euclidean

  • cosine

  • dotProduct

lists

requis pour IVFFlat

entier

Spécifie le nombre de clusters utilisés par l'index IVFFlat pour regrouper les données vectorielles. Le paramètre recommandé est le nombre de documents/1000 pour un maximum de 1 million de documents et sqrt(# of documents) pour plus d'un million de documents.

Minimum : 1

Maximum : reportez-vous au tableau des listes par type d'instance Caractéristiques et limites ci-dessous.

m

facultatif

entier

Spécifie le nombre maximum de connexions pour un index HNSW

Par défaut: 16

Gamme [2, 100]

efConstruction

facultatif

entier

Spécifie la taille de la liste dynamique de candidats pour la construction du graphique pour l'indice HNSW.

efConstructiondoit être supérieur ou égal à (2 * m)

Par défaut: 64

Gamme [4, 1000]

Il est important que vous définissiez correctement la valeur des sous-paramètres tels que lists pour IVFFlat m et efConstruction pour HNSW, car cela affectera la précision/le rappel, le temps de création et les performances de votre recherche. Une valeur de liste plus élevée augmente la vitesse de la requête car elle réduit le nombre de vecteurs dans chaque liste, ce qui réduit la taille des régions. Cependant, une taille de région plus petite peut entraîner un plus grand nombre d'erreurs de rappel, ce qui se traduit par une baisse de la précision. Pour HNSW, l'augmentation de la valeur m et de la précision de l'index efConstruction augmente, tout en augmentant le temps et la taille de l'index. Voir les exemples suivants :

Exemples

HNSW
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "hnsw", "dimensions": 3, "similarity": "euclidean", "m": 16, "efConstruction": 64 } } );
IVFFlat
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "ivfflat", "dimensions": 3, "similarity": "euclidean", "lists":1 } } )

Obtenir une définition d'index

Vous pouvez consulter les détails de vos index, y compris les index vectoriels, à l'aide de la getIndexes commande suivante :

Exemple

db.collection.getIndexes()

Exemple de sortie

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.collection" }, { "v" : 4, "key" : { "vectorEmbedding" : "vector" }, "name" : "myIndex", "vectorOptions" : { "type" : "ivfflat", "dimensions" : 3, "similarity" : "euclidean", "lists" : 1 }, "ns" : "test.collection" } ]

Vecteurs d'interrogation

Modèle de requête vectorielle

Utilisez le modèle suivant pour interroger un vecteur :

db.collection.aggregate([ { $search: { "vectorSearch": { "vector": <query vector>, "path": "<vectorField>", "similarity": "<distance metric>", "k": <number of results>, "probes":<number of probes> [applicable for IVFFlat], "efSearch":<size of the dynamic list during search> [applicable for HNSW] } } } ]);
Paramètre Exigence Type Description Valeur (s)

vectorSearch

obligatoire

opérateur

Utilisée dans la commande $search pour interroger les vecteurs.

vector

obligatoire

array

Indique le vecteur de requête qui sera utilisé pour trouver des vecteurs similaires.

path

obligatoire

chaîne

Définit le nom du champ vectoriel.

k

obligatoire

entier

Spécifie le nombre de résultats renvoyés par la recherche.

similarity

obligatoire

chaîne

Spécifie la métrique de distance utilisée pour le calcul de similarité.

  • euclidean

  • cosine

  • dotProduct

probes

facultatif

entier

Le nombre de clusters que la recherche vectorielle doit inspecter. Une valeur plus élevée permet un meilleur rappel au détriment de la rapidité. Il peut être défini sur le nombre de listes pour la recherche du voisin le plus proche exact (auquel cas le planificateur n'utilisera pas l'index). Le paramètre recommandé pour commencer le réglage fin estsqrt(# of lists).

Valeur par défaut : 1

efSearch

facultatif

entier

Spécifie la taille de la liste dynamique de candidats utilisée par l'index HNSW lors de la recherche. Une valeur plus élevée de efSearch permet un meilleur rappel au détriment de la rapidité.

Valeur par défaut : 40

Gamme [1, 1000]

Il est important de régler avec précision la valeur de efSearch (HNSW) ou probes (IVFlat) pour obtenir les performances et la précision souhaitées. Consultez les exemples d'opérations suivants :

HNSW
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "efSearch": 40 } } } ]);
IVFFlat
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "probes": 1 } } } ]);

Exemple de sortie

Le résultat de cette opération ressemble à ce qui suit :

{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] } { "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }

Caractéristiques et limites

Compatibilité des versions

  • La recherche vectorielle pour Amazon DocumentDB n'est disponible que sur les clusters basés sur des instances Amazon DocumentDB 5.0.

Vecteurs

  • Amazon DocumentDB peut indexer des vecteurs de 2 000 dimensions maximum. Cependant, il est possible de stocker jusqu'à 16 000 dimensions sans index.

Index

  • Pour la création d'un index IVFFlat, le paramètre recommandé pour le paramètre des listes est le nombre de documents/1000 pour un maximum de 1 million de documents et sqrt(# of documents) pour plus d'un million de documents. En raison d'une limite de mémoire de travail, Amazon DocumentDB prend en charge une certaine valeur maximale du paramètre des listes en fonction du nombre de dimensions. À titre de référence, le tableau suivant fournit les valeurs maximales du paramètre des listes pour les vecteurs de 500, 1 000 et 2 000 dimensions :

    Type d’instance Listes de 500 dimensions Listes de 1000 dimensions Listes de 2000 dimensions

    t3.med

    372

    257

    150

    r5.l

    915

    741

    511

    r5.xl

    1 393

    1 196

    901

    r5.2xl

    5 460

    5 230

    4 788

    r5,4xl

    7 842

    7 599

    7 138

    r5,8xl

    11 220

    10 974

    10 498

    r5,12xl

    13 774

    13 526

    13 044

    r5,16xl

    15 943

    15 694

    15 208

    r5,24xl

    19 585

    19 335

    18 845

  • Aucune autre option d'index telle que compound sparse ou n'est prise en charge par partial les index vectoriels.

  • La création d'index parallèle n'est pas prise en charge pour l'indice HNSW. Il n'est pris en charge que pour l'index IVFFlat.

Requête vectorielle

  • Pour les requêtes de recherche vectorielle, il est important d'affiner les paramètres tels que probes ou efSearch pour obtenir des résultats optimaux. Plus la valeur probes ou le efSearch paramètre est élevée, plus le rappel est élevé et plus la vitesse est faible. Le réglage recommandé pour commencer à affiner le paramètre des sondes estsqrt(# of lists).

Bonnes pratiques

Découvrez les meilleures pratiques relatives à l'utilisation de la recherche vectorielle dans Amazon DocumentDB. Cette section est mise à jour en continu à mesure que de nouvelles bonnes pratiques sont identifiées.

  • La création d'un index de fichier inversé avec compression plate (IVFFlat) implique le regroupement et l'organisation des points de données en fonction des similitudes. Par conséquent, pour qu'un index soit plus efficace, nous vous recommandons de charger au moins certaines données avant de créer l'index.

  • Pour les requêtes de recherche vectorielle, il est important d'affiner les paramètres, par exemple probes ou efSearch pour obtenir des résultats optimaux. Plus la valeur du efSearch paramètre probes or est élevée, plus le rappel est élevé et plus la vitesse est faible. Le réglage recommandé pour commencer à affiner le probes paramètre estsqrt(lists).

Ressources