Willkommen im PetVerse!

1. Einführung

Willkommen bei PetVerse! Alle Haustiere sind willkommen. 🐈🐶🐍🐟🦄

Voraussetzungen

  • Grundkenntnisse der Google Cloud Console
  • Grundlegendes Verständnis von SQL-Anweisungen

Lerninhalte

  • Datasets und Tabellen in BigQuery erstellen
  • ObjectRef-Spalten erstellen, um in BigQuery auf Multimedia in einem Speicher-Bucket zu verweisen
  • KI-Funktionen in BigQuery verwenden, um Ihr Dataset mit Inhalten aus unstrukturierten Daten zu erweitern
  • Multimedia-Einbettungen erstellen, um nach ähnlichen Medien zu suchen
  • Texteinbettungen erstellen, um mit VECTOR_SEARCH eine semantische Suche durchzuführen
  • Webanwendung mit der Gemini CLI erstellen

Voraussetzungen

  • Ein Google Cloud-Konto und ein Google Cloud-Projekt mit einem Abrechnungskonto
  • Ein Webbrowser wie Chrome

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich (kann nach dem Festlegen nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf Ihre Projekt-ID verweisen (in der Regel als PROJECT_ID angegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen Namen versuchen und sehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs kostet wenig oder gar nichts. Wenn Sie Ressourcen herunterfahren möchten, um Kosten zu vermeiden, die über diese Anleitung hinausgehen, können Sie die erstellten Ressourcen oder das Projekt löschen. Neue Google Cloud-Nutzer können am kostenlosen Testzeitraum mit einem Guthaben von 300$ teilnehmen.

3. Cloud Shell öffnen

Rufen Sie https://shell.cloud.google.com/?show=ide%2Cterminal auf . Wenn Sie dazu aufgefordert werden, klicken Sie auf Autorisieren.

1bfca4be2c270a9f.png

Achten Sie darauf, dass sowohl der Editor als auch die Konsole sichtbar sind:

785d186a8b11b32b.png

4. Hilfsskript erstellen

Um diesen Vorgang zu vereinfachen, erstellen Sie ein Hilfsskript, das die relevanten Umgebungsvariablen festlegt.

Ersetzen Sie unten <<Project ID>> durch Ihre Projekt-ID.

Kopieren Sie den folgenden Befehl in das Cloud Shell-Terminal und drücken Sie die Eingabetaste, um ihn auszuführen**.**

gcloud config set project <<PROJECT_ID>>

ffd97bad1f398b4b.png

Kopieren Sie den folgenden Befehl in das Cloud Shell-Terminal und drücken Sie die Eingabetaste, um ihn auszuführen**.** Dadurch werden die erforderlichen Dienste aktiviert und die Datei wird erstellt und in Cloud Shell bearbeitet.

gcloud services enable compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       aiplatform.googleapis.com \
                       storage-component.googleapis.com  \
                       bigqueryconnection.googleapis.com \
run.googleapis.com \
secretmanager.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com  \
iap.googleapis.com
edit  ~/petverse-setup.sh

Es sollte ein neuer Tab mit dem Namen der Datei angezeigt werden. Fügen Sie das folgende Skript in die neue Datei ein:

#!/bin/bash

# -----------------------------------------------------------------------------
# 1. Global Variables: Set your desired project ID and region here.
# -----------------------------------------------------------------------------

# 🦄 🦄 Set your project ID here ⬇️.

# Example: PROJECT_ID="your-project-id"
PROJECT_ID=""

# Set your desired region here. Default is 'us-central1'.
# Example: REGION="us-east1"
REGION="us-central1"

# -----------------------------------------------------------------------------
# 2. Check and Authenticate
# -----------------------------------------------------------------------------

echo "  ➡️   Checking for active Google Cloud authentication..."

# Check if the user is authenticated; if not, prompt for authentication.
if ! gcloud auth list --format="value(account)" | grep -q @; then
  echo "⚠️   Not authenticated. Please authenticate now."
  gcloud auth login
fi

echo "  ✅   Authentication check passed."

# -----------------------------------------------------------------------------
# 3. Get Project ID from User if not set
# -----------------------------------------------------------------------------

# If PROJECT_ID is not set in the script or as an environment variable,
# prompt the user to choose one.
if [[ -z "$PROJECT_ID" ]] && [[ -n "$DEVSHELL_PROJECT_ID" ]]; then
  PROJECT_ID=$DEVSHELL_PROJECT_ID
fi

if [[ -z "$PROJECT_ID" ]]; then
  echo "  ⚠️   Project ID is not set. Listing available projects:"
 
  # List projects and store them in an array.
  projects_array=($(gcloud projects list --format="value(projectId)"))
 
  # Check if projects were found.
  if [[ ${#projects_array[@]} -eq 0 ]]; then
    echo "  ❌   No projects found. Please ensure your account has access to projects."
    exit 1
  fi
 
  # Display the projects and prompt for input.
  echo " "
  echo "Available Projects:"
  for project in "${projects_array[@]}"; do
    echo "$project"
  done
 
  echo " "
  read -p "Please enter your desired project ID from the list above: " PROJECT_ID
 
  # Validate the user's input by checking if it's in the array.
  if [[ ! " ${projects_array[@]} " =~ " ${PROJECT_ID} " ]]; then
    echo "  ❌   Invalid project ID. Please run the script again and select a valid ID."
    exit 1
  fi
fi

echo "  ✅   Project ID set to: $PROJECT_ID"

# -----------------------------------------------------------------------------
# 4. Set Environment Variables
# -----------------------------------------------------------------------------

# Set the project and region for the current session.
echo "  🔄   Setting Google Cloud configuration for this session..."
gcloud config set project "$PROJECT_ID"
gcloud config set compute/region "$REGION"

echo "  ✅   Google Cloud configuration updated."
echo "Project ID: $PROJECT_ID"
echo "Region: $REGION"
echo " "
echo "  🎉 🦄 🦄   Script execution complete. You can now use Google Cloud commands in this shell session."

Ersetzen Sie den Platzhalter für PROJECT_ID durch den Namen Ihres Projekts:

aec2195d576244dd.png

Kopieren Sie den folgenden Befehl und führen Sie ihn im Terminal aus:

chmod +x petverse-setup.sh
~/petverse-setup.sh

Erwartete Ausgabe:

83d1f7405624443b.png

5. Storage-Bucket erstellen

Erstellen Sie einen Cloud Storage-Bucket und kopieren Sie die verfügbaren Media in Ihren eigenen Bucket. Hier werden verfügbare Medien für unsere wunderbaren Haustiere gespeichert. Außerdem erstellen Sie eine Verbindung, um über BigQuery auf den Bucket zuzugreifen.

Fügen Sie Folgendes in das Terminal ein und führen Sie es aus:

~/petverse-setup.sh
cd ~/
gcloud storage buckets create gs://$DEVSHELL_PROJECT_ID-petverse --uniform-bucket-level-access --location=us-central1
gcloud storage cp -r gs://sample-data-and-media/petverse/* gs://$DEVSHELL_PROJECT_ID-petverse/
bq mk --dataset --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID petverse
bq mk --connection --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID \
--connection_type=CLOUD_RESOURCE pet-connection
echo "your bucket is gs://$DEVSHELL_PROJECT_ID-petverse "

379f72ee2908da36.png

6. Tabelle „pets“ erstellen

Als Nächstes erstellen Sie eine Tabelle in BigQuery, in der Informationen zu Ihren Haustieren gespeichert werden.

Öffnen Sie einen neuen Tab im Browser. Rufen Sie https://console.cloud.google.com/bigquery auf .

Prüfen Sie, ob in der Console dasselbe Projekt ausgewählt ist, das Sie bisher verwendet haben:

f82010a317866e6.png

Sie können jetzt eine Tabelle mit den Daten in der Datei pets.csv erstellen. Diese Datei enthält die Namen, Lieblingsfutter, Spielzeug und andere interessante Informationen über unsere Haustiere.

Kopieren Sie den folgenden Code in eine neue SQL-Abfrage, um eine physische Tabelle zu erstellen und die Daten zu laden.

LOAD DATA INTO petverse.pets
OPTIONS(
    description="Table for furry friend data"
  )
FROM FILES (
  skip_leading_rows=1,
  uris = ['gs://<<your_bucket_name>>/pets.csv'],
  format = 'CSV'
);

Ersetzen Sie den Platzhalter für den Bucket im Code durch den Bucket, den Sie im vorherigen Schritt erstellt haben.

In einem separaten Browsertab unter https://console.cloud.google.com/storage/browser können Sie alle Ihre Speicher-Buckets aufrufen .

757813944bb3d8ba.png

Klicken Sie auf den Button Ausführen, um die Abfrage auszuführen.

Wenn die Daten erfolgreich geladen wurden, klicken Sie auf Zur Tabelle.

d6aab61d533bedde.png

Klicken Sie auf Vorschau, um den Inhalt der Tabelle zu sehen. 20fb1cbf8826efca.png

7. BigQuery mit dem Storage-Bucket verbinden

Wenn Sie sich den Bucket ansehen, den Sie zuvor erstellt haben, finden Sie eine Reihe von Media-Dateien für jedes Haustier.

243751f1b0aab329.gif

BigQuery kann Daten aus diesen Buckets lesen und die Dateien zusammen mit Daten in Tabellen verwenden. Dieser Werttyp wird als ObjectRef bezeichnet.

Rufen Sie die Dienstkonto-ID für die zuvor erstellte Verbindung ab, indem Sie unter Externe Verbindungen darauf klicken.

1d9d3275483f5650.png

Kopieren Sie die Dienstkonto-ID.

Rufen Sie die IAM-Admin-Konsole in einem neuen Tab auf ( https://console.cloud.google.com/iam-admin/ ).

Weisen Sie dem Dienstkonto die Rollen Storage-Objekt-Betrachter und Vertex AI-Nutzer zu (diese Berechtigung wird später verwendet).

f1ff6b305d914532.png

Klicken Sie auf Speichern und 🕰️ warten Sie einige Minuten.

Zurück auf dem Tab „BigQuery“ können Sie die folgende Abfrage in BigQuery Studio verwenden, um die Verbindung zwischen BigQuery und dem Speicher-Bucket zu testen.

Ersetzen Sie <<PROJECT_ID>> durch Ihre Projekt-ID.

SET @@location='us-central1';
SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))

Klicken Sie auf Ergebnisse ansehen. Sie sollten die Metadaten in den Ergebnissen erhalten:

9e3d986b797e413a.png

8. Speichermedien zu strukturierten Daten hinzufügen

Sie können die Tabelle Haustiere erweitern, um eine Spalte mit dem Profilbild jedes Haustiers hinzuzufügen, sofern verfügbar. Außerdem fügen Sie eine weitere Spalte mit einem Array von Media-Referenzen hinzu, um alle anderen Dateien zu speichern, die mit den einzelnen Haustieren verknüpft sind.

Für den Zugriff auf die Multimedia-Inhalte ist eine Verbindung erforderlich, die Sie zu Beginn dieses Codelabs nach dem Erstellen Ihres Buckets eingerichtet haben.

Fügen Sie die folgenden Befehle in eine BigQuery-SQL-Konsole ein und führen Sie sie aus, um der Tabelle pets zwei Spalten hinzuzufügen.

SET @@location='us-central1';
ALTER TABLE petverse.pets
ADD COLUMN IF NOT EXISTS profile_picture STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>,
ADD COLUMN IF NOT EXISTS additional_media ARRAY<STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>>;

Kopieren Sie die folgenden Anweisungen und ersetzen Sie den Platzhalter für PROJECT_ID durch Ihre Projekt-ID.

SET @@location='us-central1';

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Yoda_asks_for_cuddles.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 1;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/madonna_profile_picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Madonna_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 2;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pixel_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_thug_life.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 3;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/sql_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_favorite_toy.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 4;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/buddy_golden_retriever.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = NULL
WHERE Id = 5;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/daisy_french_bulldog.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = NULL
WHERE Id = 6;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/max_german_shepherd.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/max_description_tells_jokes.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 7;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 8;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/rocky_description.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))] WHERE Id = 9;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pip_hamster.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pip_Hamster_Wheel_Video_Generated.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 10;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 11;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/scales_snake.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = NULL
WHERE Id = 12;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 13;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/Joel_Profile_Picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Catwalk.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Flowers.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Plays.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 14;

Führen Sie die Anweisung aus. Nach einigen Minuten sollten erfolgreiche Ausführungen angezeigt werden:

4fa3bba70440fa65.png

Sehen Sie sich die Ergebnisse in der Tabellenvorschau an. Sie sollten die Metadaten für vorhandene Profilbilder und zusätzliche Medien für die Katze namens Pixel sehen.

SELECT *
FROM `petverse.pets`
WHERE name = 'Pixel'

a1511d749e88d5f5.png

9. Beschreibungen von Haustieren generieren

Wenn Sie sich die Tabelle pets in der Vorschau ansehen, werden Sie feststellen, dass bei einigen Haustieren, z. B. Yoda, Pixel oder Rocky, das Lieblingsessen oder das Lieblingsspielzeug fehlt.

Die Antworten auf diese Fragen finden Sie möglicherweise in den Videos und Audiodateien, die sich auf diese Haustiere beziehen. Sie verwenden eingebettete KI‑Funktionen, um die Prüfung durchzuführen.

Testen Sie dies mit der folgenden Aussage:

SELECT name,
AI.GENERATE(
   prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
    connection_id => 'us-central1.pet-connection',
    endpoint => 'gemini-2.5-flash',
output_schema => 'food STRING, toy STRING')
FROM petverse.pets
WHERE name = 'Rocky'

Das Video von Rocky ist in Ihrem Storage-Bucket zu sehen.

Verwenden Sie die folgende Anweisung, um die fehlenden Beschreibungen zu aktualisieren:

UPDATE petverse.pets AS p
SET FavoriteFood = aigen.food
FROM
  (
    SELECT Id, name,
          AI.GENERATE(
                prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
                connection_id => 'us-central1.pet-connection',
                endpoint => 'gemini-2.5-flash',
                output_schema => 'food STRING').food
    FROM petverse.pets ) AS  aigen
WHERE p.Id = aigen.Id
AND p.FavoriteFood IS NULL
AND p.additional_media IS NOT NULL

Verwenden Sie die folgende Anweisung, um eine Beschreibung der Haustiere basierend auf ihren Multimedia-Inhalten in einer neuen Spalte zu erstellen:

ALTER TABLE petverse.pets ADD COLUMN MediaDescription STRING;
UPDATE petverse.pets AS p
SET MediaDescription = aigen.description
FROM
  (
    SELECT Id, name,
          AI.GENERATE(
                prompt=> ('Create a description in an epic tone for this pet based on these media: ', additional_media ),
                connection_id => 'us-central1.pet-connection',
                endpoint => 'gemini-2.5-flash',
                output_schema => 'description STRING').description
    FROM petverse.pets ) AS  aigen
WHERE p.Id = aigen.Id
AND p.MediaDescription IS NULL
AND p.additional_media IS NOT NULL

Nach einigen Minuten sollten Sie einige Creative-Beschreibungen sehen:

fab3b59caa69aec7.png

10. Einbettungen erstellen

Erstellen Sie eine Tabelle zum Speichern der Einbettungen für die Profilbilder sowie für die Beschreibungen und Hobbys, die in einer semantischen Suche verwendet werden sollen. Wir suchen mithilfe von Vektorsuchen nach Ähnlichkeiten zwischen Haustieren.

SET @@location='us-central1';

CREATE OR REPLACE MODEL petverse.multimodalembedding
  REMOTE WITH CONNECTION `us-central1.pet-connection`
  OPTIONS(ENDPOINT = 'multimodalembedding@001');

CREATE TABLE IF NOT EXISTS petverse.profile_embeddings
AS
SELECT *
FROM ML.GENERATE_EMBEDDING(
  MODEL petverse.multimodalembedding,
    (
      SELECT profile_picture as content,
      Id
      FROM petverse.pets)
 );

CREATE OR REPLACE MODEL petverse.textembedding
  REMOTE WITH CONNECTION `us-central1.pet-connection`
  OPTIONS (ENDPOINT = 'text-embedding-005');

CREATE OR REPLACE TABLE petverse.text_embeddings AS
SELECT * FROM ML.GENERATE_EMBEDDING(
  MODEL petverse.textembedding,
  (
    SELECT CONCAT(AdoptionStory, ' . This pet\'s hobby is: ', Hobby, ' and their nickname(s) is: ', COALESCE(Nicknames, Name)) AS content,
    Id, Name
    FROM petverse.pets
    WHERE LENGTH(AdoptionStory) > 0 AND LENGTH(Hobby) > 0
  )
)
WHERE LENGTH(ml_generate_embedding_status) = 0;

Sehen Sie sich die neue Tabelle auf dem Tab „Ergebnisse“ an.

c9e876d75147c343.png

Mit der folgenden Anweisung können Sie den Status aller Einbettungen prüfen:

SELECT DISTINCT(ml_generate_embedding_status),
  COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;

Wenn Fehler auftreten, werden sie in einem nicht leeren Status angezeigt. Das ist die richtige Ausgabe: Es sind keine Datensätze mit Fehlern vorhanden**:

e6754936c31ca5cf.png

Im Folgenden finden Sie ein Beispiel für Datensätze mit Fehlern. Diese sind nicht zu erwarten, müssen aber behoben werden, bevor Sie mit den nächsten Schritten fortfahren können:

736545fbc7ce4ac8.png

Nach ähnlichen Haustieren suchen

Das Standard-Dataset enthält ähnliche Haustiere. Hier sind zwei Beispiele: „Pixel“ (ID: 3) und „SQL“ (ID: 4):

cfebe01afc5f4858.png

Sie können die Entfernung zwischen den Einbettungen verwenden, um ähnliche Haustiere zu berechnen:

SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;

Sie sollten Ergebnisse mit den IDs von Bildern erhalten, die einander ähneln. Das Bild wird dann in seiner Gesamtheit aufgenommen. In diesem Beispiel sind Pixel und SQL ähnlich. Das nächste ähnliche Haustier ist Joel (ID: 14).

99ce203add04a6b1.png

Hier ist ein Bild von Joel zur Orientierung:

f78e0ca0fe235ba2.png

Mit der Funktion VECTOR_SEARCH können Sie semantische Suchen in Texteinbettungen durchführen. Wenn diese Tabelle größer wäre, müssten Sie einen Index für die Einbettungen erstellen.

SELECT query.query, base.content, base.Name
FROM VECTOR_SEARCH(
  TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result',
  (
  SELECT ml_generate_embedding_result, content AS query
  FROM ML.GENERATE_EMBEDDING(
  MODEL `petverse.textembedding`,
  (SELECT 'Pets who like to relax' AS content))
  ),
  top_k => 5, options => '{"fraction_lists_to_search": 0.50}')
ORDER BY distance DESC

Ändern Sie den semantischen Suchbegriff (Pets who like to relax) und den Parameter fraction_lists_to_search, um zu sehen, was passiert. Weitere Informationen zu diesen Funktionen

11. Profilseite per Vibe Coding erstellen

Sie verwenden die Gemini CLI in Cloud Shell, um eine einfache Demo-Webanwendung zu erstellen. Diese Webanwendung wurde in ihrem Prompt vereinfacht, um zu zeigen, wie das Petverse aussehen könnte.

Kehren Sie zur Cloud Shell zurück. Wenn Sie nur die Konsole im Vollbildmodus verwenden, haben Sie folgende Vorteile:

b5061fb060f2a958.png

Führen Sie das Initialisierungsskript aus, um sicherzustellen, dass Umgebungsvariablen festgelegt sind, erstellen Sie ein Verzeichnis für dieses Projekt und führen Sie die Gemini CLI aus:

~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini

Die Gemini CLI sollte angezeigt werden:

910fda2312082974.png

Ersetzen Sie den Namen des Buckets im folgenden Prompt.

Fügen Sie den Prompt in die Gemini-Befehlszeile ein.

You are a fullstack engineer creating an application to display the profiles of cats, dogs and other pets stored in BigQuery. The table where these are stored is called pets, in the dataset petverse.
1.Application Requirements: Display the pets with their profile picture, all the other information in the Pets table, and other media that may be available. The pictures are in a GCS bucket, the field in the table pets profile_picture.uri contains the URI for the storage bucket of that profile picture.  The field additional_media is an array of objectref that contains multiple URI to different media stored in a GCS bucket.
Important: In the code, in the values for the URIs retrieved from BigQuery, replace gs://<<YOUR_PROJECT_ID>>-petverse/ with https://storage.mtls.cloud.google.com/<<YOUR_PROJECT_ID>>-petverse/ as follows: replace('gs://', 'https://storage.mtls.cloud.google.com/'). Use the python library. Media can be pictures, videos and audio. Consider these formats in the code. Some pets may not have profile pictures or additional media.
2.Hosting: Create a web application hosted in a single container and service in Cloud Run, use the following syntax to deploy it using IAP. IMPORTANT: DO NOT ADD IAM AUTHENTICATION AND DO NOT ALLOW UNAUTHENTICATED: gcloud beta run deploy SERVICE_NAME  --region=REGION --image=IMAGE_URL  --no-allow-unauthenticated --iap
3.Database access: Display similar pets based on a similarity between embeddings in table petverse.profile_embeddings. 
Here's the schema for the pets table in CSV format (Field name, type, mode):
Id,INTEGER,NULLABLE
Name,STRING,NULLABLE
Species,STRING,NULLABLE
Breed,STRING,NULLABLE
Nationality,STRING,NULLABLE
Nicknames,STRING,NULLABLE
Hobby,STRING,NULLABLE
AdoptionStory,STRING,NULLABLE
FavoriteFood,STRING,NULLABLE
FavoriteToy,STRING,NULLABLE
profile_picture,RECORD,NULLABLE
additional_media,RECORD,REPEATED
profile_embeddings,FLOAT,REPEATED
Here's a sample query to check for similarity:
SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;
Complement the profile of each pet with a description. Here's an example of the access to such table:
SELECT Name, MediaDescription from petverse.pets;
4.For each access to BigQuery, show the SQL statement that is used in the console logs.
5.Search functionality: Add a search bar for a semantic search for pets. There's a text embedding for the Adoption story, the pet's past-time or hobby and their nicknames in the table: petverse.text_embeddings . This is a sample of semantic search:
SELECT query.query, base.content, base.Name FROM VECTOR_SEARCH(TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result', ( SELECT ml_generate_embedding_result, content AS query FROM ML.GENERATE_EMBEDDING(MODEL `petverse.textembedding`,(SELECT 'Pets who like to relax' AS content))), top_k => 5, options => '{"fraction_lists_to_search": 0.50}') ORDER BY distance DESC
6.Use Python for the backend. Generate the deployment scripts for an authenticated service using IAP with the flags --no-allow-unauthenticated --iap
7. Make the UI look like a modern art museum.
8. Use the gunicorn library. Validate version dependencies.

Das ist jetzt dein Abenteuer. Sie sehen einen Plan und werden unterwegs um Bestätigung gebeten.

Es ist sehr unwahrscheinlich, dass der Code und die Bereitstellung auf Anhieb funktionieren. Sie müssen die Gemini CLI so lange wiederholen, bis sie das gewünschte Ergebnis liefert.

Wenn Sie sehen, dass der Prozess in einer Schleife hängen bleibt, beenden Sie ihn mit STRG/Befehl + C, untersuchen Sie das Problem und geben Sie den Prompt noch einmal ein.

47d6e394fc4f5b60.png

Wir empfehlen, jede Bestätigung sorgfältig durchzulesen, um zu verstehen, was die CLI tun wird:

6a62b9c077d4cd11.png

Nach einigen Minuten sollte die Anwendung bereit sein. Es kann vorkommen, dass die Konsole scheinbar nicht reagiert:

ca51ecf7b1ce08bf.png

Sie können die Anwendung manuell auf einem neuen Cloud Shell-Tab mit gunicorn testen. Prüfen Sie, ob das Projekt festgelegt ist:

f0ee1095386f7ec.png

Sie sollten Ihre neue Website sehen. Sie sieht möglicherweise anders aus als hier. Wenn etwas nicht funktioniert, sollten Sie die Fehler- und Debugging-Logs in der Cloud Shell-Befehlszeile sehen, die lokal ausgeführt wird.

27bf3e2a8d429169.gif

Wenn alles in Ordnung ist, können Sie die Anwendung optional in Cloud Run bereitstellen.

Wenn Ihr Projekt zu einer Organisation gehört, müssen Sie IAP gemäß dieser Anleitung konfigurieren. Wenn Ihr Projekt nicht Teil einer Organisation ist, können Sie stattdessen dieser Anleitung folgen, um den Zugriff auf Ihre Anwendung zu sichern. Insbesondere für Produktionsumgebungen empfehlen wir, keinen nicht authentifizierten Zugriff zuzulassen.

2365a90ac6a7d4e5.png

Wenn die Bereitstellung funktioniert, sollte die Cloud Run-Anwendung in der Cloud Run-Konsole ausgeführt werden.

Achten Sie darauf, dass der Zugriff nur über IAP erfolgt. Fügen Sie den Nutzer über Richtlinie bearbeiten der Bindung hinzu und klicken Sie auf Speichern.

Warten Sie einige Minuten, bis die IAP-Bindungen übernommen wurden, und klicken Sie dann oben auf die URL. Die Website sollte angezeigt werden.

3943c556ba912466.png

12. Bereinigen

In diesem Schritt erfahren Sie, wie Sie die in diesem Codelab erstellten Ressourcen löschen.

Cloud Run-Dienst löschen (passen Sie den Namen der Dienste und die Region nach Bedarf an):

gcloud run services delete petverse-profiles --region us-central1

Alle BigQuery-Assets löschen:

bq rm -f petverse
gcloud bigquery connections delete pet-connection --location=us-central1