Generare dati strutturati utilizzando la funzione AI.GENERATE_TABLE
Questo documento mostra come generare dati strutturati utilizzando un modello Gemini Pro 1.5, Gemini Flash 1.5 o Gemini Flash 2.0 e poi formattare la risposta del modello utilizzando uno schema SQL.
Per farlo, completa le seguenti attività:
- Creazione di un modello remoto BigQuery ML che rappresenti un modello Gemini 1.5 o 2.0 di Vertex AI ospitato.
- Utilizzo del modello con la
funzione
AI.GENERATE_TABLE
per generare dati strutturati in base ai dati delle tabelle standard.
Autorizzazioni obbligatorie
Per creare una connessione, devi disporre dell'appartenenza al seguente ruolo IAM (Identity and Access Management):
roles/bigquery.connectionAdmin
Per concedere le autorizzazioni all'account di servizio della connessione, devi disporre della seguente autorizzazione:
resourcemanager.projects.setIamPolicy
Per creare il modello utilizzando BigQuery ML, sono necessarie le seguenti autorizzazioni IAM:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
Per eseguire l'inferenza, devi disporre delle seguenti autorizzazioni:
bigquery.tables.getData
sul tavolobigquery.models.getData
sul modellobigquery.jobs.create
Prima di iniziare
-
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.
Crea una connessione
Crea una connessione risorsa Cloud e recupera l'account di servizio della connessione.
Seleziona una delle seguenti opzioni:
Console
Vai alla pagina BigQuery.
Nel riquadro Explorer, fai clic su
Aggiungi dati.Viene visualizzata la finestra di dialogo Aggiungi dati.
Nel riquadro Filtra per, seleziona Applicazioni aziendali nella sezione Tipo di origine dati.
In alternativa, nel campo Cerca origini dati, puoi inserire
Vertex AI
.Nella sezione Origini dati in primo piano, fai clic su Vertex AI.
Fai clic sulla scheda della soluzione Modelli Vertex AI: federazione BigQuery.
Nell'elenco Tipo di connessione, seleziona Modelli remoti di Vertex AI, funzioni remote e BigLake (risorsa Cloud).
Nel campo ID connessione, inserisci un nome per la connessione.
Fai clic su Crea connessione.
Fai clic su Vai alla connessione.
Nel riquadro Informazioni sulla connessione, copia l'ID account di servizio da utilizzare in un passaggio successivo.
bq
In un ambiente a riga di comando, crea una connessione:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
Il parametro
--project_id
sostituisce il progetto predefinito.Sostituisci quanto segue:
REGION
: la regione di connessionePROJECT_ID
: il tuo ID progetto Google CloudCONNECTION_ID
: un ID per la connessione
Quando crei una risorsa di connessione, BigQuery crea un account di servizio di sistema unico e lo associa alla connessione.
Risoluzione dei problemi: se ricevi il seguente errore di connessione, aggiorna Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera e copia l'ID account di servizio per utilizzarlo in un passaggio successivo:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
L'output è simile al seguente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Utilizza la risorsa google_bigquery_connection
.
Per autenticarti in BigQuery, configura le credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.
Il seguente esempio crea una connessione a una risorsa Cloud denominata
my_cloud_resource_connection
nella regione US
:
Per applicare la configurazione Terraform in un progetto Google Cloud, completa i passaggi nelle seguenti sezioni.
Prepara Cloud Shell
- Avvia Cloud Shell.
-
Imposta il progetto Google Cloud predefinito in cui vuoi applicare le configurazioni Terraform.
Devi eseguire questo comando una sola volta per progetto e puoi farlo in qualsiasi directory.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Le variabili di ambiente vengono sostituite se imposti valori espliciti nel file di configurazione Terraform.
Prepara la directory
Ogni file di configurazione di Terraform deve avere una propria directory (chiamata anche modulo principale).
-
In Cloud Shell, crea una directory e un nuovo
file al suo interno. Il nome file deve avere l'estensione
.tf
, ad esempiomain.tf
. In questo tutorial, il file è denominatomain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Se stai seguendo un tutorial, puoi copiare il codice di esempio in ogni sezione o passaggio.
Copia il codice di esempio nel
main.tf
appena creato.Se vuoi, copia il codice da GitHub. Questa opzione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.
- Rivedi e modifica i parametri di esempio da applicare al tuo ambiente.
- Salva le modifiche.
-
Inizializza Terraform. Devi eseguire questa operazione una sola volta per directory.
terraform init
Se vuoi, per utilizzare la versione più recente del provider Google, includi l'opzione
-upgrade
:terraform init -upgrade
Applica le modifiche
-
Rivedi la configurazione e verifica che le risorse che Terraform sta per creare o
aggiornare corrispondano alle tue aspettative:
terraform plan
Apporta le correzioni necessarie alla configurazione.
-
Applica la configurazione di Terraform eseguendo il seguente comando e inserendo
yes
al prompt:terraform apply
Attendi che Terraform mostri il messaggio "Applicazione completata".
- Apri il tuo progetto Google Cloud per visualizzare i risultati. Nella console Google Cloud, vai alle risorse nell'interfaccia utente per assicurarti che Terraform le abbia create o aggiornate.
Concedi l'accesso all'account di servizio
Concedi all'account di servizio della connessione il ruolo Utente Vertex AI.
Se prevedi di specificare l'endpoint come URL quando crei il modello remoto, ad esempio endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/gemini-1.5-flash'
, concedi questo ruolo nello stesso progetto specificato nell'URL.
Se prevedi di specificare l'endpoint utilizzando il nome del modello quando crei il modello remoto, ad esempio endpoint = 'gemini-1.5-flash'
, concedi questo ruolo nello stesso progetto in cui prevedi di creare il modello remoto.
Se concedi il ruolo in un progetto diverso, viene visualizzato l'errore bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource
.
Per concedere il ruolo, segui questi passaggi:
Console
Vai alla pagina IAM e amministrazione.
Fai clic su
Aggiungi.Viene visualizzata la finestra di dialogo Aggiungi entità.
Nel campo Nuove entità, inserisci l'ID account di servizio che hai copiato in precedenza.
Nel campo Seleziona un ruolo, seleziona Vertex AI e poi Utente Vertex AI.
Fai clic su Salva.
gcloud
Utilizza il
comando gcloud projects add-iam-policy-binding
.
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoMEMBER
: l'ID service account che hai copiato in precedenza
Creare un modello remoto BigQuery ML
Nella console Google Cloud, vai alla pagina BigQuery.
Utilizzando l'editor SQL, crea un modello remoto:
CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS (ENDPOINT = 'ENDPOINT');
Sostituisci quanto segue:
PROJECT_ID
: il tuo ID progettoDATASET_ID
: l'ID del set di dati che deve contenere il modello. Questo set di dati deve trovarsi nella stessa località della connessione che stai utilizzandoMODEL_NAME
: il nome del modelloREGION
: la regione utilizzata dalla connessioneCONNECTION_ID
: l'ID della connessione BigQueryQuando visualizzi i dettagli della connessione nella console Google Cloud, questo è il valore nell'ultima sezione dell'ID connessione visualizzato in ID connessione, ad esempio
projects/myproject/locations/connection_location/connections/myconnection
ENDPOINT
: il nome del modello Gemini da utilizzare. Sono supportati i seguenti modelli:gemini-2.0-flash-001
gemini-1.5-flash-001
gemini-1.5-flash-002
gemini-1.5-pro-001
gemini-1.5-pro-002
ENDPOINT
.
Generare dati strutturati
Genera dati strutturati utilizzando la funzione AI.GENERATE_TABLE
con un modello remoto e i dati del prompt di una colonna della tabella:
SELECT * FROM AI.GENERATE_TABLE( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, [TABLE `PROJECT_ID.DATASET_ID.TABLE_NAME` / (PROMPT_QUERY)], STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature, TOP_P AS top_p, STOP_SEQUENCES AS stop_sequences, SAFETY_SETTINGS AS safety_settings, OUTPUT_SCHEMA AS output_schema) );
Sostituisci quanto segue:
PROJECT_ID
: il tuo ID progetto.DATASET_ID
: l'ID del set di dati che contiene il modello.MODEL_NAME
: il nome del modello.TABLE_NAME
: il nome della tabella che contiene il prompt. Questa tabella deve avere una colonna denominataprompt
oppure puoi utilizzare un alias per utilizzare una colonna con un nome diverso.PROMPT_QUERY
: la query GoogleSQL che genera i dati del prompt. Il valore del prompt stesso può essere estratto da una colonna o puoi specificarlo come valore di struct con un numero arbitrario di campi secondari di stringhe e nomi di colonne. Ad esempio,SELECT ('Analyze the sentiment in ', feedback_column, 'using the following categories: positive, negative, neutral') AS prompt
.TOKENS
: un valoreINT64
che imposta il numero massimo di token che possono essere generati nella risposta. Questo valore deve essere compreso nell'intervallo[1,8192]
. Specifica un valore più basso per risposte più brevi e un valore più alto per risposte più lunghe. Il valore predefinito è128
.TEMPERATURE
: un valoreFLOAT64
nell'intervallo[0.0,2.0]
che controlla il grado di casualità nella selezione dei token. Il valore predefinito è1.0
.I valori più bassi per
temperature
sono ideali per prompt che richiedono risposte più deterministiche e meno aperte o creative, mentre i valori più alti pertemperature
possono portare a risultati più diversificati o creativi. Un valore di0
pertemperature
è deterministico, il che significa che viene sempre selezionata la risposta con la probabilità più alta.TOP_P
: un valoreFLOAT64
nell'intervallo[0.0,1.0]
consente di determinare la probabilità dei token selezionati. Specifica un valore più basso per risposte meno casuali e un valore più alto per risposte più casuali. Il valore predefinito è0.95
.STOP_SEQUENCES
: un valoreARRAY<STRING>
che rimuove le stringhe specificate se sono incluse nelle risposte del modello. Le stringhe vengono associate esattamente, incluse le lettere maiuscole. Il valore predefinito è un array vuoto.SAFETY_SETTINGS
: un valoreARRAY<STRUCT<STRING AS category, STRING AS threshold>>
che configura le soglie di sicurezza dei contenuti per filtrare le risposte. Il primo elemento della struttura specifica una categoria di danno, mentre il secondo elemento specifica una soglia di blocco corrispondente. Il modello filtra i contenuti che violano queste impostazioni. Puoi specificare ogni categoria una sola volta. Ad esempio, non puoi specificare siaSTRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_MEDIUM_AND_ABOVE' AS threshold)
cheSTRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_ONLY_HIGH' AS threshold)
. Se non è presente un'impostazione di sicurezza per una determinata categoria, viene utilizzata l'impostazione di sicurezzaBLOCK_MEDIUM_AND_ABOVE
.Le categorie supportate sono le seguenti:
HARM_CATEGORY_HATE_SPEECH
HARM_CATEGORY_DANGEROUS_CONTENT
HARM_CATEGORY_HARASSMENT
HARM_CATEGORY_SEXUALLY_EXPLICIT
Le soglie supportate sono le seguenti:
BLOCK_NONE
(Accesso limitato)BLOCK_LOW_AND_ABOVE
BLOCK_MEDIUM_AND_ABOVE
(valore predefinito)BLOCK_ONLY_HIGH
HARM_BLOCK_THRESHOLD_UNSPECIFIED
Per saperne di più, consulta le categorie di danno e Come configurare i filtri dei contenuti.
OUTPUT_SCHEMA
: un valoreSTRING
che specifica il formato della risposta del modello. Il valoreoutput_schema
deve essere una definizione dello schema SQL, simile a quella utilizzata nell'istruzioneCREATE TABLE
. Sono supportati i seguenti tipi di dati:INT64
FLOAT64
BOOL
STRING
ARRAY
STRUCT
Per i modelli Gemini 1.5, specifica un tipo di dati
FLOAT64
solo se hai la certezza che il valore restituito non sarà un numero arrotondato. A volte questi modelli possono restituire valoriINT64
anzichéFLOAT64
per i numeri arrotondati, ad esempio2
anziché2.0
, e questo può causare un errore di analisi nella query.Quando utilizzi l'argomento
output_schema
per generare dati strutturati in base ai prompt di una tabella, è importante comprendere i dati dei prompt per specificare uno schema appropriato.Ad esempio, supponiamo che tu stia analizzando i contenuti delle recensioni di film da una tabella che contiene i seguenti campi:
- movie_id
- review
- prompt
A questo punto, puoi creare il testo del prompt eseguendo una query simile alla seguente:
UPDATE
mydataset.movie_review
SET prompt = CONCAT('Extract the key words and key sentiment from the text below: ', review) WHERE review IS NOT NULL;e puoi specificare un valore
output_schema
simile a"keywords ARRAY<STRING>, sentiment STRING" AS output_schema
.
Esempi
L'esempio seguente mostra una richiesta che prende i dati del prompt da una tabella e fornisce uno schema SQL per formattare la risposta del modello:
SELECT * FROM AI.GENERATE_TABLE( MODEL `mydataset.gemini_model`, TABLE `mydataset.mytable`, STRUCT("keywords ARRAY<STRING>, sentiment STRING" AS output_schema));
L'esempio seguente mostra una richiesta che prende i dati del prompt da una query e fornisce uno schema SQL per formattare la risposta del modello:
SELECT * FROM AI.GENERATE_TABLE( MODEL `mydataset.gemini_model`, ( SELECT 'John Smith is a 20-year old single man living at 1234 NW 45th St, Kirkland WA, 98033. He has two phone numbers 123-123-1234, and 234-234-2345. He is 200.5 pounds.' AS prompt ), STRUCT("address STRUCT<street_address STRING, city STRING, state STRING, zip_code STRING>, age INT64, is_married BOOL, name STRING, phone_number ARRAY<STRING>, weight_in_pounds FLOAT64" AS output_schema));