Generative Insights mit BigQuery SQL und Vertex AI

1. Einführung

In diesem Codelab erstellen wir eine Anwendung, die den Erfolg von Filmen vorhersagen und konkrete Handlungsempfehlungen geben kann. Dabei verwenden wir BigQuery SQL-Abfragen und die Vertex AI PaLM API. Das für die Textgenerierung verwendete Modell ist text-bison und wird als Remote-Funktion in BigQuery gehostet.

Folgende Dienste werden verwendet:

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

Aufgaben

Sie erstellen

  • Ein BigQuery-Dataset, das das Modell enthält
  • Ein BigQuery ML-Modell, das den Erfolgsindex eines Films basierend auf den Attributen GENRE und RUNTIME des Films vorhersagt
  • Ein BigQuery-Modell, das die Vertex AI PaLM API als Remote-Funktion hostet
  • Eine externe Verbindung, um die Verbindung zwischen BigQuery und Vertex AI herzustellen

2. Voraussetzungen

  • Ein Browser, z. B. Chrome oder Firefox
  • Ein Google Cloud-Projekt mit aktivierter Abrechnung

Hinweis

  1. Wählen Sie in der Google Cloud Console auf der Seite zur Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist
  3. Achten Sie darauf, dass alle erforderlichen APIs (BigQuery API, Vertex AI API, BigQuery Connection API) aktiviert sind.
  4. Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird und in der bq vorinstalliert ist. Dokumentation zu gcloud-Befehlen und deren Verwendung

Klicken Sie in der Cloud Console rechts oben auf „Cloud Shell aktivieren“:

51622c00acec2fa.png

Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es festzulegen:

gcloud config set project <YOUR_PROJECT_ID>
  1. Rufen Sie die BigQuery-Konsole direkt auf, indem Sie die folgende URL in Ihren Browser eingeben: https://console.cloud.google.com/bigquery

3. Daten vorbereiten

In diesem Anwendungsfall verwenden wir das Movies-Dataset, das aus der movielens-Quelle abgeleitet wurde.

  1. Dataset erstellen:

Ein BigQuery-Dataset ist eine Sammlung von Tabellen. Alle Tabellen in einem Dataset werden am selben Datenspeicherort gespeichert. Sie können auch benutzerdefinierte Zugriffssteuerungen anhängen, um den Zugriff auf ein Dataset und seine Tabellen einzuschränken.

Erstellen Sie in Cloud Shell mit dem Befehl „bq mk“ ein Dataset mit dem Namen „movie_insights“.

bq mk --location=us-central1 movie_insights
  1. Klonen Sie die Quelldatei auf Ihre Cloud Shell-Instanz:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Wechseln Sie zum neuen Projektverzeichnis, das auf Ihrer Cloud Shell-Maschine erstellt wurde:
cd movie_score_genai_insights
  1. Verwenden Sie den Befehl „bq load“, um Ihre CSV-Datei in eine BigQuery-Tabelle zu laden. Sie können die Datei auch direkt über die BigQuery-Benutzeroberfläche hochladen:
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. Sie können eine Stichprobe abfragen, um zu prüfen, ob die Tabelle „movie_score“ und die Daten im Dataset erstellt wurden:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. Daten für ML

Wir erstellen ein Klassifizierungsmodell, um den Erfolgsfaktor des Films basierend auf den Attributen GENRE und RUNTIME vorherzusagen. Wir verwenden die Anweisung CREATE MODEL mit der Option „LOGISTIC_REG“, um ein logistisches Regressionsmodell zu erstellen und zu trainieren.

Führen Sie die folgende Abfrage im Bereich „QUERY EDITOR“ des BigQuery Console SQL-Arbeitsbereichs aus:

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';

