View a markdown version of this page

Création et recherche d'index vectoriels - 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.

Création et recherche d'index vectoriels

Cette section explique comment créer et gérer des index vectoriels, écrire des éléments avec des données vectorielles et effectuer des recherches de similarité à l'aide de l'SearchVectorsAPI.

Avant de commencer

Avant de travailler avec des index vectoriels, vérifiez les points suivants :

  • Votre table utilise le mode de capacité à la demande (PAY_PER_REQUEST). Les index vectoriels ne sont pas pris en charge dans les tables de capacité provisionnées.

  • Votre identité Gestion des identités et des accès AWS (IAM) possède dynamodb:CreateTable ou est autorisée à dynamodb:UpdateTable créer des index vectoriels.

  • Votre identité IAM est dynamodb:SearchVectors autorisée à effectuer des recherches sur la ressource d'index vectoriel. Le format ARN des ressources estarn:aws:dynamodb:region:account-id:table/table-name/index/index-name.

SearchVectors points de terminaison

SearchVectorsles requêtes utilisent des points de terminaison dédiés à la recherche vectorielle, distincts des points de terminaison DynamoDB standard que vous utilisez pour créer et gérer des index vectoriels (par exemple, avec, et). CreateTable UpdateTable DescribeTable Les AWS SDK et les SearchVectors requêtes d' AWS CLI acheminement vers le terminal approprié automatiquement. Il n'est pas nécessaire de configurer ou de remplacer le point de terminaison dans le code de votre application.

Si vous créez un client HTTP personnalisé qui appelle l'API DynamoDB directement sans AWS SDK, utilisez l'un des points de terminaison de recherche vectorielle suivants, en le remplaçant et selon les besoins : account-id region

  • account-id.search-ddb.region.amazonaws.com— Account-based point final.

  • search-dynamodb.region.api.aws— Dual-stack point de terminaison, compatible avec IPv4 et IPv6.

Génération d'intégrations vectorielles

DynamoDB stocke et recherche des intégrations vectorielles, mais ne les génère pas. Vous produisez des intégrations à l'aide d'un modèle d'intégration, tel que les modèles Amazon Bedrock Titan Text Embeddings ou Cohere Embed, ou tout autre modèle d'intégration que vous utilisez. Vous stockez ensuite le vecteur obtenu dans un élément DynamoDB et vous transmettez un vecteur de requête à. SearchVectors

Le vecteur de requête et les vecteurs stockés doivent utiliser le même modèle

Le vecteur de requête que vous transmettez SearchVectors et les vecteurs stockés dans vos éléments doivent être produits par le même modèle d'intégration et doivent avoir le même nombre de dimensions que l'index vectoriel. Le fait de mélanger des modèles ou d'effectuer des requêtes avec un nombre de dimensions différent de celui avec lequel l'index a été créé produit des résultats inutiles ou une erreur de validation.

Le flux typique est le suivant :

  1. Envoyez votre contenu source (par exemple, une description de produit) à un modèle d'intégration et recevez un vecteur.

  2. Stockez ce vecteur dans un élément DynamoDB, dans l'attribut nommé par l'index vectoriel (VectorAttribute), sous la forme d'une liste (L) de nombres (N).

  3. Au moment de la requête, générez un vecteur à partir du texte de recherche en utilisant le même modèle et transmettez-le en tant queSearchVector.

Choisissez votre modèle d'intégration avant de créer l'index

Choisissez votre modèle d'intégration avant de créer l'index vectoriel, car c'est le modèle qui détermine le nombre de dimensions. Les modèles d'intégration courants produisent 384, 768, 1024, 1536 ou 3072 dimensions. DynamoDB prend en charge jusqu'à 4 096 dimensions. Consultez Exigences et limitations.

