1. Wprowadzenie
Witamy w Petverse! Zwierzęta są mile widziane. 🐈🐶🐍🐟🦄
Wymagania wstępne
- Podstawowa znajomość konsoli Google Cloud
- Podstawowa znajomość instrukcji SQL
Czego się nauczysz
- Tworzenie zbiorów danych i tabel w BigQuery
- Tworzenie kolumn ObjectRef do odwoływania się do multimediów w zasobniku pamięci masowej w BigQuery
- Używanie funkcji AI w BigQuery do wzbogacania zbioru danych o treści z nieustrukturyzowanych danych
- Tworzenie wektorów dystrybucyjnych multimediów do wyszukiwania podobnych treści
- Tworzenie wektorów dystrybucyjnych tekstu do wyszukiwania semantycznego za pomocą funkcji VECTOR_SEARCH
- Tworzenie aplikacji internetowej za pomocą interfejsu wiersza poleceń Gemini
Czego potrzebujesz
- Konto Google Cloud i projekt Google Cloud z kontem rozliczeniowym
- przeglądarka, np. Chrome;
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.



- Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się tym przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako
PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu. - Warto wiedzieć, że istnieje trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego ćwiczenia nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.
3. Otwórz Cloud Shell
Otwórz stronę https://shell.cloud.google.com/?show=ide%2Cterminal . Gdy pojawi się prośba o autoryzację, kliknij Autoryzuj.

Upewnij się, że zarówno edytor, jak i konsola są widoczne:

4. Tworzenie skryptu pomocniczego
Aby ułatwić sobie to zadanie, utworzysz skrypt pomocniczy, który ustawi odpowiednie zmienne środowiskowe.
Zastąp poniżej ciąg znaków <<Project ID>> identyfikatorem projektu.
Skopiuj to polecenie do terminala Cloud Shell i naciśnij Enter, aby je wykonać**.**
gcloud config set project <<PROJECT_ID>>
Skopiuj to polecenie do terminala Cloud Shell i naciśnij Enter, aby je wykonać**.** Spowoduje to włączenie niezbędnych usług oraz utworzenie i edytowanie pliku w Cloud Shell.
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
Powinna się otworzyć nowa karta z nazwą pliku. Wklej do nowego pliku ten skrypt:
#!/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."
Zastąp symbol zastępczy PROJECT_ID nazwą projektu:

Skopiuj to polecenie i wykonaj je w terminalu:
chmod +x petverse-setup.sh
~/petverse-setup.sh
Oczekiwane dane wyjściowe:

5. Utworzenie zasobnika na dane
Utwórz zasobnik Cloud Storage i skopiuj dostępne multimedia do własnego zasobnika. Będziesz go używać do przechowywania dostępnych multimediów dla naszych wspaniałych zwierząt. Utworzysz też połączenie, aby uzyskać dostęp do zasobnika za pomocą BigQuery.
Wklej i wykonaj w terminalu to polecenie:
~/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 "

6. Tworzenie tabeli pets
Teraz utworzysz w BigQuery tabelę do przechowywania informacji o zwierzętach.
Otwórz nową kartę w przeglądarce. Otwórz stronę https://console.cloud.google.com/bigquery .
Upewnij się, że w konsoli jest wybrany ten sam projekt, którego używasz:

Możesz teraz utworzyć tabelę, korzystając z danych w pliku pets.csv. Ten plik zawiera imiona, ulubione jedzenie, zabawki i inne ciekawe informacje o naszych zwierzętach.
Skopiuj ten kod do nowego zapytania SQL, aby utworzyć tabelę fizyczną i wczytać dane.
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'
);
Zastąp w kodzie symbol zastępczy zasobnika zasobnikiem utworzonym w poprzednim kroku.
Wszystkie segmenty pamięci możesz sprawdzić na osobnej karcie przeglądarki, otwierając ten adres URL: https://console.cloud.google.com/storage/browser .

Aby wykonać zapytanie, kliknij przycisk Uruchom.
Gdy dane zostaną wczytane, kliknij Otwórz tabelę.

Kliknij Podgląd, aby wyświetlić zawartość tabeli. 
7. Łączenie BigQuery z zasobnikiem pamięci masowej
W utworzonym wcześniej zasobniku znajdziesz zestaw plików multimedialnych związanych z każdym zwierzęciem.