Abfragedetails:

  1. Die CREATE MODEL-Anweisung trainiert ein Modell anhand der Trainingsdaten in der SELECT-Anweisung.
  2. Die OPTIONS-Klausel gibt den Modelltyp und die Trainingsoptionen an. In diesem Fall gibt die Option LOGISTIC_REG als Typ ein logistisches Regressionsmodell an. Sie müssen nicht angeben, ob ein binäres logistisches Regressionsmodell oder ein logistisches Regressionsmodell mit mehreren Klassen vorliegt: BigQuery ML kann anhand der Anzahl der eindeutigen Werte in der Labelspalte bestimmen, welches davon trainiert werden soll.
  3. data_split_method=‘NO_SPLIT' zwingt BQML, die Daten gemäß den Abfragebedingungen (data_cat = ‘TRAIN') zu trainieren. Es ist besser, in dieser Option ‘AUTO_SPLIT' zu verwenden, damit das Framework (oder der Dienst in diesem Fall) die Partition der Trainings-/Testaufteilungen randomisieren kann.
  4. Mit der Option „input_label_cols“ wird angegeben, welche Spalte in der SELECT-Anweisung als Labelspalte verwendet werden soll. Hier ist die Labelspalte „score“, sodass das Modell anhand der anderen in jeder Zeile vorhandenen Werte lernt, welcher der 10 Werte von „score“ am wahrscheinlichsten ist.
  5. Mit der Option „auto_class_weights=TRUE“ werden die Klassenlabels in den Trainingsdaten gewichtet. Standardmäßig sind die Trainingsdaten ungewichtet. Wenn die Labels in den Trainingsdaten nicht ausgewogen sind, lernt das Modell die Vorhersage der beliebtesten Labelklasse unter Umständen zu intensiv.
  6. Mit der SELECT-Anweisung wird die Tabelle abgefragt, die wir mit den CSV-Daten geladen haben. Die WHERE-Klausel filtert die Zeilen in der Eingabetabelle so, dass in diesem Schritt nur das TRAIN-Dataset ausgewählt wird.
  7. Die folgenden Konstrukte sind OPTIONAL, damit BigQuery ML sie explizit in der Vertex AI Model Registry registrieren kann. Weitere Informationen finden Sie in diesem Blog. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental'].

Nach der Erstellung wird im SCHEMA-Bereich des BigQuery SQL-Arbeitsbereichs Folgendes angezeigt:

2e43087f914aa466.png

Nach dem Erstellen des Modells bewerten Sie die Leistung des Modells mit der Funktion ML.EVALUATE. Die Funktion ML.EVALUATE wertet die vorhergesagten Werte anhand der tatsächlichen Daten aus.

Sie können die Bewertungsmesswerte Ihres Modells auch auf der Seite „MODELL“ aufrufen:

7f2dc168bac0ac1a.png

Wichtige Messwerte im Überblick:

Präzision: Welcher Anteil der positiven Identifizierungen war tatsächlich korrekt? Precision = Richtig positiv / (Richtig positiv + Falsch positiv) Recall – Welcher Anteil der tatsächlich positiven Ergebnisse wurde richtig identifiziert? Recall = Richtig positive Ergebnisse / (Richtig positive Ergebnisse + Falsch negative Ergebnisse) Genauigkeit: Ein Messwert zur Bewertung von Klassifizierungsmodellen. Er gibt den Anteil der Vorhersagen an, die unser Modell tatsächlich richtig getroffen hat. Genauigkeit = Anzahl der richtigen Vorhersagen / Gesamtzahl der Vorhersagen

5. Vorhersage der Filmbewertung mit dem Modell

Zeit für die nächste Vorhersage!!!! Mit der folgenden Abfrage wird der Score jedes Films im Dataset vorhergesagt, der als „TEST“-Daten kategorisiert ist.

Führen Sie die folgende Abfrage im Bereich „QUERY EDITOR“ des BigQuery Console SQL-Arbeitsbereichs aus:

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

Das Ergebnis sieht so aus:

c719844860ce7c27.png

Das Modellergebnis zeigt den predicted_score des Films auf einer Skala von 1 bis 10 (Klassifizierung). Sie fragen sich sicher, warum es für jeden Film mehrere Vorhersagezeilen gibt. Das liegt daran, dass das Modell die möglichen vorhergesagten Labels und die Wahrscheinlichkeit ihres Auftretens in absteigender Reihenfolge zurückgegeben hat.

Vorhersageergebnisse und Modell analysieren:

Sie können zwei wichtige Analyseschritte mit der Vorhersage durchführen, um die Ergebnisse zu verstehen:

  1. Mit der Funktion ML.EXPLAIN_PREDICT können Sie ermitteln, warum Ihr Modell diese Vorhersageergebnisse generiert.
  2. Mit der Funktion ML.GLOBAL_EXPLAIN können Sie ermitteln, welche Features im Allgemeinen zur Ermittlung der Einkommensklasse am wichtigsten sind.

Eine detaillierte Beschreibung dieser Schritte finden Sie in der Dokumentation.

6. Daten für generative KI

Wir möchten Erkenntnisse aus dem Filmdataset gewinnen, indem wir das LLM (Large Language Model) mit Generative AI und dem text-bison-Modell (neueste Version) von Vertex AI nur mit SQL-Abfragen nach einer Zusammenfassung der Faktoren fragen, die dazu führen, dass die Filmbewertung höher als 5 ist.

  1. Die Tabelle „movie_score“, die wir erstellt haben, ist auch die Eingabe für diesen Schritt.
  2. Es wird eine externe Verbindung erstellt, um den Zugriff zwischen BigQuery ML und Vertex-Diensten herzustellen.
  3. Das BigQuery-Konstrukt GENERATE_TEXT wird verwendet, um die PaLM API remote von Vertex AI aufzurufen.

