1. Introduzione
In questo codelab creeremo un'app per la previsione e la prescrizione della valutazione del successo di un film con query BigQuery SQL e l'API Vertex AI PaLM. Il modello utilizzato per eseguire la generazione di testo è text-bison ed è ospitato come funzione remota in BigQuery.
L'elenco dei servizi utilizzati è il seguente:
- BigQuery ML
- API Vertex AI PaLM
- Cloud Shell
Che cosa creerai
Creerai
- Un set di dati BigQuery che contenga il modello
- Un modello BigQuery ML che prevede il punteggio di successo di un film in base agli attributi GENRE e RUNTIME del film
- Un modello BigQuery che ospita l'API Vertex AI PaLM come funzione remota
- Una connessione esterna per stabilire la connessione tra BigQuery e Vertex AI
2. Requisiti
- Un browser, ad esempio Chrome o Firefox
- Un progetto cloud Google Cloud con la fatturazione abilitata
Prima di iniziare
- Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud
- Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata per un progetto
- Assicurati che tutte le API necessarie (API BigQuery, API Vertex AI, API BigQuery Connection) siano abilitate
- Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud che viene precaricato con bq. Consulta la documentazione per i comandi e l'utilizzo di gcloud
Nella console Cloud, fai clic su Attiva Cloud Shell nell'angolo in alto a destra:

Se il progetto non è impostato, utilizza il seguente comando per impostarlo:
gcloud config set project <YOUR_PROJECT_ID>
- Vai direttamente alla console BigQuery inserendo il seguente URL nel browser: https://console.cloud.google.com/bigquery
3. Preparazione dei dati in corso…
In questo caso d'uso, utilizzeremo il set di dati movies derivato dall'origine movielens.
- Crea un set di dati:
Un set di dati BigQuery è una raccolta di tabelle. Tutte le tabelle di un set di dati vengono archiviate nella stessa località dei dati location. Puoi anche collegare controlli dell'accesso personalizzati per limitare l'accesso a un set di dati e alle relative tabelle.
In Cloud Shell, utilizza il comando bq mk per creare un set di dati denominato "movie_insights":
bq mk --location=us-central1 movie_insights
- Clona il file di origine nella macchina Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
- Vai alla nuova directory del progetto creata nella macchina Cloud Shell:
cd movie_score_genai_insights
- Utilizza il comando bq load per caricare il file CSV in una tabella BigQuery (tieni presente che puoi anche caricare direttamente dall'interfaccia utente di BigQuery):
bq load --source_format=CSV --skip_leading_rows=1 movie_insights.movie_score \
./movies_data.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string
- Puoi eseguire una query su un campione per verificare se la tabella movie_score e i dati sono stati creati nel set di dati:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;
4. Dati per ML
Creiamo un modello di classificazione per prevedere il punteggio di successo del film in base agli attributi GENRE e RUNTIME. Utilizzeremo l'istruzione CREATE MODEL con l'opzione "LOGISTIC_REG" per creare e addestrare un modello di regressione logistica.
Esegui la query riportata di seguito nella sezione EDITOR DI QUERY dell'area di lavoro SQL della console BigQuery:
CREATE OR REPLACE MODEL
`movie_insights.model_rating_by_runtime_genre`
OPTIONS
( model_type='LOGISTIC_REG',
auto_class_weights=TRUE,
data_split_method='NO_SPLIT',
model_registry='vertex_ai',
vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
input_label_cols=['score']
) AS
SELECT name, genre,runtime, score
FROM
movie_insights.movie_score
WHERE
data_cat = 'TRAIN';
Dettagli query:
- L'istruzione CREATE MODEL addestra un modello utilizzando i dati di addestramento nell'istruzione SELECT.
- La clausola OPTIONS specifica il tipo di modello e le opzioni di addestramento. Qui, l'opzione LOGISTIC_REG specifica un tipo di modello di regressione logistica. Non è necessario specificare un modello di regressione logistica binaria rispetto a un modello di regressione logistica multiclasse: BigQuery ML può determinare quale addestrare in base al numero di valori univoci nella colonna dell'etichetta.
- data_split_method="NO_SPLIT" impone a BQML di addestrare i dati in base alle condizioni della query (data_cat = "TRAIN"). Tieni presente che è preferibile utilizzare "AUTO_SPLIT" in questa opzione per consentire al framework (o al servizio in questo caso) di randomizzare la partizione delle suddivisioni di addestramento/test.
- L'opzione input_label_cols specifica la colonna dell'istruzione SELECT da utilizzare come colonna dell'etichetta. In questo caso, la colonna dell'etichetta è score, quindi il modello imparerà quale dei 10 valori di score è più probabile in base agli altri valori presenti in ogni riga.
- L'opzione "auto_class_weights=TRUE" bilancia le etichette di classe nei dati di addestramento. Per impostazione predefinita, i dati di addestramento non sono ponderati. Se le etichette nei dati di addestramento non sono bilanciate, il modello potrebbe imparare a prevedere la classe di etichette più popolare in modo più pesante.
- L'istruzione SELECT esegue una query sulla tabella caricata con i dati CSV. La clausola WHERE filtra le righe della tabella di input in modo che in questo passaggio venga selezionato solo il set di dati TRAIN.
- I seguenti costrutti sono FACOLTATIVI, quindi BigQuery ML può registrarli in modo esplicito in Vertex AI Model Registry. Puoi saperne di più in questo blog
. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']
Una volta creato, nella sezione SCHEMA dell'area di lavoro SQL di BigQuery viene visualizzato quanto segue:

Dopo aver creato il modello, valuta le prestazioni del modello utilizzando la funzione ML.EVALUATE. La funzione ML.EVALUATE valuta i valori previsti rispetto ai dati effettivi.
Puoi anche visualizzare le metriche di valutazione del modello dalla pagina MODELLO:

Metriche chiave a colpo d'occhio:
Precisione: quale percentuale di identificazioni positive era effettivamente corretta? Precisione = Vero positivo / (Vero positivo + Falso positivo) Richiamo: quale percentuale di positivi effettivi è stata identificata correttamente? Richiamo = Vero positivo / (Vero positivo + Falso negativo) Accuratezza: una metrica per la valutazione dei modelli di classificazione, è la frazione di previsioni che il nostro modello ha effettivamente ottenuto correttamente Accuratezza = Numero di previsioni corrette / Numero totale di previsioni
5. Previsione del punteggio del film utilizzando il modello
È ora di fare previsioni. La query seguente prevede il punteggio di ogni film nel set di dati classificato come dati "TEST".
Esegui la query riportata di seguito nella sezione EDITOR DI QUERY dell'area di lavoro SQL della console BigQuery:
SELECT
*
FROM
ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
(
SELECT
*
FROM
movie_insights.movie_score
WHERE
data_cat= 'TEST'
)
);
Il risultato è simile al seguente:

Il risultato del modello mostra il predicted_score del film su una scala da 1 a 10 (classificazione). Ti starai chiedendo perché ci sono diverse righe di previsione per ogni film. Questo perché il modello ha restituito le possibili etichette previste e la probabilità di occorrenza di ciascuna in ordine decrescente.
Analizza i risultati previsti e il modello:
Puoi eseguire due ottimi passaggi di analisi con la previsione per comprendere i risultati:
- Per capire perché il modello genera questi risultati di previsione, puoi utilizzare la funzione ML.EXPLAIN_PREDICT.
- Per sapere quali sono le funzionalità più importanti per determinare in generale la fascia di reddito, puoi utilizzare la funzione ML.GLOBAL_EXPLAIN.
Puoi leggere questi passaggi in dettaglio nella documentazione.
6. Dati per l'AI generativa
Forniamo approfondimenti sul set di dati movies chiedendo al modello linguistico di grandi dimensioni (LLM) il riepilogo dei fattori che influenzano il punteggio del film in modo che sia superiore a 5, con l'AI generativa utilizzando il modello text-bison (ultima versione) di Vertex AI utilizzando solo query SQL
- Anche la tabella movie_score che abbiamo creato sarà l'input per questo passaggio.
- Verrà creata una connessione esterna per stabilire l'accesso tra BigQuery ML e i servizi Vertex.
- Il costrutto GENERATE_TEXT di BigQuery verrà utilizzato per richiamare l'API PaLM in remoto da Vertex AI.
7. Crea una connessione esterna
Abilita l'API BigQuery Connection se non l'hai già fatto e annota l'ID del service account dai dettagli di configurazione della connessione:
- Fai clic sul pulsante +AGGIUNGI nel riquadro Esplora BigQuery (a sinistra della console BigQuery) e fai clic su "Connessione a origini dati esterne" nelle origini più utilizzate elencate
- Seleziona "BigLake e funzioni remote" come tipo di connessione, fornisci "Regione" come tipo di località e "us-central1 (Iowa)" come valore e "bq_llm_connection" come ID connessione