La fonction de distance que vous choisissez interagit avec la façon dont votre modèle produit les intégrations. COSINEcompare la direction et ignore la magnitude. Cela fonctionne donc avec les intégrations, qu'elles soient normalisées ou non. DOT_PRODUCTest sensible à la magnitude : si vos intégrations ne sont pas normalisées à l'unité de longueur, les vecteurs plus grands obtiennent des scores plus élevés quelle que soit la direction. Si vous utilisez DOT_PRODUCT et souhaitez utiliser la similitude basée sur la direction, normalisez vos intégrations en unités de longueur avant de les stocker. Consultez Comment les fonctions de distance classent les résultats.

Création d'un index vectoriel

Vous pouvez créer un index vectoriel lorsque vous créez un nouveau tableau ou que vous en ajoutez un à un tableau existant.

Création d'un tableau avec un index vectoriel

Utilisez l'CreateTableAPI avec le VectorIndexes paramètre pour créer une table avec un index vectoriel. L' AWS CLI exemple suivant crée une Products table avec un index vectoriel nomméProductEmbeddingIndex.

aws dynamodb create-table \ --table-name Products \ --attribute-definitions AttributeName=ProductId,AttributeType=S \ AttributeName=Category,AttributeType=S \ AttributeName=Brand,AttributeType=S \ --key-schema AttributeName=ProductId,KeyType=HASH \ --billing-mode PAY_PER_REQUEST \ --vector-indexes \ "[ { \"IndexName\": \"ProductEmbeddingIndex\", \"VectorAttribute\": {\"AttributeName\": \"Embedding\"}, \"SearchSchema\": [{\"AttributeName\":\"Category\",\"SearchSchemaElementType\":\"HASH\"}, {\"AttributeName\":\"Brand\",\"SearchSchemaElementType\":\"INLINE_FILTER\"}], \"Projection\": {\"ProjectionType\": \"ALL\"}, \"Dimensions\": 1536, \"DistanceFunction\": \"COSINE\" } ]"

Dans cet exemple :

  • VectorAttributespécifie Embedding comme attribut qui contient des données vectorielles.

  • SearchSchemadéfinit Category comme une clé de partition d'index vectoriel (HASH), qui partitionne l'index par catégorie à des fins de mise à l'échelle. Il est également défini Brand comme unINLINE_FILTER, qui vous permet de filtrer les résultats de recherche par marque au niveau de la couche de stockage. Comme Category les deux Brand sont référencés dans le SearchSchema, ils doivent également être déclarés dansAttributeDefinitions, de la même manière que les attributs clés sont déclarés pour un index secondaire global.

  • Dimensionsest réglé sur 1536, ce qui correspond à la sortie des modèles d'intégration courants.

  • DistanceFunctionest défini surCOSINE, où les scores les plus faibles indiquent une plus grande similitude.

Ajouter un index vectoriel à une table existante

Utilisez l'UpdateTableAPI avec le VectorIndexUpdates paramètre pour ajouter un index vectoriel à une table existante. Cet exemple ajoute un second index indépendant nommé ProductEmbeddingIndexV2 à la même Products table.

aws dynamodb update-table \ --table-name Products \ --vector-index-updates \ "[ { \"Create\": { \"IndexName\": \"ProductEmbeddingIndexV2\", \"VectorAttribute\": {\"AttributeName\": \"Embedding\"}, \"Projection\": {\"ProjectionType\": \"ALL\"}, \"Dimensions\": 1536, \"DistanceFunction\": \"EUCLIDEAN\" } } ]"

Lorsque vous ajoutez un index vectoriel à une table existante, DynamoDB indique la progression de l'index dans deux champs de la DescribeTable réponse : une IndexStatus valeur et un booléen distinctBackfilling.

  1. IndexStatusest CREATING : DynamoDB est en train de configurer l'infrastructure d'index.

  2. IndexStatusest ACTIVE Backfilling défini sur true : DynamoDB remplit l'index avec les données existantes de la table de base. Les nouvelles écritures dans la table de base sont également répliquées dans l'index au cours de cette phase. Lorsqu'un index vectoriel est en cours de remplissage, SearchVectors renvoie une erreur. Attendez jusqu'à ce que ce Backfilling soit false le cas avant de lancer la recherche.

  3. IndexStatusest ACTIVE Backfilling défini sur false (ou absent) : l'index est entièrement renseigné et prêt pour les opérations de recherche.

