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.
Rubriques
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:CreateTableou est autorisée àdynamodb:UpdateTablecréer des index vectoriels. -
Votre identité IAM est
dynamodb:SearchVectorsautorisé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-based point final.account-id.search-ddb.region.amazonaws.com -
search-dynamodb.— Dual-stack point de terminaison, compatible avec IPv4 et IPv6.region.api.aws
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 :
-
Envoyez votre contenu source (par exemple, une description de produit) à un modèle d'intégration et recevez un vecteur.
-
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). -
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 que
SearchVector.
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écifieEmbeddingcomme attribut qui contient des données vectorielles. -
SearchSchemadéfinitCategorycomme 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éfiniBrandcomme unINLINE_FILTER, qui vous permet de filtrer les résultats de recherche par marque au niveau de la couche de stockage. CommeCategoryles deuxBrandsont 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.
-
IndexStatusestCREATING: DynamoDB est en train de configurer l'infrastructure d'index. -
IndexStatusestACTIVEBackfillingdéfini surtrue: 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,SearchVectorsrenvoie une erreur. Attendez jusqu'à ce que ceBackfillingsoitfalsele cas avant de lancer la recherche. -
IndexStatusestACTIVEBackfillingdéfini surfalse(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.