- Una volta creata la connessione, prendi nota del service account generato dai dettagli di configurazione della connessione
Concedi le autorizzazioni
In questo passaggio concederemo le autorizzazioni al service account per accedere al servizio Vertex AI:
Apri IAM e aggiungi il service account che hai copiato dopo aver creato la connessione esterna come entità e seleziona il ruolo "Utente Vertex AI"

8. Crea un modello ML remoto
Crea il modello remoto che rappresenta un modello linguistico di grandi dimensioni di Vertex AI ospitato:
CREATE OR REPLACE MODEL
movie_insights.llm_model REMOTE
WITH CONNECTION `us-central1.bq_llm_connection` OPTIONS (remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');
Crea un modello denominato llm_model nel set di dati movie_insights che utilizza l'API CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 di Vertex AI come funzione remota. Il completamento dell'operazione richiede alcuni secondi.
9. Genera testo utilizzando il modello ML
Una volta creato il modello, utilizzalo per generare, riassumere o classificare il testo.
SELECT
ml_generate_text_result['predictions'][0]['content'] AS generated_text,
ml_generate_text_result['predictions'][0]['safetyAttributes']
AS safety_attributes,
* EXCEPT (ml_generate_text_result)
FROM
ML.GENERATE_TEXT(
MODEL `movie_insights.llm_model`,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES
),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens));
**Spiegazione:
ml_generate_text_result** è la risposta del modello di generazione di testo in formato JSON che contiene sia attributi di contenuti sia di sicurezza: a. I contenuti rappresentano il risultato del testo generato b. Gli attributi di sicurezza rappresentano il filtro dei contenuti integrato con una soglia regolabile abilitata nell'API Vertex AI Palm per evitare risposte non intenzionali o impreviste dal modello linguistico di grandi dimensioni. La risposta viene bloccata se viola la soglia di sicurezza
ML.GENERATE_TEXT è il costrutto che utilizzi in BigQuery per accedere al modello linguistico di grandi dimensioni di Vertex AI per eseguire attività di generazione di testo
CONCAT aggiunge l'istruzione PROMPT e il record del database
movie_insights è il nome del set di dati e movie_score è il nome della tabella che contiene i dati che utilizzeremo nella progettazione del prompt
Temperatura è il parametro del prompt per controllare la casualità della risposta. Più è basso, meglio è in termini di pertinenza
Max_output_tokens è il numero di parole che vuoi nella risposta
La risposta della query è simile alla seguente:

Come puoi vedere, la risposta è nidificata e non formattata.
10. Appiattisci il risultato della query
Appiattiamo il risultato in modo da non dover decodificare esplicitamente il JSON nella query:
SELECT
*
FROM
ML.GENERATE_TEXT( MODEL movie_insights.llm_model,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES),
STRUCT( 0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
**Spiegazione:
Flatten_json_output** rappresenta il valore booleano che, se impostato su true, restituisce un testo piatto e comprensibile estratto dalla risposta JSON.
La risposta della query è simile alla seguente:

11. Libera spazio
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo post, puoi eliminare l'endpoint Vertex AI creato nell'ambito del passaggio ML andando alla pagina Endpoint Vertex AI.
12. Complimenti
Complimenti! Hai creato correttamente un modello BQML ed eseguito analisi basate su LLM utilizzando un'API Vertex AI sul set di dati movies utilizzando solo query SQL. Consulta la documentazione del prodotto LLM di Vertex AI per saperne di più sui modelli disponibili.