View a markdown version of this page

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 dans l'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 similitude. 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 la signification 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 richesse des fonctionnalités d'interrogation d'une base de données de JSON-based documents à 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 des fraudes et la détection des 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 au sein d'une base de données de test est créée. Chaque document comprend deux champs : le nom du produit et son intégration 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 les méthodes d'indexation HNSW (Hierarchical Navigable Small World) et IVFFlat (Inverted File with Flat Compression). Un index IVFFlat sépare les vecteurs en listes et recherche ensuite un sous-ensemble sélectionné de ces listes le plus proche du vecteur de requête. D'autre part, un indice HNSW organise les données vectorielles dans un graphique multicouche. Bien que HNSW ait des temps de construction plus lents que IVFFlat, il offre de meilleures performances de requête et de 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 plupart des cas d'utilisation, utilisez le type d'index HNSW pour la recherche vectorielle.

Si vous ne créez pas d'index vectoriel, Amazon DocumentDB effectue une recherche avec précision du voisin le plus proche, garantissant ainsi un rappel parfait. Cependant, dans les scénarios de production, la rapidité est cruciale. Utilisez des index vectoriels, qui peuvent échanger un peu de rappel contre une vitesse accrue. 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 createIndex ou les modèles suivants pour créer un index vectoriel sur un champ vectoriel :

Using createIndex

Dans certains pilotes, tels que mongosh et Java, l'utilisation des vectorOptions paramètres dans createIndex peut entraîner une erreur. Dans ce cas, utilisez 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 des vectorOptions paramètres dans createIndex peut entraîner une erreur. Dans ce cas, utilisez 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.

Pris en charge : hnsw ou ifflat

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

dimensions

obligatoire

entier

Spécifie le nombre de dimensions dans les 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 que l'index IVFFlat utilise 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

Portée [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

Portée [4, 1000]

Il est important que vous définissiez correctement la valeur des sous-paramètres tels que lists pour IVFFlat et m et efConstruction pour HNSW accuracy/recall, car cela affectera le temps de génération 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 région plus petite peut entraîner un plus grand nombre d'erreurs de rappel, ce qui se traduit par une précision moindre. Pour HNSW, l'augmentation de la valeur m et efConstruction de la précision, mais aussi le temps et la taille de l'indice augmentent. 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 :

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" } ]

Interrogation des vecteurs

Amazon DocumentDB prend en charge deux opérateurs de recherche vectorielle pour interroger des vecteurs :

Opérateur de recherche vectorielle classique

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é dans la commande $search pour interroger les vecteurs.

vector

obligatoire

array

Indique le vecteur de requête qui sera utilisé pour rechercher 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 réglé sur le nombre de listes pour la recherche exacte du voisin le plus proche (auquel cas le planificateur n'utilisera pas l'index). Le réglage recommandé pour commencer à affiner le réglage 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

Plage [1, 1000]

Il est important d'affiner la valeur de efSearch (HNSW) ou probes (IVFFlat) 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 ] }

Opérateur $VectorSearch (disponible dans Amazon DocumentDB 8.0 et versions ultérieures)

Utilisez le modèle suivant pour interroger un vecteur :

db.collection.aggregate([ { "$vectorSearch": { "exact": true | false, "index": "<index-name>" [supports only HNSW index], "limit": <number-of-results> [same as k], "path": "<vector field-to-search>", "queryVector": <array-of-numbers>, "numCandidates": <number-of-candidates> [same as efSearch], } }])

Caractéristiques et limites

Compatibilité des versions

  • La recherche vectorielle pour Amazon DocumentDB est uniquement disponible sur les clusters basés sur des instances Amazon DocumentDB 5.0+.

Vecteurs

  • Amazon DocumentDB peut indexer des vecteurs comportant jusqu'à 2 000 dimensions. Cependant, jusqu'à 16 000 dimensions peuvent être stockées 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 documents pouvant atteindre 1 million et plus d'un million sqrt(# of documents) de documents. En raison d'une limite de mémoire de travail, Amazon DocumentDB prend en charge une certaine valeur maximale du paramètre de listes en fonction du nombre de dimensions. À titre de référence, le tableau suivant fournit les valeurs maximales du paramètre de listes pour les vecteurs de 500, 1 000 et 2 000 dimensions :

    Type d’instance Listes de 500 dimensions Listes de 1 000 dimensions Listes avec 2000 dimensions

    t3.med

    372

    257

    150

    R5 l.

    915

    741

    511

    r5.xl

    1 393

    1 196

    901

    r5,2 XL

    5 460

    5 230

    4 788

    r5,4XL

    7 842

    7 599

    7 138

    R 5,8 XL

    11 220

    10 974

    10 498

    r5,12 XL

    13 774

    13 526

    13 044

    r5,16 XL

    15 943

    15 694

    15 208

    r5,24 XL

    19 585

    19 335

    18 845

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

  • La création d'index parallèle n'est pas prise en charge pour l'index HNSW dans Amazon DocumentDB 5.0.

Requête vectorielle

  • Pour les requêtes de recherche vectorielle, il est important d'affiner les paramètres tels que probes ou efSearch pour des résultats optimaux. Plus la valeur probes ou le efSearch paramètre est élevé, 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 pour utiliser 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 IVFFlat (Inverted File with Flat Compression) implique le clustering et l'organisation des points de données en fonction des similitudes. Pour qu'un index soit plus efficace, chargez certaines données avant de le créer.

  • Pour les requêtes de recherche vectorielle, il est important d'affiner les paramètres, par exemple efSearch pour probes des résultats optimaux. Plus la valeur du efSearch paramètre probes ou 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