Vous ne pouvez pas effectuer de recherche pendant que l'index est en cours de remplissage

SearchVectorsrenvoie une erreur lorsqu'un index vectoriel est en cours de remplissage. Utilisez-le DescribeTable pour vérifier à la fois le drapeau IndexStatus et le Backfilling drapeau, et attendez que IndexStatus c'Backfillingest ACTIVE et soit false avant de lancer la recherche. Il n'existe aucune valeur d'état de l'BACKFILLINGindex.

Écrire des éléments avec des données vectorielles

Vous écrivez des éléments avec des données vectorielles à l'aide des API d'écriture DynamoDB standard (PutItem, UpdateItemBatchWriteItem,TransactWriteItems). Stockez l'intégration vectorielle sous forme de liste de nombres (Ltype contenant des N éléments).

Comme un vecteur contient de nombreuses valeurs, enregistrez l'élément dans un fichier tel queitem.json, puis transmettez le fichier au AWS CLI.

{ "ProductId": { "S": "prod-123" }, "Category": { "S": "Electronics" }, "Title": { "S": "Wireless Headphones" }, "Embedding": { "L": [ { "N": "0.1234" }, { "N": "-0.5678" }, { "N": "0.9012" }, ... ] } }
aws dynamodb put-item \ --table-name Products \ --item file://item.json
La longueur du vecteur doit correspondre aux dimensions de l'index

Le Embedding vecteur illustré ici est abrégé. Dansitem.json, il doit contenir 1 536 valeurs correspondant à celles que Dimensions vous avez définies. ProductEmbeddingIndex L'écriture d'un vecteur avec un nombre de dimensions incorrect est rejetée.

DynamoDB valide les données vectorielles lorsque vous écrivez des éléments dans une table dotée d'un index vectoriel. Le tableau suivant décrit le comportement de validation.

Condition Comportement
L'attribut vectoriel comporte un nombre de dimensions erroné L'écriture est rejetée.
L'attribut clé de partition d'index vectoriel est manquant L'écriture réussit dans la table de base, mais l'élément n'est pas répliqué dans l'index vectoriel.
Le type d'attribut de clé de partition d'index vectoriel ne correspond pas au schéma d'index L'écriture est rejetée.
L'attribut de filtre en ligne est manquant L'écriture aboutit et l'élément est répliqué dans l'index vectoriel.
Les valeurs vectorielles ont une précision supérieure à celle de 32 bits à virgule flottante (f32) L'écriture réussit. Les valeurs sont stockées telles quelles dans la table de base mais perdent en précision lorsqu'elles sont répliquées dans l'index vectoriel.
L'attribut vectoriel est supprimé d'un élément L'entrée correspondante dans l'index vectoriel est supprimée.
Une clé de partition manquante entraîne une désindexation silencieuse

Si votre index vectoriel définit une clé de partition dans le SearchSchema et que vous écrivez un élément sans cet attribut (ou si vous le supprimez avecUpdateItem), l'écriture réussit dans la table de base mais l'élément est exclu silencieusement de l'index vectoriel. Il n'apparaîtra pas dans les SearchVectors résultats même si l'élément de la table de base et son intégration vectorielle existent toujours. Assurez-vous que chaque élément que vous souhaitez rechercher contient l'attribut clé de partition de l'index vectoriel.

Les intégrations périmées produisent des résultats incorrects

