Génération autonome d'embeddings
Ce document explique comment utiliser la génération autonome d'embeddings pour vos données, ce qui permet à BigQuery de gérer une colonne d'embeddings dans une table en fonction d'une colonne source. Lorsque vous ajoutez ou modifiez des données dans la colonne source, BigQuery génère ou met à jour automatiquement la colonne d'embedding pour ces données à l'aide d'un modèle d'embedding Vertex AI. Cela peut être utile si vous souhaitez que BigQuery gère vos embeddings lorsque vos données sources sont régulièrement mises à jour.
Les embeddings sont utiles pour les applications d'IA générative modernes telles que la génération augmentée par récupération (RAG), mais ils peuvent être complexes à créer, à gérer et à interroger. Vous pouvez utiliser la génération autonome d'embeddings pour simplifier la création, la maintenance et l'interrogation d'embeddings à utiliser dans les recherches de similarité et d'autres applications d'IA générative.
Par exemple, vous pouvez utiliser des requêtes semblables à celles ci-dessous pour créer une table avec la génération d'embeddings autonomes activée, insérer des données, puis effectuer une recherche sémantique :
CREATE TABLE mydataset.products (
name STRING,
description STRING,
description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(description, connection_id => 'us.example_connection',
endpoint => 'text-embedding-005'))
STORED OPTIONS( asynchronous = TRUE ));
# Values in the description_embedding column are automatically generated.
INSERT INTO mydataset.products (name, description) VALUES
("Super slingers"), ("An exciting board game for the whole family"), ...;
SELECT * FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");
Avant de commencer
Pour activer la génération autonome d'intégrations dans une table, vous devez disposer des autorisations et de la connexion nécessaires.
Rôles requis
Pour obtenir les autorisations nécessaires pour activer la génération autonome d'embeddings, demandez à votre administrateur de vous accorder les rôles IAM suivants :
-
Pour utiliser une ressource de connexion :
Utilisateur de connexion BigQuery (
roles/bigquery.connectionUser) sur la connexion -
Pour créer une table :
Éditeur de données BigQuery (
roles/bigquery.dataEditor) sur la table -
Attribuez le rôle suivant au compte de service de la connexion afin qu'il puisse accéder aux modèles hébergés dans les points de terminaison Vertex AI :
Utilisateur Vertex AI (
roles/aiplatform.user) sur le projet qui contient la connexion.
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.
Créer une connexion et accorder l'autorisation à un compte de service
Pour activer la génération autonome d'embeddings dans un tableau, vous devez créer une connexion à une ressource cloud.
Ensuite, attribuez le rôle Utilisateur Vertex AI (roles/aiplatform.user) au compte de service créé lorsque vous avez créé la connexion.
Créer une table avec la génération autonome d'embeddings
Vous pouvez utiliser la génération autonome d'embeddings pour générer des embeddings à l'aide de la fonction AI.EMBED dans une instruction CREATE TABLE.
CREATE TABLE DATASET_ID.TABLE (
[COLUMN, ...]
STRING_COL STRING,
EMBEDDING_COL_NAME STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(
STRING_COL,
connection_id => CONNECTION_ID,
endpoint => ENDPOINT)
)
STORED OPTIONS (asynchronous = TRUE)
);
Remplacez les éléments suivants :
DATASET_ID: nom de l'ensemble de données dans lequel vous souhaitez créer la table.TABLE: nom de la table sur laquelle créer la génération autonome d'embeddings.COLUMN, ...: toutes les colonnes que votre tableau doit contenir en plus de celle que vous souhaitez intégrer automatiquement.STRING_COL: nom de la colonneSTRINGque vous souhaitez intégrer automatiquement.EMBEDDING_COL_NAME: nom de la colonne d'embeddings générée automatiquement.CONNECTION_ID: valeurSTRINGcontenant le nom d'une connexion à utiliser, par exemplemy_project.us.example_connection. Vous devez attribuer le rôle Utilisateur Vertex AI au compte de service de la connexion dans le projet dans lequel vous créez la table.ENDPOINT: valeurSTRINGqui spécifie un point de terminaison de modèle d'embedding textuel Vertex AI compatible à utiliser pour le modèle d'embedding textuel. La valeur du point de terminaison que vous spécifiez doit inclure la version du modèle, par exempletext-embedding-005. Si vous spécifiez le nom du modèle plutôt qu'une URL, BigQuery ML identifie automatiquement le modèle et utilise le point de terminaison complet du modèle.
Le job de génération d'embeddings en arrière-plan démarre peu de temps après la création de votre tableau ou après la mise à jour des données dans la colonne source.
Pour suivre la progression de la génération des embeddings, vous pouvez utiliser une requête semblable à la suivante :
SELECT
COUNT(*) AS total_num_rows,
COUNTIF(description_embedding IS NOT NULL
AND description_embedding.status = '') AS total_num_generated_embeddings
FROM
PROJECT_ID.DATASET_ID.TABLE;
Une fois la table avec les embeddings créée, vous pouvez créer un index vectoriel sur la colonne STRUCT qui contient l'embedding généré automatiquement.
Exemple
Imaginons que vous soyez un grand marchand qui vend de nombreux produits différents. Vous disposez d'un tableau de noms et de descriptions de produits, et vous souhaitez aider vos clients à trouver les produits qu'ils recherchent. Les requêtes suivantes vous montrent comment configurer la génération autonome d'embeddings pour faciliter la recherche sémantique de vos descriptions de produits.
Commencez par créer un ensemble de données :
CREATE SCHEMA mydataset;
Créez ensuite une table avec la génération d'embeddings autonomes activée pour stocker vos informations sur les produits. La colonne générée automatiquement s'appelle description_embedding et est basée sur la colonne description.
# Create a table of products and descriptions with a generated embedding column.
CREATE TABLE mydataset.products (
name STRING,
description STRING,
description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (AI.EMBED(
description,
connection_id => 'us.example_connection',
endpoint => 'text-embedding-005'
))
STORED OPTIONS( asynchronous = TRUE )
);
La requête suivante insère des noms et des descriptions de produits dans la table.
Vous ne spécifiez pas de valeur pour description_embedding, car elle est générée automatiquement.
# Insert product descriptions into the table.
# The description_embedding column is automatically updated.
INSERT INTO mydataset.products (name, description) VALUES
("Lounger chair", "A comfortable chair for relaxing in."),
("Super slingers", "An exciting board game for the whole family."),
("Encyclopedia set", "A collection of informational books.");
Vous pouvez éventuellement créer un index vectoriel sur la table pour accélérer la recherche.
Un index vectoriel nécessite plus de trois lignes. La requête suivante suppose donc que vous avez inséré des données supplémentaires. Chaque fois que vous insérez des données, la colonne description_embedding est automatiquement mise à jour.
CREATE VECTOR INDEX my_index
ON mydataset.products(description_embedding)
OPTIONS(index_type = 'IVF');
Enfin, vous pouvez utiliser la fonction AI.SEARCH pour effectuer une recherche sémantique sur vos produits afin de trouver un jouet amusant :
# Search for products that are fun to play with.
SELECT base.name, base.description, distance
FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");
/*------------------+----------------------------------------------+----------------------+
| name | description | distance |
+------------------+----------------------------------------------+----------------------+
| Super slingers | An exciting board game for the whole family. | 0.80954913893618929 |
| Lounger chair | A comfortable chair for relaxing in. | 0.938933930620146 |
| Encyclopedia set | A collection of informational books. | 1.1119297739353384 |
+------------------+----------------------------------------------+----------------------*/
Obtenir des informations sur les colonnes d'embedding générées automatiquement
Pour vérifier qu'une colonne est une colonne d'embedding générée automatiquement, interrogez la vue INFORMATION_SCHEMA.COLUMNS.
La requête suivante affiche des informations sur toutes vos colonnes d'embedding générées automatiquement :
SELECT *
FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.COLUMNS
WHERE is_generated = 'ALWAYS';
Le champ generation_expression affiche l'appel à la fonction AI.EMBED qui est utilisé pour générer les embeddings dans la colonne.
Utiliser votre propre réservation
Par défaut, BigQuery utilise des emplacements à la demande pour gérer le traitement nécessaire à la maintenance de la colonne d'embedding générée. Pour garantir des performances prévisibles et cohérentes, vous pouvez éventuellement créer une réservation et définir job_type sur BACKGROUND. Lorsqu'une réservation en arrière-plan est présente, BigQuery l'utilise pour gérer la colonne d'embedding générée.
Dépannage
La colonne d'embedding générée contient deux champs : result et status.
Si une erreur se produit lorsque BigQuery tente de générer un embedding pour une ligne spécifique de votre table, le champ result est défini sur NULL et le champ status décrit l'erreur. Par exemple, si la colonne source est NULL, l'intégration result est également NULL et l'état est NULL value is not supported for embedding generation.
Une erreur plus grave peut bloquer la génération d'embeddings. Dans ce cas, vous pouvez interroger la vue INFORMATION_SCHEMA.JOBS pour la tâche en arrière-plan et examiner les informations du champ error_result.
L'ID de tâche d'un job d'embedding en arrière-plan est précédé de gc_. Par exemple, la requête suivante extrait tous les jobs en arrière-plan dont le résultat d'erreur n'est pas NULL :
SELECT * FROM `region-REGION.INFORMATION_SCHEMA.JOBS` j
WHERE EXISTS (
SELECT 1
FROM unnest(j.referenced_tables) t
WHERE
j.project_id = 'PROJECT_ID'
AND t.dataset_id = 'DATASET_ID'
AND t.table_id = 'TABLE'
)
AND starts_with(job_id, 'gc')
AND error_result IS NOT NULL
ORDER BY j.creation_time DESC;
Suivre les coûts
La génération autonome d'embeddings envoie des requêtes à Vertex AI, ce qui peut entraîner des frais. Pour suivre les coûts Vertex AI générés par les tâches d'embedding en arrière-plan, procédez comme suit :
- Affichez vos rapports sur la facturation dans Cloud Billing.
Utilisez des filtres pour affiner vos résultats.
Pour les services, sélectionnez Vertex AI.
Pour afficher les frais d'un job spécifique, filtrez par libellé.
Définissez la clé sur
bigquery_ml_jobet la valeur sur l'ID de job du job d'embedding. Toutes les tâches d'embedding en arrière-plan ont le préfixegc_.
L'affichage de certains frais dans Cloud Billing peut prendre jusqu'à 24 heures.
Limites
- Chaque table ne peut comporter qu'une seule colonne d'embedding générée automatiquement.
- Aucune indication ne précise qu'une colonne est générée automatiquement lorsque vous consultez le schéma d'une table à l'aide de la console Google Cloud , de la commande
bq showou du champddlde la vueINFORMATION_SCHEMA.TABLES. - Vous ne pouvez pas ajouter de colonnes d'embedding générées à une table existante à l'aide de
ALTER TABLE ADD COLUMN. - Si vous créez une copie, un clone ou un instantané d'une table comportant une colonne d'embedding générée, seules les données sont copiées. La configuration de génération ne s'applique pas à la nouvelle table, et les modifications apportées à la colonne source de la nouvelle table n'entraîneront pas de nouveaux embeddings.
- Si vous restaurez à partir d'un instantané une table pour laquelle la génération autonome d'embeddings était activée, la configuration de la génération d'embeddings n'est pas restaurée.
- Vous ne pouvez créer des colonnes d'embedding générées qu'à l'aide de SQL. Vous ne pouvez pas utiliser les commandes
bq mkoubq updatepour créer des colonnes d'embedding générées. - La colonne source de la colonne générée doit être de type
STRING. Une fois la colonne d'embedding générée créée, les limites suivantes s'appliquent :
- Vous ne pouvez pas supprimer ni renommer la colonne source, mais vous pouvez toujours supprimer ou renommer la colonne d'embedding générée. Si vous supprimez la colonne d'intégration, vous pouvez supprimer ou renommer la colonne source.
- Vous ne pouvez pas modifier le type de données de la colonne source ni de la colonne d'embedding générée.
Vous ne pouvez pas spécifier de valeurs par défaut pour les colonnes d'intégration générées automatiquement.
Vous ne pouvez pas écrire directement dans les colonnes d'embedding générées à l'aide des méthodes suivantes :
- LMD
- Écritures en flux continu
bq insertbq copy -a
Les tables comportant des colonnes d'embeddings générées ne sont compatibles avec aucune règle de sécurité au niveau des colonnes, comme les tags avec stratégie.
Lorsque vous appelez une fonction de recherche, telle que
VECTOR_SEARCHouAI.SEARCH, les lignes dont les embeddings sont manquants dans la table de base sont ignorées lors de la recherche.Vous ne pouvez pas créer d'index vectoriel partitionné sur une table pour laquelle la génération autonome d'embeddings est activée.
Si vous créez un index vectoriel sur la colonne d'embedding générée automatiquement, l'entraînement de l'index commence une fois qu'au moins 80 % des lignes ont généré des embeddings. Vous pouvez utiliser la requête suivante pour vérifier le pourcentage d'embeddings générés dans votre table :
SELECT COUNTIF(description_embedding IS NOT NULL AND description_embedding.status = '') * 100.0 / COUNT(*) AS percent FROM PROJECT_ID.DATASET_ID.TABLE;
Étapes suivantes
- Découvrez comment créer et gérer des index vectoriels.
- Consultez la présentation de la recherche vectorielle.