View a markdown version of this page

Utilisation d'index vectoriels dans DynamoDB - Amazon DynamoDB

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.

Utilisation d'index vectoriels dans DynamoDB

Les index vectoriels sont un type d'index dans Amazon DynamoDB qui permet de rechercher des similarités sur les intégrations vectorielles stockées dans les éléments de votre tableau. Contrairement aux index secondaires globaux et aux index secondaires locaux, qui prennent en charge les requêtes de correspondance exacte et de plage à l'aide de Query et Scan opérations, les index vectoriels utilisent la recherche du voisin le plus proche approximatif (ANN) pour trouver les éléments dont les vecteurs sont les plus similaires à un vecteur de requête que vous fournissez. Vous effectuez ces recherches de similarité en appelant le SearchVectors API, qui renvoie les éléments les plus similaires classés selon un score de similarité.

Grâce aux index vectoriels, vous pouvez stocker des intégrations vectorielles à côté de vos données opérationnelles dans DynamoDB et effectuer des recherches de similarité sans avoir besoin d'une base de données vectorielle distincte. Il n'est donc plus nécessaire de recourir à des pipelines de réplication de données complexes entre DynamoDB et des magasins vectoriels externes.

Les index vectoriels sont gérés par le même CreateTable et UpdateTable Les API que vous utilisez déjà, avec VectorIndexes paramètre (pour CreateTable) et le VectorIndexUpdates paramètre (pour UpdateTable).

Cas d'utilisation des index vectoriels

Les index vectoriels prennent en charge divers cas d'utilisation impliquant la recherche d'éléments similaires sur la base de représentations vectorielles :

  • Recherche sémantique — Créez des moteurs de recherche qui comprennent la signification des requêtes plutôt que des mots clés correspondants. Stockez les intégrations de texte générées par des modèles d'apprentissage automatique et trouvez du contenu sémantiquement similaire.

  • Génération augmentée de récupération (RAG) — Connectez les grands modèles de langage (LLM) aux bases de connaissances pertinentes. Stockez les intégrations de documents dans DynamoDB et récupérez le contexte le plus pertinent pour les invites LLM.

  • Systèmes de recommandation — Trouvez des produits, du contenu ou des utilisateurs similaires sur la base de représentations vectorielles de leurs caractéristiques ou de leur comportement.

  • Mémoire des agents IA — Stockez les intégrations de conversations pour maintenir le contexte entre les sessions et améliorer les performances des agents d'IA.

  • Détection des anomalies et des fraudes — Comparez les nouveaux événements à l'intégration de comportements connus comme normaux afin de détecter les valeurs aberrantes, telles que des transactions inhabituelles ou des activités frauduleuses.

Comparaison d'indices vectoriels avec des indices secondaires

Le tableau suivant compare les index vectoriels avec les index secondaires globaux et les index secondaires locaux.

Fonctionnalité Indice vectoriel GSI Index secondaire local
Type de requête Recherche de similarité Correspondance et gamme exactes Correspondance et gamme exactes
Lire l'API SearchVectors Query, Scan Query, Scan
Schema Attribut vectoriel, plus facultatif SearchSchema (clé de partition, filtres intégrés) Clé (s) de partition et clé (s) de tri facultative (s) Même clé de partition, clé de tri différente
Maximum par table 5 (réglable jusqu'à 20) 20 5
Mode capacité On-demand seulement On-demand ou provisionné On-demand ou provisionné

Fonctions de distance

Lorsque vous créez un index vectoriel, vous choisissez une fonction de distance. La fonction de distance détermine comment DynamoDB mesure la similitude entre les vecteurs. Votre choix influe sur la qualité du classement et la précision de la recherche. Amazon DynamoDB prend en charge trois fonctions de distance.

Fonction de distance Interprétation des partitions Meilleur match
COSINE Des scores plus faibles indiquent une plus grande similitude. Mesure la distance en cosinus (1 moins la similitude du cosinus) entre deux vecteurs. Les valeurs sont comprises entre 0 (direction identique) et 2 (direction opposée). Les plus petits scores
DOT_PRODUCT Des scores plus élevés indiquent une plus grande similitude. Mesure le produit scalaire entre deux vecteurs. Scores les plus élevés
EUCLIDEAN Des scores plus faibles indiquent une plus grande similitude. Mesure la distance en ligne droite entre deux vecteurs. Les plus petits scores

Pour comparer la façon dont les fonctions de distance classent le même vecteur de requête, voir Comment les fonctions de distance classent les résultats.

Les conseils suivants vous aident à choisir la fonction de distance adaptée à votre charge de travail.

COSINE

Compare la direction et ignore la magnitude. Utiliser COSINE pour la similitude sémantique avec les modèles d'intégration de texte. Ces modèles codent le sens dans la direction, et la longueur du vecteur peut varier. Les exemples incluent Amazon Titan Text Embeddings et Cohere Embed.

COSINE convient parfaitement aux cas d'utilisation suivants :

  • Recherche sémantique dans les descriptions de produits ou les documents

  • Génération augmentée de récupération (RAG)

  • Correspondance des FAQ

COSINE est la valeur par défaut sécurisée lorsque vous ne savez pas quelle fonction utiliser.

DOT_PRODUCT

DOT_PRODUCT est sensible à la fois à la direction et à l'amplitude (la longueur d'un vecteur). Choisissez DOT_PRODUCT lorsque la documentation de votre modèle d'intégration recommande un produit scalaire comme mesure de similarité, ou lorsque vous souhaitez que la longueur du vecteur influence le classement.

