Présentation
Avec des requêtes de recherche volumineuses, la mise à jour de vos index est importante pour toujours disposer des informations les plus précises. Aujourd'hui, vous pouvez mettre à jour vos index Vector Search à l'aide d'une mise à jour groupée, qui vous permet d'insérer et de supprimer des points de données via une programmation par lots ou avec la mise à jour en continu, ce qui vous permet de mettre à jour et d'interroger votre index en seulement quelques secondes.
Vous pouvez également utiliser UpdateIndex
pour mettre à jour vos champs de métadonnées importants, tels que display_name
, description
et labels
. Vous pouvez également ajouter des tags facultatifs à votre index pour faciliter la diversification des résultats ou le filtrage des requêtes avant indexation.
Mettre à jour un index de traitement par lot
Pour mettre à jour le contenu d'un index Index
existant, utilisez la méthode IndexService.UpdateIndex
.
Pour remplacer le contenu d'un Index
existant :
- Définissez
Index.metadata.contentsDeltaUri
sur l'URI Cloud Storage incluant les vecteurs que vous souhaitez mettre à jour. - Définissez
isCompleteOverwrite
sur "true". Lorsque ce champ est défini sur "true", l'intégralité de l'index est complètement remplacée par le nouveau fichier de métadonnées que vous fournissez.
Si vous définissez le champ contentsDeltaUri
lorsque vous appelez IndexService.UpdateIndex
, aucun autre champ d'index (tel que displayName
, description
ou userLabels
) ne peut être mis à jour au cours du même appel.
gcloud
Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :
- LOCAL_PATH_TO_METADATA_FILE : chemin d'accès local au fichier de métadonnées.
- INDEX_ID : ID de l'index.
- LOCATION : région dans laquelle vous utilisez Vertex AI.
- PROJECT_ID : L'ID de votre projet Google Cloud.
Exécutez la commande suivante :
Linux, macOS ou Cloud Shell
gcloud ai indexes update INDEX_ID \ --metadata-file=LOCAL_PATH_TO_METADATA_FILE \ --region=LOCATION \ --project=PROJECT_ID
Windows (PowerShell)
gcloud ai indexes update INDEX_ID ` --metadata-file=LOCAL_PATH_TO_METADATA_FILE ` --region=LOCATION ` --project=PROJECT_ID
Windows (cmd.exe)
gcloud ai indexes update INDEX_ID ^ --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^ --region=LOCATION ^ --project=PROJECT_ID
REST
Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
- INPUT_DIR : chemin d'accès au répertoire Cloud Storage du contenu de l'index.
- INDEX_ID : ID de l'index.
- LOCATION : région dans laquelle vous utilisez Vertex AI.
- PROJECT_ID : L'ID de votre projet Google Cloud.
- PROJECT_NUMBER : numéro de projet généré automatiquement pour votre projet.
Méthode HTTP et URL :
PATCH https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID
Corps JSON de la requête :
{ "metadata": { "contentsDeltaUri": "INPUT_DIR", "isCompleteOverwrite": true } }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.aiplatform.v1.UpdateIndexOperationMetadata", "genericMetadata": { "createTime": "2022-01-12T23:56:14.480948Z", "updateTime": "2022-01-12T23:56:14.480948Z" } } }
Console
Suivez ces instructions pour mettre à jour le contenu d'un index par lot.
- Dans la section "Vertex AI" de la console Google Cloud, accédez à la section Déployer et utiliser. Sélectionnez Vector Search.
- Sélectionnez l'index que vous souhaitez mettre à jour. La page Informations sur l'index s'affiche.
- Sélectionnez Modifier l'index. Un volet de modification d'index s'ouvre.
- Dans le champ Cloud Storage, recherchez et sélectionnez le dossier Cloud Storage dans lequel vos données vectorielles sont stockées.
- (Facultatif) Cochez la case d'écrasement complet si vous souhaitez écraser toutes les données existantes.
- Cliquez sur Mettre à jour.
- Cliquez sur Terminé pour fermer le panneau.
Si des déploiements sont associés à l'Index
(voir le champ Index.deployed_indexes
), lorsque des modifications de l'Index
d'origine sont en cours, la propriété DeployedIndex
est automatiquement mise à jour de manière asynchrone en arrière-plan pour refléter ces changements.
Pour vérifier que la modification a été propagée, comparez l'heure de fin de l'opération de mise à jour de l'index et la valeur DeployedIndex.index_sync_time
.
Mettre à jour un index en continu
Avec les mises à jour en continu, vous pouvez mettre à jour et interroger votre index en quelques secondes. Pour le moment, vous ne pouvez pas utiliser les mises à jour en continu sur un index de mise à jour groupée existant. Vous devez donc créer un nouvel index. Pour en savoir plus, consultez la section Créer un index pour la mise à jour en continu.
Vous êtes facturé 0,45 $ par Go utilisé pour les mises à jour en continu. Pour connaître le détail des tarifs, consultez la page Tarification de Vertex AI. Les mises à jour en continu sont directement appliquées aux index déployés en mémoire, qui sont ensuite reflétés dans les résultats de la requête après un court délai.
Effectuer une opération upsert sur des points de données
Utilisez ces exemples pour voir comment effectuer une opération upsert sur un point de données. N'oubliez pas que upsert-datapoints
accepte les formats JSON sous forme de tableau uniquement.
Python
Python
Curl
La limite de quota de débit concerne la quantité de données incluse dans une opération upsert. Si l'ID de point de données existe dans l'index, l'embedding est mis à jour. Dans le cas contraire, un nouvel embedding est ajouté.
DATAPOINT_ID_1=
DATAPOINT_ID_2=
curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
-d '{datapoints: [{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...]},
{datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...]}]}'
Avec la recherche hybride, qui est en bêta publique, les embeddings creuses et denses pour un point de données sont prises en charge. Dans une opération upsert, l'omission d'un embedding dense supprime la représentation dense, et l'omission d'un embedding creux supprime la représentation creuse.
Cet exemple met à jour des embeddings denses et des embeddings creuses.
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", feature_vector: [0.111, 0.111], "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
Cet exemple met à jour les embeddings denses et supprime les embeddings creuses.
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", feature_vector: [0.111, 0.111]}]}'
Cet exemple met à jour les embeddings creuses et supprime les embeddings denses.
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
Console
Console
Suivez les instructions ci-dessous pour mettre à jour du contenu vers un index en continu.
- Dans la console Google Cloud, accédez à la page Vector Search.
- Sélectionnez l'index que vous souhaitez mettre à jour. La page Informations sur l'index s'affiche.
- Cliquez sur Modifier l'index. Un volet de modification d'index s'ouvre.
- Dans le volet, sélectionnez l'onglet Point de données upsert pour ajouter du contenu.
- Saisissez l'ID du point de données.
- Saisissez un ou plusieurs types d'embedding :
- Embedding dense : saisissez un tableau de valeurs à virgule flottante séparées par des virgules. Le nombre de valeurs doit correspondre aux dimensions de l'index.
- Embedding creux (bêta publique) :
- Saisissez les dimensions de l'embedding creux sous la forme d'un tableau d'entiers séparés par une virgule. Le nombre de valeurs ne doit pas nécessairement correspondre aux dimensions de l'index.
- Saisissez les valeurs sous la forme d'un tableau de valeurs à virgule flottante séparées par une virgule. Le nombre de valeurs doit correspondre au nombre de dimensions de l'embedding creux.
- Facultatif : Pour activer le filtrage par restriction de jeton sur ce point de données, cliquez sur Ajouter une restriction de jeton, puis saisissez un espace de noms et des chaînes séparées par une virgule en tant que jetons.
- Facultatif : Pour activer le filtrage par restrictions numériques sur ce point de données, cliquez sur Ajouter une restriction numérique, saisissez un espace de noms, sélectionnez un type de nombre, puis saisissez une valeur.
- Facultatif : Pour éviter d'obtenir de nombreux résultats similaires, saisissez une chaîne de balise de regroupement.
- Cliquez sur Upsert.
- Cliquez sur Terminé pour fermer le panneau.
La limite de quota de débit concerne la quantité de données incluse dans une opération upsert. Si l'ID de point de données existe dans l'index, l'embedding est mis à jour. Dans le cas contraire, un nouvel embedding est ajouté.
Mettre à jour les métadonnées dynamiques
Vous pouvez être amené à mettre à jour les restrictions de flux ou les restrictions numériques pour différentes raisons. Par exemple, lorsque vous traitez un volume important de données évoluant rapidement, vous pouvez donner la priorité à certains flux de données. La mise à jour directe des restrictions ou des restrictions numériques vous permet d'affiner le centre d'intérêt en temps réel, garantissant ainsi que les données les plus importantes sont traitées ou mises en évidence immédiatement.
Vous pouvez mettre à jour directement les restrictions de points de données et les restrictions numériques dans un index de diffusion sans le coût de compactage d'une mise à jour complète.
Pour effectuer ces mises à jour exclusivement sur les métadonnées, vous devez ajouter le champ update_mask
à la requête. La valeur de update_mask
doit être définie sur all_restricts
.
Les valeurs de restriction et de restriction numérique définies dans les points de données doivent correspondre aux nouvelles valeurs que vous souhaitez appliquer dans la mise à jour.
L'exemple suivant montre comment ajouter des restrictions à deux points de données existants.
DATAPOINT_ID_1=
DATAPOINT_ID_2=
curl -H "Content-Type: application/json" -H "Authorization: Bearer gcloud auth print-access-token" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
-d '{datapoints:
[{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...], restricts:[{namespace: "color", allow_list: ["red"]}]},
{datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...], restricts:[{namespace: "color", allow_list: ["red"]}]}
], update_mask: "all_restricts"}'
Supprimer des points de données
Vous devrez peut-être supprimer des points de données de votre index en continu. Pour ce faire, utilisez curl ou la console Google Cloud.
Un cas d'utilisation clé pour la suppression d'un point de données d'un index consiste à maintenir la parité entre l'index et sa source réelle. Prenons l'exemple d'un libraire qui utilise un embedding vectoriel pour représenter son inventaire de livres à des fins de recherche et de recommandation. Lorsqu'un livre est vendu ou retiré des stocks, la suppression du point de données correspondant de l'index garantit que les résultats de recherche et les recommandations restent précis et à jour.
Curl
curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/indexes/{INDEX_ID}:removeDatapoints -d '{datapoint_ids: ["'{DATAPOINT_ID_1}'", "'{DATAPOINT_ID_2}'"]}'
Console
Console
Suivez ces instructions pour supprimer un point de données de l'index en continu.
- Dans la section "Vertex AI" de la console Google Cloud, accédez à la section Déployer et utiliser. Sélectionnez Vector Search.
- Sélectionnez l'index en continu que vous souhaitez mettre à jour. La page Informations sur l'index s'affiche.
- Sélectionnez Modifier l'index. Un volet de modification d'index s'ouvre.
- Dans le volet, sélectionnez l'onglet Supprimer des points de données.
- Ajoutez jusqu'à 20 points de données en spécifiant une liste d'ID de points de données séparés par une virgule.
- Cliquez sur Supprimer.
- Cliquez sur Terminé pour fermer le panneau.
Compactage
Votre index est régulièrement recompilé pour prendre en compte toutes les mises à jour depuis votre dernière recompilation. Cette recompilation, ou "compactage", améliore les performances et la fiabilité des requêtes. Les compactages se produisent à la fois pour les mises à jour en continu et pour les mises à jour groupées.
Mise à jour en continu : Vector Search utilise des métriques basées sur l'heuristique pour déterminer à quel moment déclencher le compactage. Si les données non compactées les plus anciennes datent de cinq jours, le compactage est toujours déclenché. Vous êtes facturé pour le coût de la recompilation de l'index au même tarif que la mise à jour groupée, en plus des coûts de mise à jour en continu.
Mise à jour groupée : se produit lorsque la taille de l'ensemble de données incrémentiel est supérieure à 20 % de la taille de l'ensemble de données de base.
Recompiler et interroger votre index
Vous pouvez envoyer des requêtes de correspondance ou de correspondance par lot comme d'habitude à l'aide de la CLI grpc, de la bibliothèque cliente ou du SDK Vertex AI pour Python. Lorsque vous recompilez la requête, les mises à jour devraient s'afficher en quelques secondes. Pour savoir comment interroger un index, consultez la section Interroger les index pour obtenir les voisins les plus proches.
Champs facultatifs
Lorsque vous créez un index, vous pouvez utiliser certains champs facultatifs pour affiner vos requêtes.
Opération upsert avec restrictions
Une opération upsert sur votre index avec l'ajout d'une restriction permet d'appliquer des tags à vos points de données afin qu'ils soient déjà identifiés pour le filtrage au moment de la requête. Vous pouvez ajouter des tags de restriction pour limiter les résultats présentés dans vos données avant l'envoi d'une requête. Par exemple, un client souhaite exécuter une requête sur un index, mais veut s'assurer que les résultats n'affichent que des articles correspondant à "rouge" dans une recherche de chaussures. Dans l'exemple suivant, l'index est en train d'être mis à jour et de filtrer toutes les paires de chaussure rouges, mais refuse les bleues. Cela garantit, avant l'exécution, des filtres de recherche dans les meilleures options spécifiques parmi un index volumineux et varié.
En plus des restrictions de jeton, l'exemple utilise des restrictions numériques. Dans ce cas, le point de données est associé à un prix de 20, à une longueur de 0,3 et à une largeur de 0,5. Au moment de la requête, vous pouvez utiliser ces restrictions numériques pour filtrer les résultats afin de limiter les résultats de requête en fonction des valeurs de prix, de longueur et de largeur. Par exemple, ce point de données apparaîtra dans une requête filtrant les critères de prix > 25, de longueur < 1 et de largeur < 1.
Pour en savoir plus sur le filtrage, consultez la page Vector Search pour l'indexation.
Python
# Upsert datapoints
_TEST_DATAPOINT_1 = aiplatform_v1.types.index.IndexDatapoint(
datapoint_id="3",
feature_vector=[0.00526886899, -0.0198396724],
restricts=[
aiplatform_v1.types.index.IndexDatapoint.Restriction(namespace="Color", allow_list=["red"])
],
numeric_restricts=[
aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
namespace="cost",
value_int=1,
)
],
)
_TEST_DATAPOINT_2 = aiplatform_v1.types.index.IndexDatapoint(
datapoint_id="4",
feature_vector=[0.00526886899, -0.0198396724],
numeric_restricts=[
aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
namespace="cost",
value_double=0.1,
)
],
crowding_tag=aiplatform_v1.types.index.IndexDatapoint.CrowdingTag(crowding_attribute="crowding"),
)
_TEST_DATAPOINT_3 = aiplatform_v1.types.index.IndexDatapoint(
datapoint_id="5",
feature_vector=[0.00526886899, -0.0198396724],
numeric_restricts=[
aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
namespace="cost",
value_float=1.1,
)
],
)
_TEST_DATAPOINTS = [_TEST_DATAPOINT_1, _TEST_DATAPOINT_2, _TEST_DATAPOINT_3]
my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=_TEST_DATAPOINTS)
# Dynamic metadata update
_TEST_DATAPOINT_4 = aiplatform_v1.types.index.IndexDatapoint(
datapoint_id="-2",
numeric_restricts=[
aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
namespace="cost",
value_float=1.1,
)
],
)
my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=[_TEST_DATAPOINT4], update_mask=["all_restricts"])
curl
curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
{
datapoint_id: "'${DATAPOINT_ID_1}'",
feature_vector: [...],
restricts: { namespace: "color", allow_list: ["red"], deny_list: ["blue"]},
numeric_restricts: [{namespace: "price", value_int: 20}, {namespace: "length", value_float: 0.3}, {namespace: "width", value_double: 0.5}]
}
]}'
Opération upsert avec regroupement
Le tag de regroupement limite les résultats similaires en améliorant la diversité des résultats.
Le regroupement est une contrainte sur une liste de voisins, produite par une recherche des voisins les plus proches qui nécessite qu'un certain nombre de valeurs, au maximum, parmi un groupe de résultats, renvoient la même valeur de crowding_attribute
. Par exemple, supposons que vous reveniez sur votre site d'achat en ligne pour acheter des chaussures. Vous souhaitez voir une grande variété de couleurs dans les résultats, mais peut-être dans un style unique, comme des chaussures de football. Vous pouvez demander qu'un maximum de trois paires de chaussures de la même couleur soient renvoyées en définissant per_crowding_attribute_num_neighbors
= 3 dans votre requête, en supposant que vous définissiez crowding_Attribute sur la couleur des chaussures lors de l'insertion du point de données.
Ce champ représente le nombre maximal de correspondances autorisées avec le même tag de regroupement.
curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
{
datapoint_id: "'${DATAPOINT_ID_1}'",
feature_vector: [...],
restricts: { namespace: "type", allow_list: ["cleats"]}
crowding_tag: { crowding_attribute: "red-shoe"},
}
]}'
Étapes suivantes
- En savoir plus sur les paramètres de configuration d'index
- Découvrez comment surveiller un index.