Pour créer un index ou mettre à jour un index existant, vous devez fournir des vecteurs à Vector Search, dont le format et la structure sont décrits dans les sections suivantes.
Prérequis
Stockez vos données d'entrée dans un bucket Cloud Storage, dans votre projet Google Cloud .
Les fichiers de données d'entrée doivent être organisés comme suit :
- Chaque lot de fichiers de données d'entrée doit se trouver dans un seul et même répertoire Cloud Storage.
- Les fichiers de données doivent être placés directement sous
batch_rootet nommés avec les suffixes suivants :.csv,.jsonet.avro. - Le répertoire racine de lot peut contenir jusqu'à 5 000 objets (fichiers).
- Chaque fichier de données est interprété comme un ensemble d'enregistrements. Le format de l'enregistrement est déterminé par le suffixe du nom de fichier et les exigences inhérentes au format sont décrites. Consultez la page Formats de fichiers de données.
- Chaque enregistrement doit avoir un
idet un vecteur de caractéristiques en plus de vos champs facultatifs compatibles avec Vertex AI Feature Store, tels que les restrictions et le regroupement. - Un sous-répertoire nommé
deletepeut être présent. Chaque fichier situé directement sousbatch_root/deleteest traité sous la forme d'un fichier texte d'enregistrementsid, avec unidsur chaque ligne. - Les autres sous-répertoires ne sont pas autorisés.
- Le transcodage des fichiers compressés au format gzip n'est pas accepté comme données d'entrée.
Traitement des données d'entrée
- Tous les enregistrements de tous les fichiers de données, y compris ceux situés sous
delete, constituent un seul et même lot d'entrées. - L'ordre relatif des enregistrements dans un fichier de données est sans importance.
- Un ID ne doit apparaître qu'une seule fois dans un lot. S'il existe un doublon avec le même ID, ces deux éléments ne seront affichés et comptabilisés que comme un seul vecteur.
- Un ID ne peut pas figurer à la fois dans un fichier de données standard et dans un fichier de données de suppression.
- Tous les ID d'un fichier de données sous "delete" sont supprimés de la version d'index suivante.
- Les enregistrements issus de fichiers de données standards sont inclus dans la version suivante, en écrasant une valeur présente dans une ancienne version d'index.
Voici des exemples d'embeddings denses, creux et hybrides :
Embeddings denses
{"id": "1", "embedding": [1,1,1]} {"id": "2", "embedding": [2,2,2]}Embeddings creux :
{"id": "3", "sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1, 4]}} {"id": "4", "sparse_embedding": {"values": [-0.4, 0.2, -1.3], "dimensions": [10, 20, 20]}}Embeddings hybrides :
{"id": "5", "embedding": [5, 5, -5], "sparse_embedding": {"values": [0.1], "dimensions": [500]}} {"id": "6", "embedding": [6, 7, -8.1], "sparse_embedding": {"values": [0.1, -0.2], "dimensions": [40, 901]}}
Voici un exemple d'organisation de fichiers de données d'entrée valide :
batch_root/
feature_file_1.csv
feature_file_2.csv
delete/
delete_file.txt
Les fichiers feature_file_1.csv et feature_file_2.csv contiennent des enregistrements au format CSV. Le fichier delete_file.txt contient la liste des identifiants d'enregistrement à supprimer de la prochaine version d'index.
Formats de fichiers de données
JSON
- Encodez le fichier JSON en UTF-8.
- Chaque ligne du fichier JSON est interprétée comme un objet JSON distinct.
- Chaque enregistrement doit contenir un champ
idpour spécifier l'ID du vecteur. - Chaque enregistrement doit contenir au moins l'un des éléments
embeddingousparse_embedding. - Le champ
embeddingest un tableau de nombres à virgule flottanteNqui représente le vecteur de caractéristiques, oùNest la dimension du vecteur de caractéristiques configuré au moment de la création de l'index. Ce champ ne peut être utilisé que pour les embeddings denses.configs.dimensions, spécifié au moment de la création de l'index, doit être de la même longueur queembeddings.configs.dimensionss'applique uniquement àembedding, et non àsparse_embedding.
- Le champ
sparse_embeddingest un objet comportant les champsvaluesetdimensions. Le champvaluesest une liste de nombres à virgule flottante qui représente le vecteur de caractéristiques, et le champdimensionsest une liste d'entiers qui représentent la dimension dans laquelle se trouve la valeur correspondante. Par exemple, un embedding creux semblable à[0,0.1,0,0,0.2]peut être représenté par"sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1,4]}. Ce champ ne peut être utilisé que pour les embeddings creux.- La longueur de
sparse_embedding.valuesdoit être identique à celle desparse_embedding.dimensions. Elles n'ont pas besoin d'avoir la même longueur queconfigs.dimensions, qui est spécifié au moment de la création de l'index et ne s'applique pas àsparse_embedding.
- La longueur de
- Vous pouvez inclure un champ
restrictsfacultatif qui spécifie un tableau d'objetsTokenNamespacedans les restrictions. Pour chaque objet :- Spécifiez un champ
namespacequi correspond àTokenNamespace.namespace. - Un champ
allowfacultatif peut être défini sur un tableau de chaînes correspondant à la liste deTokenNamespace.string_tokens. - Un champ
denyfacultatif peut être défini sur un tableau de chaînes correspondant à la liste deTokenNamespace.string_blacklist_tokens. - La valeur du champ
crowding_tag, s'il est présent, doit correspondre à une chaîne.
- Spécifiez un champ
- Vous pouvez inclure un champ
numeric_restrictsfacultatif qui spécifie un tableau deNumericRestrictNamespace. Pour chaque objet :- Spécifiez un champ
namespacequi correspond àNumericRestrictNamespace.namespace. - L'un des champs de valeur
value_int,value_floatetvalue_double. - Il ne doit pas comporter de champ nommé "op". Ce champ est réservé aux requêtes.
- Spécifiez un champ
Avro
- Utilisez un fichier Avro valide.
- Pour représenter un point de données creux uniquement, fournissez un embedding creux dans le champ
sparse_embeddinget saisissez une liste vide dans le champembedding. Créez des enregistrements conformes au schéma suivant :
{ "type": "record", "name": "FeatureVector", "fields": [ { "name": "id", "type": "string" }, { "name": "embedding", "type": { "type": "array", "items": "float" } }, { "name": "sparse_embedding", "type": [ "null", { "type": "record", "name": "sparse_embedding", "fields": [ { "name": "values", "type": { "type": "array", "items": "float" } }, { "name": "dimensions", "type": { "type": "array", "items": "long" } } ] } ] }, { "name": "restricts", "type": [ "null", { "type": "array", "items": { "type": "record", "name": "Restrict", "fields": [ { "name": "namespace", "type": "string" }, { "name": "allow", "type": [ "null", { "type": "array", "items": "string" } ] }, { "name": "deny", "type": [ "null", { "type": "array", "items": "string" } ] } ] } } ] }, { "name": "numeric_restricts", "type": [ "null", { "type": "array", "items": { "name": "NumericRestrict", "type": "record", "fields": [ { "name": "namespace", "type": "string" }, { "name": "value_int", "type": [ "null", "int" ], "default": null }, { "name": "value_float", "type": [ "null", "float" ], "default": null }, { "name": "value_double", "type": [ "null", "double" ], "default": null } ] } } ], "default": null }, { "name": "crowding_tag", "type": [ "null", "string" ] } ] }
CSV
- Format :
ID,N feature vector values,Any number of dimension:value sparse values,name=value lists - Encodez le fichier CSV en UTF-8.
- Chaque ligne du fichier CSV doit contenir exactement un enregistrement.
- La première valeur de chaque ligne doit être l'ID de vecteur, qui doit être une chaîne UTF-8 valide.
- Après l'ID, au moins un embedding dense ou creux doit être spécifié.
- Pour un embedding dense, les valeurs
Nsuivantes représentent le vecteur de caractéristiques, oùNest la dimension du vecteur de caractéristiques configuré au moment de la création de l'index. - Pour un embedding creux, vous pouvez spécifier n'importe quel nombre de valeurs
dimension:value. Dans ce cas,valueest analysé en tant que nombre à virgule flottante etdimensionen tant que valeurlong. - Pour un embedding hybride présentant des embeddings creux et denses, les embeddings denses doivent être spécifiés avant les embeddings creux.
- Les valeurs de vecteur de caractéristiques doivent être des littéraux à virgule flottante, tels que définis dans les spécifications du langage Java.
- Les valeurs supplémentaires peuvent être au format
name=value. - Le nom
crowding_tagest interprété comme le tag de regroupement et ne peut apparaître qu'une seule fois dans l'enregistrement. Toutes les autres paires
name=valuesont interprétées comme des restrictions d'espace de noms. Le même nom peut être répété s'il existe plusieurs valeurs dans un espace de noms.Par exemple,
color=red,color=bluereprésente ceTokenNamespace:{ "namespace": "color" "string_tokens": ["red", "blue"] }Si la valeur commence par
!, le reste de la chaîne est interprété comme une valeur exclue.Par exemple,
color=!redreprésente ceTokenNamespace:{ "namespace": "color" "string_blacklist_tokens": ["red"] }Les paires
#name=numericValueavec un suffixe de type numérique sont interprétées comme des restrictions d'espace de noms numérique. Le suffixe de type numérique estipour "int",fpour "float" etdpour "double". Le même nom ne doit pas être répété, car une seule valeur doit être associée par espace de noms.Par exemple,
#size=3ireprésente ceNumericRestrictNamespace:{ "namespace": "size" "value_int": 3 }#ratio=0.1freprésente ceNumericRestrictNamespace:{ "namespace": "ratio" "value_float": 0.1 }#weight=0.3dreprésente ceNumericRestriction:{ "namespace": "weight" "value_double": 0.3 }L'exemple suivant est un point de données avec
id: "6",embedding: [7, -8.1],sparse_embedding: {values: [0.1, -0.2, 0.5], dimensions: [40, 901, 1111]}, le tag de regroupementtest, la liste d'autorisation de jetonscolor: red, blue, la liste de blocage des jetonscolor: purpleet une valeur numérique de restriction deratioavec le nombre à virgule flottante0.1:6,7,-8.1,40:0.1,901:-0.2,1111:0.5,crowding_tag=test,color=red,color=blue,color=!purple,ratio=0.1f
Étapes suivantes
- Découvrez comment Créer et gérer votre index.