Approfondimenti generativi con BigQuery SQL e Vertex AI

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 è:

  1. BigQuery ML
  2. API Vertex AI PaLM
  3. Cloud Shell

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 GENERE e DURATA 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

  1. Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud.
  2. Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata per un progetto.
  3. Assicurati che tutte le API necessarie (API BigQuery, API Vertex AI, API BigQuery Connection) siano attivate.
  4. Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud 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:

51622c00acec2fa.png

Se il progetto non è impostato, utilizza il seguente comando per impostarlo:

gcloud config set project <YOUR_PROJECT_ID>
  1. 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 sui film derivato dall'origine movielens.

  1. Crea un set di dati:

Un set di dati BigQuery è una raccolta di tabelle. Tutte le tabelle di un set di dati sono archiviate nella stessa posizione dei dati. Puoi anche allegare 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
  1. Clona il file di origine nella tua macchina Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Vai alla nuova directory del progetto creata nella tua macchina Cloud Shell:
cd movie_score_genai_insights
  1. Utilizza il comando bq load per caricare il file CSV in una tabella BigQuery (tieni presente che puoi anche caricare direttamente dall'interfaccia utente 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
  1. Puoi eseguire una query su un campione per verificare se la tabella movie_score e i dati vengono 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 il machine learning

Creiamo un modello di classificazione per prevedere il punteggio di successo del film in base agli attributi GENERE e DURATA. 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 QUERY di BigQuery console SQL Workspace:

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 della query:

  1. L'istruzione CREATE MODEL addestra un modello utilizzando i dati di addestramento nell'istruzione SELECT.
  2. La clausola OPTIONS specifica il tipo di modello e le opzioni di addestramento. In questo caso, 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 unici nella colonna dell'etichetta.
  3. data_split_method='NO_SPLIT' impone a BQML di eseguire l'addestramento sui dati in base alle condizioni della query (data_cat = 'TRAIN'). Tieni presente che è meglio 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.
  4. L'opzione input_label_cols specifica quale colonna dell'istruzione SELECT utilizzare come colonna delle etichette. In questo caso, la colonna dell'etichetta è il punteggio, quindi il modello apprenderà quale dei 10 valori del punteggio è più probabile in base agli altri valori presenti in ogni riga.
  5. 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 sono sbilanciate, il modello potrebbe imparare a prevedere maggiormente la classe di etichette più popolare.
  6. L'istruzione SELECT esegue una query sulla tabella che abbiamo caricato con i dati CSV. La clausola WHERE filtra le righe nella tabella di input in modo che in questo passaggio venga selezionato solo il set di dati TRAIN.
  7. I seguenti costrutti sono FACOLTATIVI, quindi BigQuery ML può registrarli esplicitamente in Vertex AI Model Registry. Per saperne di più, leggi 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:

2e43087f914aa466.png

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:

7f2dc168bac0ac1a.png

Metriche chiave a colpo d'occhio:

Precisione: quale percentuale di identificazioni positive era effettivamente corretta? Precisione = veri positivi / (veri positivi + falsi positivi) Richiamo: quale percentuale di positivi effettivi è stata identificata correttamente? Richiamo = Veri positivi / (Veri positivi + Falsi negativi) Accuratezza: una metrica per valutare i modelli di classificazione, è la frazione di previsioni che il nostro modello ha effettivamente indovinato. Accuratezza = Numero di previsioni corrette / Numero totale di previsioni

5. Previsione del punteggio di un film utilizzando il modello

È l'ora delle previsioni. La seguente query prevede il punteggio di ogni film nel set di dati classificato come dati "TEST".

Esegui la query riportata di seguito nella sezione EDITOR QUERY di BigQuery console SQL Workspace:

SELECT
  *
FROM
  ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
    (
    SELECT
      *
    FROM
      movie_insights.movie_score
    WHERE
      data_cat= 'TEST'
     )
  );

Il risultato è il seguente:

c719844860ce7c27.png

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:

  1. Per capire perché il tuo modello sta generando questi risultati di previsione, puoi utilizzare la funzione ML.EXPLAIN_PREDICT.
  2. Per sapere quali caratteristiche sono le più importanti per determinare la fascia di reddito in generale, puoi utilizzare la funzione ML.GLOBAL_EXPLAIN.

Puoi leggere informazioni dettagliate su questi passaggi nella documentazione.

6. Dati per l'AI generativa

Forniamo approfondimenti sul set di dati dei film chiedendo al LLM (Large Language Model) il riepilogo dei fattori che influenzano il punteggio del film in modo che sia superiore a 5, con l'AI generativa che utilizza il modello text-bison (più recente) di Vertex AI utilizzando solo query SQL

  1. Anche la tabella movie_score che abbiamo creato sarà l'input per questo passaggio.
  2. Verrà creata una connessione esterna per stabilire l'accesso tra BigQuery ML e i servizi Vertex.
  3. Il costrutto BigQuery GENERATE_TEXT verrà utilizzato per richiamare l'API PaLM da remoto da Vertex AI.

7. Crea una connessione esterna

Se non l'hai già fatto, attiva l'API BQ Connection e annota l'ID dell'account di servizio dai dettagli di configurazione della connessione:

  1. Fai clic sul pulsante +AGGIUNGI nel riquadro Explorer di BigQuery (a sinistra della console BigQuery) e fai clic su "Connessione a origini dati esterne" nelle origini più utilizzate elencate.
  2. Seleziona "BigLake e funzioni remote" come tipo di connessione, specifica "Regione" come tipo di località e "us-central1 (Iowa)" come valore e "bq_llm_connection" come ID connessione.

8a87802ab0846a6.png

  1. 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 Principal e seleziona il ruolo "Utente Vertex AI".

ff8e1d730879f972.png

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 i contenuti che gli attributi 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 indesiderate 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 LLM 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: minore è, meglio è in termini di pertinenza

Max_output_tokens è il numero di parole che vuoi nella risposta

La risposta alla query è simile alla seguente:

a3691afc0a97e724.png

Come puoi vedere, la risposta è nidificata e non formattata.

10. Appiattire 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 semplice e comprensibile estratto dalla risposta JSON.

La risposta alla query è simile alla seguente:

1aaa0c514fccab59.png

11. Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo post, puoi eliminare l'endpoint Vertex AI che hai creato nell'ambito del passaggio ML accedendo 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 tuo set di dati sui film utilizzando solo query SQL. Consulta la documentazione del prodotto Vertex AI LLM per scoprire di più sui modelli disponibili.