DOT_PRODUCT convient parfaitement aux cas d'utilisation suivants :

  • Systèmes de recommandation qui utilisent des scores de popularité ou de confiance pour étendre les intégrations et influencer le classement

  • Modèles dont la documentation recommande spécifiquement le produit par points comme mesure de similarité

  • Magnitude-sensitive classement où la longueur du vecteur transmet un signal significatif

Nous vous recommandons de normaliser vos intégrations en fonction de la longueur unitaire. Une fois normalisé, DOT_PRODUCT classe les résultats de la même manière que COSINE. Ignorez la normalisation uniquement si vous souhaitez que l'ampleur affecte le classement.

Exemple de cas d'utilisation : un système de recommandation de produits dans lequel vous redimensionnez chaque produit intégré en fonction de son score de popularité. Les produits les plus populaires obtiennent des vecteurs plus longs et sont mieux classés dans les résultats de recherche.

EUCLIDEAN

Mesure la distance en ligne droite entre deux vecteurs. EUCLIDEAN est sensible à la magnitude. Utilisez-le lorsque la position absolue dans l'espace d'intégration est importante.

EUCLIDEAN convient parfaitement aux cas d'utilisation suivants :

  • Intégrations d'images ou de sons lorsque la distance spatiale est importante

  • Near-duplicate détection

  • Regroupement et détection des anomalies

Exemple de cas d'utilisation : recherche d'images quasi dupliquées à partir d'intégrations d'images.

Choisissez une fonction de distance qui correspond à votre modèle d'intégration

Si vous ne savez pas quelle fonction utiliser, consultez la documentation de votre modèle d'intégration. Validez votre choix par rapport à un ensemble de données représentatif. Vous ne pouvez pas modifier la fonction de distance après la création de l'index. Pour plus d’informations, consultez Adaptez la fonction de distance à vos encastrements.

Comment les fonctions de distance classent les résultats

La fonction de distance que vous choisissez lors de la création de l'indice détermine à la fois Score valeur et ordre de tri des résultats. La même requête peut classer différemment les mêmes éléments selon différentes fonctions de distance. L'exemple suivant utilise le vecteur de requête [1, 0, 0, 0] contre quatre vecteurs stockés.

Vecteur stocké COSINE (le plus bas est plus similaire) EUCLIDEAN (le plus bas est plus similaire) DOT_PRODUCT (plus élevé est plus similaire)
[1, 0, 0, 0] 0.0 0.0 1.0
[10, 0, 0, 0] 0.0 9.0 10,0
[0.7071, 0.7071, 0, 0] 0,29 0,77 0,71
[-1, 0, 0, 0] 2.0 2.0 -1,0

Deux comportements méritent d'être soulignés :

  • COSINE ne tient pas compte de l'ampleur. Ça marque [1, 0, 0, 0] et [10, 0, 0, 0] de manière identique (à la fois 0.0) car ils pointent dans la même direction. EUCLIDEAN rangs [10, 0, 0, 0] dernier pour la même requête car il mesure la distance absolue, qui augmente avec la magnitude d'un vecteur.

  • DOT_PRODUCT les scores peuvent être négatifs. Un vecteur pointant dans la direction opposée ([-1, 0, 0, 0]) résultats -1.0. Ne partez pas du principe que les scores sont toujours non négatifs lorsque vous triez ou appliquez des seuils aux résultats.

SearchSchema