DynamoDB ne recalcule pas les intégrations pour vous. Si vous modifiez le contenu source à l'origine de l'incorporation (par exemple, si vous modifiez la description d'un produit), le vecteur enregistré n'est pas mis à jour automatiquement. Vous devez régénérer l'intégration avec votre modèle d'intégration et réécrire le nouveau vecteur dans l'élément. Sinon, l'index vectoriel continue à renvoyer des résultats basés sur l'ancien vecteur périmé, ce qui peut produire silencieusement des correspondances incorrectes.

Rechercher avec SearchVectors

Utilisez l'SearchVectorsAPI pour rechercher les éléments d'un index vectoriel qui ressemblent le plus à un vecteur de requête. Les résultats sont triés par pertinence, en commençant par l'élément le plus similaire. Les résultats de recherche sont finalement cohérents : il peut y avoir un bref délai entre l'écriture ou la mise à jour d'un vecteur et son apparition dans les résultats de recherche. Pour de plus amples informations, veuillez consulter Synchronisation continue de l'écriture.

Recherche de base

L'exemple suivant recherche les 10 éléments les plus similaires de l'ProductEmbeddingIndexindex. Comme une clé de partition d'index vectoriel (Category) est définie dans cet index SearchSchema, elle SearchConditionExpression doit inclure la valeur de la clé de partition de l'index vectoriel.

Enregistrez le vecteur de requête dans un fichier tel quequery-vector.json, sous la forme d'un tableau JSON simple de valeurs numériques.

[ { "N": "0.1234" }, { "N": "-0.5678" }, { "N": "0.9012" }, ... ]
aws dynamodb search-vectors \ --table-name Products \ --index-name ProductEmbeddingIndex \ --search-vector file://query-vector.json \ --top-k 10 \ --search-condition-expression "Category = :cat" \ --expression-attribute-values "{\":cat\": {\"S\": \"Electronics\"}}"

La réponse comprend un SearchResults tableau. Chaque élément contient la correspondance Item et un Score qui indique à quel point l'élément est similaire au vecteur de requête.

{ "SearchResults": [ { "Item": { "ProductId": { "S": "prod-456" }, "Category": { "S": "Electronics" }, "Title": { "S": "Bluetooth Speaker" } }, "Score": 0.0023 }, { "Item": { "ProductId": { "S": "prod-789" }, "Category": { "S": "Electronics" }, "Title": { "S": "Noise Cancelling Earbuds" } }, "Score": 0.0145 } ] }
Les attributs vectoriels sont exclus des résultats par défaut

Par défaut, les résultats de SearchVectors n'incluent pas l'attribut vectoriel (l'intégration). Les données vectorielles sont volumineuses et vous n'en avez généralement pas besoin dans la réponse. Les résultats incluent les autres attributs projetés et la Score valeur. Pour inclure l'attribut vectoriel, demandez-le avec unProjectionExpression. Pour de plus amples informations, veuillez consulter En utilisant ProjectionExpression.

SearchVector est une liste simple, pas un type DynamoDB L

Le paramètre de SearchVector requête est un tableau JSON simple d'objets numériques ([{"N": "0.1234"}, ...]). Ne l'encapsulez pas dans un L type DynamoDB comme vous le feriez lorsque vous stockez un vecteur dans un attribut d'élément. Le L wrapper n'est utilisé que lors de l'écriture ou de la lecture de données vectorielles dans les attributs des éléments.

La signification de Score dépend de la fonction de distance que vous avez choisie lors de la création de l'index. Pour COSINE etEUCLIDEAN, des scores plus faibles indiquent une plus grande similitude. CarDOT_PRODUCT, des scores plus élevés indiquent une plus grande similitude.

Filtrer avec SearchConditionExpression

Permet SearchConditionExpression de filtrer les résultats de recherche en fonction de la clé de partition de l'index vectoriel et des attributs de filtre en ligne définis dans le SearchSchema. Cette expression utilise la même syntaxe que les autres paramètres d'expression DynamoDB.

L'exemple suivant recherche les éléments de la Electronics catégorie (clé de partition de l'index vectoriel) à l'aide d'un filtre Brand intégré.

aws dynamodb search-vectors \ --table-name Products \ --index-name ProductEmbeddingIndex \ --search-vector file://query-vector.json \ --top-k 10 \ --search-condition-expression "Category = :cat AND Brand = :brand" \ --expression-attribute-values "{\":cat\": {\"S\": \"Electronics\"}, \":brand\": {\"S\": \"Acme\"}}"

Si votre index vectoriel possède une clé de partition définie dans le SearchSchema, vous devez l'inclure dans leSearchConditionExpression. Les attributs de filtre en ligne sont facultatifs.

L'opérateur d'égalité (=) est pris en charge à la fois SearchConditionExpression pour la clé de partition de l'index vectoriel et pour les attributs de filtre en ligne. Les opérateurs de comparaison, de plage et d'appartenance à un ensemble (<>,<,<=, >>=,IN) ne sont pas encore disponibles.

Ce filtrage permet d'étendre une recherche de similarité à un sous-ensemble de vos données, une exigence courante dans les applications RAG (Retrieval Augmented Generation) à locataires multiples. Par exemple, pour rechercher des documents similaires à une requête mais appartenant à un seul tenant, définissez l'attribut tenant comme clé de partition d'index vectoriel (HASH) dans le SearchSchema et transmettez sa valeur à chaque recherche. Cela isole les résultats pour ce locataire. Cela améliore également les performances, car la recherche examine uniquement les données pertinentes. Utilisez des attributs de filtre intégrés pour les contraintes d'égalité supplémentaires, telles qu'un type de document ou un statut, que vous souhaitez appliquer à la partition routée.

La définition de la portée des clés de partition n'est pas une limite de sécurité

L'utilisation d'une clé de partition pour étendre les recherches à un seul locataire constitue une optimisation de la localisation des données et des performances, et non un mécanisme de contrôle d'accès. Tout principal disposant d'une dynamodb:SearchVectors autorisation sur l'index peut rechercher n'importe quelle valeur de clé de partition. Étant donné que les clés de condition de contrôle d'accès affiné (FGAC) ne s'appliquent pas àSearchVectors, vous ne pouvez pas restreindre l'accès à des valeurs de clé de partition individuelles au niveau de la politique IAM. dynamodb:LeadingKeys Si votre charge de travail nécessite une isolation stricte des locataires au niveau de la couche de données, utilisez des tables ou des index distincts avec des autorisations IAM distinctes pour chaque locataire.

En utilisant ProjectionExpression

Utilisez cette ProjectionExpression option pour renvoyer uniquement des attributs spécifiques dans les résultats de recherche. Cela peut réduire la taille de la réponse lorsque vous n'avez pas besoin de tous les attributs projetés. Comme il ProductEmbeddingIndex définit une clé de partition d'index vectoriel (Category) dans son SearchSchema, cet exemple inclut toujours la valeur de la clé de partition d'index vectoriel dansSearchConditionExpression.

aws dynamodb search-vectors \ --table-name Products \ --index-name ProductEmbeddingIndex \ --search-vector file://query-vector.json \ --top-k 5 \ --search-condition-expression "Category = :cat" \ --expression-attribute-values "{\":cat\": {\"S\": \"Electronics\"}}" \ --projection-expression "ProductId, Title"
Seuls les attributs projetés peuvent être renvoyés

Vous ne pouvez renvoyer que les attributs projetés dans l'index vectoriel. Les attributs qui ne figurent pas dans la projection de l'indice ne peuvent pas être renvoyés parSearchVectors.

Suppression d’un index vectoriel

Utilisez l'UpdateTableAPI avec le VectorIndexUpdates paramètre pour supprimer un index vectoriel.

aws dynamodb update-table \ --table-name Products \ --vector-index-updates \ "[ {\"Delete\": {\"IndexName\": \"ProductEmbeddingIndex\"}} ]"

Lorsque vous supprimez un index vectoriel, DynamoDB supprime l'index et toutes ses données. Cette opération n'affecte pas la table de base ni ses éléments.