BigQuery może odczytywać dane z tych zasobników i używać plików razem z danymi w tabelach. Ten typ wartości nazywa się ObjectRef.
Aby uzyskać identyfikator konta usługi dla utworzonego wcześniej połączenia, kliknij je w sekcji Połączenia zewnętrzne.

Skopiuj identyfikator konta usługi.
Otwórz konsolę administracyjną IAM na nowej karcie przeglądarki ( https://console.cloud.google.com/iam-admin/ ).
Przyznaj kontu usługi uprawnienia Wyświetlający obiekty Cloud Storage i Użytkownik Vertex AI (użyjesz tych uprawnień później).

Kliknij Zapisz i 🕰️ poczekaj kilka minut.
Wróć na kartę BigQuery i użyj w BigQuery Studio tego zapytania, aby przetestować połączenie między BigQuery a zasobnikiem pamięci masowej.
Zastąp <<PROJECT_ID>> identyfikatorem projektu.
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'))
Kliknij Wyświetl wyniki. W wynikach powinny pojawić się metadane:

8. Dodawanie nośników danych do danych strukturalnych
Możesz rozszerzyć tabelę pets, aby dodać kolumnę ze zdjęciem profilowym każdego zwierzaka (jeśli jest dostępne). Dodasz też kolejną kolumnę z tablicą odwołań do multimediów, aby przechowywać wszystkie inne pliki związane z każdym zwierzęciem.
Dostęp do multimediów wymaga połączenia, które zostało utworzone na początku tego ćwiczenia w Codelabs po utworzeniu zasobnika.
Wklej te polecenia do konsoli SQL BigQuery i wykonaj je, aby dodać do tabeli pets 2 kolumny.
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>>;
Skopiuj te instrukcje i zastąp symbol zastępczy PROJECT_ID identyfikatorem swojego projektu.
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;
Uruchom instrukcję. Po kilku minutach powinny być widoczne udane wykonania:

Sprawdź wyniki w podglądzie tabeli. Powinny się wyświetlić metadane istniejących zdjęć profilowych i dodatkowych multimediów dotyczących kota o imieniu Pixel.
SELECT *
FROM `petverse.pets`
WHERE name = 'Pixel'

9. Generowanie opisów zwierząt
Jeśli wyświetlisz podgląd tabeli pets, zauważysz, że niektóre zwierzęta, np. Yoda, Pixel czy Rocky, nie mają ulubionego jedzenia ani ulubionej zabawki.
Odpowiedzi na te pytania mogą znajdować się w filmach i nagraniach audio związanych z tymi zwierzętami. Do sprawdzenia użyjesz wbudowanych funkcji AI.
Sprawdź to na podstawie tego stwierdzenia:
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'
Film Rocky'ego będzie widoczny w Twoim zasobniku pamięci masowej.
Aby zaktualizować brakujące opisy, użyj tego stwierdzenia:
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
Użyj poniższego stwierdzenia, aby utworzyć w nowej kolumnie opis zwierząt na podstawie ich multimediów:
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
Po kilku minutach powinny pojawić się opisy kreacji:

10. Tworzenie wektorów dystrybucyjnych
Utwórz tabelę do przechowywania wektorów dystrybucyjnych zdjęć profilowych oraz opisów i zainteresowań, które będą używane w wyszukiwaniu semantycznym. Podobieństwa między zwierzętami znajdziemy za pomocą wyszukiwania wektorowego.
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;
Sprawdź nową tabelę na karcie wyników.

Aby sprawdzić stan wszystkich osadzeń, użyj tego stwierdzenia:
SELECT DISTINCT(ml_generate_embedding_status),
COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;
Jeśli wystąpią błędy, zobaczysz je w niepustym stanie. To są prawidłowe dane wyjściowe – nie ma rekordów z błędami**:**

Poniżej znajdziesz przykład rekordów z błędami. Nie są one oczekiwane, ale przed przejściem do kolejnych kroków należy je naprawić:

Szukaj podobnych zwierząt
Domyślny zbiór danych zawiera podobne zwierzęta. Oto 2 przykłady: Pixel (Id: 3) i SQL (Id: 4):

Aby obliczyć podobieństwo między zwierzętami, możesz użyć odległości między wektorami:
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;
Powinny wyświetlić się wyniki z identyfikatorami zdjęć, które są do siebie podobne. Obejmie to wszystko, co znajduje się na zdjęciu. W tym przykładzie Pixel i SQL są podobne, a kolejnym najbardziej podobnym zwierzakiem jest Joel (Id: 14).

Oto zdjęcie Joela:

Wypróbuj wyszukiwanie semantyczne
Za pomocą funkcji VECTOR_SEARCH możesz przeprowadzać wyszukiwanie semantyczne w osadzonych tekstach. Jeśli ta tabela byłaby większa, musiałbyś utworzyć indeks dla wektorów.
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
Spróbuj zmienić wyszukiwane słowo (Pets who like to relax) oraz parametr fraction_lists_to_search i sprawdź, co się stanie. Więcej informacji o tych funkcjach znajdziesz tutaj.
11. Tworzenie strony profilu z podejściem vibe coding
Użyjesz interfejsu wiersza poleceń Gemini w Cloud Shell, aby szybko uruchomić prostą aplikację internetową w wersji demonstracyjnej. Ta aplikacja internetowa została uproszczona w swoim prompcie, aby pokazać, jak może wyglądać Petverse.
Wróć do Cloud Shell. W przypadku konsoli na pełnym ekranie będzie to wyglądać lepiej:

Uruchom skrypt inicjujący, aby mieć pewność, że zmienne środowiskowe są ustawione, utwórz katalog, w którym będzie przechowywany ten projekt, i wykonaj interfejs wiersza poleceń Gemini:
~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini
Powinien pojawić się interfejs wiersza poleceń Gemini:

Zastąp nazwę zasobnika w prompcie poniżej.
Wklej prompta w wierszu poleceń Gemini.
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.
To Twoja przygoda. Wyświetlimy Ci plan i poprosimy o potwierdzenie.
Jest bardzo mało prawdopodobne, że kod i wdrożenie zadziałają za pierwszym razem. Musisz powtarzać działania w interfejsie wiersza poleceń Gemini, aż uzyskasz prawidłowy wynik.
Jeśli proces utknie w pętli, zatrzymaj go, naciskając CTRL/Command + C, zbadaj problem i ponownie poproś o wykonanie działania.

Zalecamy uważne przeczytanie każdego potwierdzenia, aby dowiedzieć się, co zrobi interfejs CLI:

Po kilku minutach aplikacja powinna być gotowa do uruchomienia. Może się zdarzyć, że konsola się zawiesi:

Możesz ręcznie wypróbować aplikację w nowej karcie Cloud Shell za pomocą gunicorn. Sprawdź, czy projekt jest ustawiony:

Powinna się wyświetlić nowa witryna (może wyglądać inaczej niż na tym obrazie). Jeśli coś nie działa, błędy i logi debugowania powinny być widoczne w wierszu poleceń Cloud Shell uruchomionym lokalnie.

Jeśli wszystko jest w porządku, możesz opcjonalnie wdrożyć aplikację w Cloud Run.
Jeśli Twój projekt należy do organizacji, skonfiguruj IAP zgodnie z tymi instrukcjami. Jeśli Twój projekt nie jest częścią organizacji, możesz zamiast tego wykonać te instrukcje, aby zabezpieczyć dostęp do aplikacji. W przypadku ustawień produkcyjnych zalecamy NIE zezwalać na dostęp bez uwierzytelniania.

Jeśli wdrożenie się powiedzie, aplikacja Cloud Run powinna być widoczna w konsoli Cloud Run.
Upewnij się, że dostęp jest możliwy tylko przez IAP. Kliknij Edytuj zasady, aby dodać użytkownika do powiązania, a następnie kliknij Zapisz.
Poczekaj kilka minut, aż powiązania IAP zostaną rozpowszechnione, a następnie kliknij URL u góry. Witryna powinna się pojawić.

12. Czyszczenie danych
W tym kroku dowiesz się, jak usunąć zasoby utworzone w tym ćwiczeniu.
Usuń usługę Cloud Run (w razie potrzeby dostosuj nazwę usługi i region):
gcloud run services delete petverse-profiles --region us-central1
Usuń wszystkie zasoby BigQuery:
bq rm -f petverse
gcloud bigquery connections delete pet-connection --location=us-central1