Lorsque vous créez un index vectoriel, vous pouvez éventuellement définir un SearchSchema qui spécifie les clés de partition de l'index vectoriel et les attributs de filtre en ligne.

HASH (clé de partition d'index vectoriel)

Une clé de partition d'index vectoriel étend chaque recherche aux vecteurs qui partagent la même valeur pour un attribut que vous choisissez. Les éléments ayant la même valeur de clé de partition sont stockés ensemble, de sorte que la recherche ne lit que ce sous-ensemble au lieu de parcourir l'index dans son intégralité. À grande échelle, une clé de partition d'index vectoriel réduit la latence de recherche car celle-ci n'examine qu'un sous-ensemble de l'espace vectoriel. Utilisez des attributs dont la cardinalité est faible à moyenne, tels que Category ou Country. Vous pouvez spécifier au plus une clé de partition d'index vectoriel.

Si vous définissez une clé de partition d'index vectoriel dans SearchSchema, vous devez indiquer sa valeur dans le SearchConditionExpression quand tu appelles SearchVectors.

Utiliser une clé de partition pour augmenter le débit de recherche

Définissez une clé de partition d'index vectoriel lorsque vous vous attendez à un index volumineux ou à un volume de recherche élevé. Parce que chaque SearchVectors L'appel est limité à une seule valeur de clé de partition. La distribution de vos données sur de nombreuses valeurs de clé de partition vous permet d'exécuter plus d'opérations de recherche par seconde et de réduire la quantité de données examinée par chaque recherche. Consultez Choisissez une clé de partition qui correspond à vos modèles de requête.

INLINE_FILTER

Un attribut de filtre intégré est un attribut non vectoriel normal dont DynamoDB enregistre la valeur dans l'index vectoriel à côté de chaque vecteur. Comme la valeur correspond au vecteur, DynamoDB ignore les vecteurs qui ne correspondent pas à votre filtre lors de la recherche dans l'index. Cela permet d'éviter de rechercher d'abord dans l'index complet, puis de rejeter les résultats qui ne correspondent pas.

Par exemple, si vous définissez un Language attribut en tant que filtre en ligne, une recherche qui filtre sur Language ne considère que les vecteurs dont Language les valeurs correspondent.

Les filtres en ligne prennent en charge l'opérateur d'égalité (=) dans SearchConditionExpression. Opérateurs de comparaison, de gamme et d'appartenance à un ensemble (<>, <, <=, >, >=, IN) ne sont pas encore disponibles. Contrairement aux clés de partition d'index vectoriel, les filtres intégrés sont facultatifs lors de la recherche.

Vous pouvez créer un index vectoriel sans définir de clé de partition dans SearchSchema. Dans ce cas, chaque SearchVectors call recherche l'intégralité de l'index. C'est plus simple car vous n'avez pas besoin de SearchConditionExpression. Cependant, étant donné que chaque recherche examine l'intégralité de l'index, le travail effectué par chaque recherche, et donc sa latence et son coût, augmentent à mesure que votre index grandit. Vous ne pouvez pas non plus répartir le débit de recherche sur plusieurs valeurs de clé de partition. Si votre charge de travail nécessite un débit élevé ou si votre index contient un grand nombre de vecteurs, définissez une clé de partition pour répartir les données entre les partitions et les dimensionner indépendamment. Consultez Choisissez une clé de partition qui correspond à vos modèles de requête.

Projections

Comme les index secondaires globaux, les index vectoriels prennent en charge les projections qui contrôlent quels attributs de la table de base sont copiés dans l'index. Vous spécifiez la projection lorsque vous créez l'indice vectoriel.

  • KEYS_ONLY — Seuls les attributs de clé primaire de la table de base, l'attribut vectoriel et tous les attributs de filtre en ligne définis dans SearchSchema sont projetés dans l'indice.

  • INCLUDE — En plus de KEYS_ONLY attributs, vous spécifiez des attributs non clés supplémentaires au projet. Vous ne pouvez pas modifier l'ensemble des attributs inclus une fois l'index vectoriel créé. Pour projeter un ensemble d'attributs différent, supprimez l'index et recréez-le avec la projection de votre choix.

  • ALL — Tous les attributs de la table de base sont projetés dans l'index.

La projection limite quoi SearchVectors peut retourner

Les attributs qui ne sont pas projetés dans l'index vectoriel ne peuvent pas être renvoyés dans SearchVectors réponses. Si vous avez besoin d'attributs spécifiques dans les résultats de recherche, incluez-les dans la projection ou utilisez ALL.

Utilisation d'index vectoriels avec d'autres fonctionnalités de DynamoDB

DynamoDB Streams

Vous pouvez activer DynamoDB Streams sur une table dotée d'un index vectoriel, soit à l'aide du StreamSpecification paramètre lorsque vous créez la table ou via UpdateTable. Le flux capture les modifications apportées au niveau des éléments à la table de base et fonctionne indépendamment de l'indice vectoriel.

Tables globales

Vous pouvez ajouter un index vectoriel à une table globale, et vous pouvez convertir une table qui possède un index vectoriel en une table globale en ajoutant une réplique avec UpdateTable. La définition de l'indice vectoriel, y compris ses dimensions, sa fonction de distance, SearchSchema, et la projection, sont répliquées automatiquement dans chaque nouvelle région de réplication. Vous ne créez pas l'index vectoriel séparément dans la région du réplica.

Les éléments que vous écrivez dans n'importe quelle région de réplication sont répliqués dans les autres régions et y sont indexés. Une fois la réplication terminée, SearchVectors dans chaque région recherche le même ensemble de vecteurs. Étant donné que la recherche vectorielle utilise le voisin le plus proche approximatif (ANN), des recherches distinctes dans différentes régions peuvent renvoyer des résultats ou un ordre légèrement différents pour la même requête, même pour des données identiques. La réplication des tables entre les régions suit la garantie de cohérence de la table globale, y compris une cohérence élevée pour les tables mondiales multi-régions à cohérence forte (MRSC). L'indexation vectorielle s'effectue toutefois toujours de manière asynchrone après l'application d'une écriture à la table, dans chaque région, y compris la région dans laquelle vous avez écrit. La garantie MRSC couvre le tableau, pas l'indice vectoriel. Par conséquent, un délai se produit entre le moment où une écriture est confirmée et le moment où le vecteur devient consultable SearchVectors. Ce délai s'applique au niveau local ainsi qu'à l'ensemble des régions.

On-demand capacité requise

Les index vectoriels utilisent uniquement le mode de capacité à la demande et nécessitent une table qui utilise également le mode de capacité à la demande. Vous ne pouvez pas mélanger les deux modes de capacité. Les tables globales prennent en charge le mode de capacité à la demande. Créez l'index vectoriel et la réplique sur une table qui utilise déjà la capacité à la demande.

Point-in-time restauration (PITR) et sauvegardes

Lorsque vous restaurez une table à partir d'une restauration instantanée ou d'une sauvegarde à la demande, DynamoDB restaure les données de la table de base et la définition de l'index vectoriel. Comme pour les index secondaires globaux, DynamoDB reconstruit l'index vectoriel à partir des données restaurées de la table de base plutôt que de le copier octet par octet. L'index est donc soumis à un remplissage avant d'être prêt pour la recherche. Attendez que IndexStatus est ACTIVE et Backfilling n'est pas true sur l'index restauré avant de lancer SearchVectors.

Durée de vie (TTL)

Vous pouvez utiliser DynamoDB TTL sur une table dotée d'un index vectoriel. Lorsque TTL supprime un élément expiré de la table de base, DynamoDB supprime l'entrée correspondante de l'index vectoriel, comme le fait une suppression manuelle. Les articles expirés cessent donc d'apparaître dans SearchVectors résultats après la propagation de la suppression vers l'index.

Importation et exportation de données de table

Vous pouvez exporter un tableau contenant un index vectoriel vers Amazon S3 ; l'exportation contient les éléments de la table de base, y compris les attributs vectoriels qui y sont stockés. Lorsque vous importez des données depuis Amazon S3 dans une nouvelle table, définissez l'index vectoriel dans la demande d'importation de la même manière que vous le feriez avec CreateTable. DynamoDB indexe les éléments importés au fur et à mesure de leur écriture, et l'index vectoriel devient disponible une fois l'importation terminée.

DAX

L'accélérateur DynamoDB (DAX) ne prend pas en charge SearchVectors opération. Envoyer SearchVectors requêtes directement adressées à DynamoDB, même lorsque votre application utilise DAX pour d'autres opérations de lecture. La mise en cache DAX des lectures de la table de base n'est pas affectée par la présence d'un index vectoriel. Si vous avez besoin d'une couche de mise en cache pour les résultats de recherche vectorielle, vous pouvez mettre en cache SearchVectors réponses dans un cache externe, tel qu'Amazon ElastiCache pour Valkey. Vous êtes responsable du remplissage et de l'invalidation de ce cache.