Générer des embeddings de texte à l'aide de la fonction ML.GENERATE_EMBEDDING
Ce document explique comment créer un modèle distant BigQuery ML faisant référence à un modèle d'embedding Vertex AI.
Vous utilisez ensuite ce modèle avec la fonction ML.GENERATE_EMBEDDING
pour créer des embeddings de texte à l'aide des données d'une table standard BigQuery.
Rôles requis
Pour créer une connexion, vous devez disposer du rôle IAM (Identity and Access Management) suivant :
roles/bigquery.connectionAdmin
Pour accorder des autorisations au compte de service de la connexion, vous devez disposer de l'autorisation suivante :
resourcemanager.projects.setIamPolicy
Pour créer le modèle à l'aide de BigQuery ML, vous devez disposer des autorisations IAM suivantes :
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
Pour exécuter une inférence, vous devez disposer des autorisations suivantes :
bigquery.tables.getData
sur la tablebigquery.models.getData
sur le modèlebigquery.jobs.create
Avant de commencer
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
Créer un ensemble de données
Vous allez créer un ensemble de données BigQuery pour stocker votre modèle de ML :
Dans la console Google Cloud, accédez à la page "BigQuery".
Dans le volet Explorateur, cliquez sur le nom de votre projet.
Cliquez sur
Afficher les actions > Créer un ensemble de données.Sur la page Créer un ensemble de données, procédez comme suit :
Dans le champ ID de l'ensemble de données, saisissez
bqml_tutorial
.Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).
Les ensembles de données publics sont stockés dans l'emplacement multirégional
US
. Par souci de simplicité, stockez votre ensemble de données dans le même emplacement.Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.
Créer une connexion
Créez une connexion de ressource cloud et obtenez le compte de service de la connexion. Créez la connexion dans le même emplacement que l'ensemble de données que vous avez créé à l'étape précédente.
Sélectionnez l'une des options suivantes :
Console
Accédez à la page BigQuery.
Pour créer une connexion, cliquez sur
Ajouter, puis sur Connexions aux sources de données externes.Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).
Dans le champ ID de connexion, saisissez un nom pour votre connexion.
Cliquez sur Create connection (Créer une connexion).
Cliquez sur Accéder à la connexion.
Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.
bq
Dans un environnement de ligne de commande, créez une connexion :
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
Le paramètre
--project_id
remplace le projet par défaut.Remplacez les éléments suivants :
REGION
: votre région de connexionPROJECT_ID
: ID de votre projet Google CloudCONNECTION_ID
: ID de votre connexion
Lorsque vous créez une ressource de connexion, BigQuery crée un compte de service système unique et l'associe à la connexion.
Dépannage : Si vous obtenez l'erreur de connexion suivante, mettez à jour le Google Cloud SDK :
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Récupérez et copiez l'ID du compte de service pour l'utiliser lors d'une prochaine étape :
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
Le résultat ressemble à ce qui suit :
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Ajoutez la section suivante à votre fichier main.tf
.
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }
CONNECTION_ID
: ID de votre connexionPROJECT_ID
: ID de votre projet Google CloudREGION
: votre région de connexion
Accorder l'accès au compte de service
Attribuez le rôle d'utilisateur Vertex AI au compte de service de la connexion.
Si vous envisagez de spécifier le point de terminaison en tant qu'URL lors de la création du modèle distant (par exemple, endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/text-embedding-004'
), accordez ce rôle dans le projet que vous spécifiez dans l'URL.
Si vous envisagez de spécifier le point de terminaison à l'aide du nom du modèle lors de la création du modèle distant (par exemple endpoint = 'text-embedding-004'
), accordez ce rôle dans le projet dans lequel vous prévoyez de créer le modèle distant.
L'attribution du rôle dans un autre projet génère l'erreur bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource
.
Pour accorder le rôle, procédez comme suit :
Console
Accédez à la page IAM et administration.
Cliquez sur
Accorder l'accès.La boîte de dialogue Ajouter des comptes principaux s'ouvre.
Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.
Dans le champ Sélectionner un rôle, sélectionnez Vertex AI, puis Utilisateur Vertex AI.
Cliquez sur Enregistrer.
gcloud
Exécutez la commande gcloud projects add-iam-policy-binding
:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None
Remplacez les éléments suivants :
PROJECT_NUMBER
: votre numéro de projetMEMBER
: ID du compte de service que vous avez copié précédemment
Créer un modèle
Dans la console Google Cloud, accédez à la page BigQuery.
À l'aide de l'éditeur SQL, créez un modèle distant :
CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` REMOTE WITH CONNECTION `CONNECTION_ID` OPTIONS (ENDPOINT = 'ENDPOINT');
Remplacez les éléments suivants :
PROJECT_ID
: ID de votre projet.DATASET_ID
: ID de l'ensemble de données pour contenir le modèle.MODEL_NAME
: nom du modèleCONNECTION_ID
: ID de votre connexion BigQueryLorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple,
projects/myproject/locations/connection_location/connections/myconnection
).ENDPOINT
: modèle d'embedding à utiliser.
Générer des embeddings de texte à l'aide des données d'une table
Générez des embeddings de texte à l'aide de la fonction ML.GENERATE_EMBEDDING
en utilisant les données textuelles d'une colonne de table.
En règle générale, vous devez utiliser un modèle text-embedding
ou text-multilingual-embedding
pour les cas d'utilisation exclusivement basés sur du texte, et un modèle multimodalembedding
pour les cas d'utilisation de recherche multimodale, où les embeddings pour le texte et le contenu visuel sont générées dans le même espace sémantique.
Embedding textuel
Générez des représentations vectorielles continues de texte à l'aide d'un modèle distant sur un modèle d'embedding :
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, TABLE PROJECT_ID.DATASET_ID.TABLE_NAME, STRUCT(FLATTEN_JSON AS flatten_json_output, TASK_TYPE AS task_type, OUTPUT_DIMENSIONALITY AS output_dimensionality) );
Remplacez l'élément suivant :
PROJECT_ID
: ID de votre projet.DATASET_ID
: ID de l'ensemble de données contenant le modèle.MODEL_NAME
: nom du modèle distant sur un modèle d'embedding.TABLE_NAME
: nom de la table contenant le texte à intégrer. Cette table doit avoir une colonne nomméecontent
. Vous pouvez également utiliser un alias pour utiliser une colonne portant un nom différent.FLATTEN_JSON
:BOOL
qui indique s'il faut analyser l'embedding dans une colonne distincte. La valeur par défaut estTRUE
.TASK_TYPE
: littéral de typeSTRING
qui spécifie l'application en aval prévue pour aider le modèle à produire des embeddings de meilleure qualité.TASK_TYPE
accepte les valeurs suivantes :RETRIEVAL_QUERY
: indique que le texte donné est une requête dans un contexte de recherche ou de récupération.RETRIEVAL_DOCUMENT
: indique que le texte donné est un document dans un contexte de recherche ou de récupération.Lorsque vous utilisez ce type de tâche, il est utile d'inclure le titre du document dans l'instruction de requête afin d'améliorer la qualité des représentations vectorielles continues. Vous pouvez utiliser l'option
title
pour spécifier le nom de la colonne contenant le titre du document. Sinon, le titre du document doit se trouver dans une colonne nomméetitle
ou associée à un aliastitle
, par exemple :SELECT * FROM ML.GENERATE_EMBEDDING( MODEL
mydataset.embedding_model
, (SELECT abstract as content, header as title, publication_number FROMmydataset.publications
), STRUCT(TRUE AS flatten_json_output, 'RETRIEVAL_DOCUMENT' as task_type) );SEMANTIC_SIMILARITY
: indique que le texte donné sera utilisé pour la similarité textuelle sémantique (STS).CLASSIFICATION
: indique que les embeddings seront utilisés pour la classification.CLUSTERING
: indique que les embeddings seront utilisées pour le clustering.
OUTPUT_DIMENSIONALITY
: valeurINT64
qui spécifie le nombre de dimensions à utiliser lors de la génération d'embeddings. Par exemple, si vous spécifiez256 AS output_dimensionality
, la colonne de sortieml_generate_embedding_result
va contenir 256 embeddings pour chaque valeur d'entrée.Vous ne pouvez utiliser cet argument que si le modèle distant que vous spécifiez dans l'argument
model
utilise l'un des modèles suivants comme point de terminaison :text-embedding-004
ou version ultérieuretext-multilingual-embedding-002
ou version ultérieure
Embedding multimodal
Générez des embeddings textuels à l'aide d'un modèle distant sur le modèle multimodalembedding
:
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, TABLE PROJECT_ID.DATASET_ID.TABLE_NAME, STRUCT(FLATTEN_JSON AS flatten_json_output, OUTPUT_DIMENSIONALITY AS output_dimensionality) );
Remplacez les éléments suivants :
PROJECT_ID
: ID de votre projet.DATASET_ID
: ID de l'ensemble de données contenant le modèle.MODEL_NAME
: nom du modèle distant sur un modèlemultimodalembedding@001
.TABLE_NAME
: nom de la table contenant le texte à intégrer. Cette table doit avoir une colonne nomméecontent
. Vous pouvez également utiliser un alias pour utiliser une colonne portant un nom différent.FLATTEN_JSON
:BOOL
qui indique s'il faut analyser l'embedding dans une colonne distincte. La valeur par défaut estTRUE
.OUTPUT_DIMENSIONALITY
: valeurINT64
qui spécifie le nombre de dimensions à utiliser lors de la génération d'embeddings. Les valeurs acceptables sont128
,256
,512
et1408
. La valeur par défaut est1408
. Par exemple, si vous spécifiez256 AS output_dimensionality
, la colonne de sortieml_generate_embedding_result
va contenir 256 embeddings pour chaque valeur d'entrée.
Générer des embeddings de texte à l'aide des données d'une requête
Générez des embeddings textuels à l'aide de la fonction ML.GENERATE_EMBEDDING
, en utilisant les données textuelles fournies par une requête, ainsi qu'un modèle distant appliqué sur le modèle d'embedding.
En règle générale, vous devez utiliser un modèle text-embedding
ou text-multilingual-embedding
pour les cas d'utilisation exclusivement basés sur du texte, et un modèle multimodalembedding
pour les cas d'utilisation de recherche multimodale, où les embeddings pour le texte et le contenu visuel sont générées dans le même espace sémantique.
Embedding textuel
Générez des embeddings textuels à l'aide d'un modèle distant sur le modèle d'embedding :
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, (CONTENT_QUERY), STRUCT(FLATTEN_JSON AS flatten_json_output, TASK_TYPE AS task_type, OUTPUT_DIMENSIONALITY AS output_dimensionality) );
Remplacez l'élément suivant :
PROJECT_ID
: ID de votre projet.DATASET_ID
: ID de l'ensemble de données contenant le modèle.MODEL_NAME
: nom du modèle distant sur un modèle de représentation vectorielle continue.CONTENT_QUERY
: requête dont le résultat contient une colonneSTRING
appeléecontent
.FLATTEN_JSON
:BOOL
qui indique s'il faut analyser l'embedding dans une colonne distincte. La valeur par défaut estTRUE
.TASK_TYPE
: littéral de typeSTRING
qui spécifie l'application en aval prévue pour aider le modèle à produire des embeddings de meilleure qualité.TASK_TYPE
accepte les valeurs suivantes :RETRIEVAL_QUERY
: indique que le texte donné est une requête dans un contexte de recherche ou de récupération.RETRIEVAL_DOCUMENT
: indique que le texte donné est un document dans un contexte de recherche ou de récupération.Lorsque vous utilisez ce type de tâche, il est utile d'inclure le titre du document dans l'instruction de requête afin d'améliorer la qualité des représentations vectorielles continues. Vous pouvez utiliser l'option
title
pour spécifier le nom de la colonne contenant le titre du document. Sinon, le titre du document doit se trouver dans une colonne nomméetitle
ou associée à un aliastitle
, par exemple :SELECT * FROM ML.GENERATE_EMBEDDING( MODEL
mydataset.embedding_model
, (SELECT abstract as content, header as title, publication_number FROMmydataset.publications
), STRUCT(TRUE AS flatten_json_output, 'RETRIEVAL_DOCUMENT' as task_type) );SEMANTIC_SIMILARITY
: indique que le texte donné sera utilisé pour la similarité textuelle sémantique (STS).CLASSIFICATION
: indique que les embeddings seront utilisés pour la classification.CLUSTERING
: indique que les embeddings seront utilisées pour le clustering.
OUTPUT_DIMENSIONALITY
: valeurINT64
qui spécifie le nombre de dimensions à utiliser lors de la génération d'embeddings. Par exemple, si vous spécifiez256 AS output_dimensionality
, la colonne de sortieml_generate_embedding_result
va contenir 256 embeddings pour chaque valeur d'entrée.Vous ne pouvez utiliser cet argument que si le modèle distant que vous spécifiez dans l'argument
model
utilise l'un des modèles suivants comme point de terminaison :text-embedding-004
ou version ultérieuretext-multilingual-embedding-002
ou version ultérieure
Embedding multimodal
Générez des embeddings textuels à l'aide d'un modèle distant sur le modèle multimodalembedding
:
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, (CONTENT_QUERY), STRUCT(FLATTEN_JSON AS flatten_json_output, OUTPUT_DIMENSIONALITY AS output_dimensionality) );
Remplacez les éléments suivants :
PROJECT_ID
: ID de votre projet.DATASET_ID
: ID de l'ensemble de données contenant le modèle.MODEL_NAME
: nom du modèle distant sur un modèlemultimodalembedding@001
.CONTENT_QUERY
: requête dont le résultat contient une colonneSTRING
appeléecontent
.FLATTEN_JSON
:BOOL
qui indique s'il faut analyser l'embedding dans une colonne distincte. La valeur par défaut estTRUE
.OUTPUT_DIMENSIONALITY
: valeurINT64
qui spécifie le nombre de dimensions à utiliser lors de la génération d'embeddings. Les valeurs acceptables sont128
,256
,512
et1408
. La valeur par défaut est1408
. Par exemple, si vous spécifiez256 AS output_dimensionality
, la colonne de sortieml_generate_embedding_result
va contenir 256 embeddings pour chaque valeur d'entrée.
Exemples
Les exemples suivants montrent comment appeler la fonction ML.GENERATE_EMBEDDING
sur une table et une requête.
Intégrer du texte dans une table
L'exemple suivant montre une requête d'intégration de la colonne content
de la table text_data
:
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `mydataset.embedding_model`, TABLE mydataset.text_data, STRUCT(TRUE AS flatten_json_output, 'CLASSIFICATION' AS task_type) );
Utiliser des embeddings pour classer la similarité sémantique
L'exemple suivant intègre une collection d'avis sur des films et les classe par distance de cosinus à l'avis "Ce film était moyen" à l'aide de la fonction ML.DISTANCE
.
Une distance plus faible indique une plus grande similarité sémantique.
WITH movie_review_embeddings AS ( SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.embedding_model`, ( SELECT "Movie 1" AS title, "This movie was fantastic" AS content UNION ALL SELECT "Movie 2" AS title, "This was the best movie I've ever seen!!" AS content UNION ALL SELECT "Movie 3" AS title, "This movie was just okay..." AS content UNION ALL SELECT "Movie 4" AS title, "This movie was terrible." AS content ), STRUCT(TRUE AS flatten_json_output) ) ), average_review_embedding AS ( SELECT ml_generate_embedding_result FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.embedding_model`, (SELECT "This movie was average" AS content), STRUCT(TRUE AS flatten_json_output) ) ) SELECT content, ML.DISTANCE( (SELECT ml_generate_embedding_result FROM average_review_embedding), ml_generate_embedding_result, 'COSINE' ) AS distance_to_average_review FROM movie_review_embeddings ORDER BY distance_to_average_review;
Le résultat est le suivant :
+------------------------------------------+----------------------------+ | content | distance_to_average_review | +------------------------------------------+----------------------------+ | This movie was just okay... | 0.062789813467745592 | | This movie was fantastic | 0.18579561313064263 | | This movie was terrible. | 0.35707466240930985 | | This was the best movie I've ever seen!! | 0.41844932504542975 | +------------------------------------------+----------------------------+