7. Externe Verbindung erstellen

Aktivieren Sie die BQ Connection API, falls noch nicht geschehen, und notieren Sie sich die Dienstkonto-ID aus den Details der Verbindungskonfiguration:

  1. Klicken Sie im Bereich „BigQuery Explorer“ (links in der BigQuery Console) auf die Schaltfläche „+ HINZUFÜGEN“ und dann in der Liste der beliebten Quellen auf „Verbindung zu externen Datenquellen“.
  2. Wählen Sie „BigLake und Remotefunktionen“ als Verbindungstyp aus, geben Sie „Region“ als Standorttyp und „us-central1 (Iowa)“ als Wert an und verwenden Sie „bq_llm_connection“ als Verbindungs-ID.

8a87802ab0846a6.png

  1. Notieren Sie sich nach dem Erstellen der Verbindung das Dienstkonto, das aus den Details der Verbindungskonfiguration generiert wurde.

Berechtigungen erteilen

In diesem Schritt gewähren wir dem Dienstkonto Berechtigungen für den Zugriff auf den Vertex AI-Dienst:

Öffnen Sie IAM, fügen Sie das Dienstkonto, das Sie nach dem Erstellen der externen Verbindung kopiert haben, als Hauptkonto hinzu und wählen Sie die Rolle „Vertex AI-Nutzer“ aus.

ff8e1d730879f972.png

8. Remote-ML-Modell erstellen

Erstellen Sie das Remote-Modell, das ein gehostetes Vertex AI-LLM darstellt:

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');

Dadurch wird ein Modell namens llm_model im Dataset movie_insights erstellt, das die CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API von Vertex AI als Remote-Funktion nutzt. Dieser Vorgang kann einige Sekunden dauern.

9. Text mit dem ML-Modell generieren

Nachdem Sie das Modell erstellt haben, können Sie es verwenden, um Text zu generieren, zusammenzufassen oder zu kategorisieren.

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));

**Erläuterung:

**ml_generate_text_result** ist die Antwort des Modells zur Textgenerierung im JSON-Format, die sowohl Inhalts- als auch Sicherheitsattribute enthält: a. „Content“ steht für das generierte Textergebnis b. Sicherheitsattribute stellen den integrierten Inhaltsfilter mit einem anpassbaren Grenzwert dar, der in der Vertex AI Palm API aktiviert ist, um unbeabsichtigte oder unvorhergesehene Antworten des Large Language Model zu vermeiden. Die Antwort wird blockiert, wenn sie den Sicherheitsgrenzwert überschreitet.

ML.GENERATE_TEXT ist das Konstrukt, das Sie in BigQuery verwenden, um auf das Vertex AI LLM zuzugreifen und Aufgaben zur Textgenerierung auszuführen.

CONCAT hängt Ihre PROMPT-Anweisung und den Datenbankdatensatz an.

movie_insights ist der Name des Datasets und „movie_score“ der Name der Tabelle mit den Daten, die wir für das Prompt-Design verwenden.

Die Temperatur ist der Prompt-Parameter, mit dem die Zufälligkeit der Antwort gesteuert wird. Je niedriger, desto besser in Bezug auf die Relevanz.

Max_output_tokens ist die Anzahl der Wörter, die Sie in der Antwort wünschen.

Die Antwort auf die Anfrage sieht so aus:

a3691afc0a97e724.png

Wie Sie sehen, ist die Antwort verschachtelt und nicht formatiert.

10. Abfrageergebnis zusammenführen

Wir vereinfachen das Ergebnis, damit wir das JSON nicht explizit in der Abfrage decodieren müssen:

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));

**Erläuterung:

„flatten_json_output“** stellt den booleschen Wert dar, der, wenn er auf „true“ gesetzt ist, einen einfachen, verständlichen Text zurückgibt, der aus der JSON-Antwort extrahiert wurde.

Die Antwort auf die Anfrage sieht so aus:

1aaa0c514fccab59.png

11. Bereinigen

Wenn Sie vermeiden möchten, dass Ihrem Google Cloud-Konto Gebühren für die in diesem Beitrag verwendeten Ressourcen entstehen, können Sie den Vertex AI-Endpunkt löschen, den Sie im Rahmen des ML-Schritts erstellt haben. Rufen Sie dazu die Seite „Vertex AI-Endpunkt“ auf.

12. Glückwunsch

Glückwunsch! Sie haben erfolgreich ein BQML-Modell erstellt und LLM-basierte Analysen mit einer Vertex AI API für Ihr Filmdataset nur mit SQL-Abfragen durchgeführt. Weitere Informationen zu den verfügbaren Modellen finden Sie in der Produktdokumentation zu Vertex AI LLM.