1. Pengantar
Selamat datang di Petverse! Semua hewan peliharaan boleh dibawa. 🐈🐶🐍🐟🦄
Prasyarat
- Pemahaman dasar tentang Konsol Google Cloud
- Pemahaman dasar tentang pernyataan SQL
Yang akan Anda pelajari
- Membuat set data dan tabel di BigQuery
- Membuat kolom ObjectRef untuk mereferensikan multimedia dalam bucket penyimpanan di BigQuery
- Gunakan fungsi AI di BigQuery untuk meningkatkan kualitas set data Anda dari konten data tidak terstruktur
- Membuat embedding multimedia untuk menelusuri media serupa
- Membuat embedding teks untuk melakukan penelusuran semantik dengan VECTOR_SEARCH
- Menggunakan Gemini CLI untuk membuat aplikasi web
Yang Anda butuhkan
- Akun Google Cloud dan Project Google Cloud dengan Akun penagihan
- Browser web seperti Chrome
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.



- Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
- Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai
PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
3. Buka Cloud Shell
Buka https://shell.cloud.google.com/?show=ide%2Cterminal . Saat diminta, klik Authorize.

Pastikan editor dan konsol terlihat:

4. Membuat skrip helper
Untuk membuat pengalaman ini lebih lancar, Anda akan membuat skrip helper yang menetapkan variabel lingkungan yang relevan.
Ganti <<Project ID>> dengan project ID Anda di bawah.
Salin perintah berikut ke terminal Cloud Shell dan tekan Enter untuk menjalankan**.**
gcloud config set project <<PROJECT_ID>>
Salin perintah berikut ke terminal Cloud Shell dan tekan Enter untuk menjalankan**.** Perintah ini akan mengaktifkan layanan yang diperlukan, serta membuat dan mengedit file di 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
Anda akan melihat tab baru dengan nama file. Tempel skrip berikut ke dalam file baru:
#!/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."
Ganti placeholder untuk PROJECT_ID dengan nama project Anda:

Salin perintah berikut dan jalankan di terminal:
chmod +x petverse-setup.sh
~/petverse-setup.sh
Output yang diharapkan:

5. Membuat bucket penyimpanan
Buat Bucket Cloud Storage dan salin media yang tersedia ke bucket Anda sendiri. Anda akan menggunakannya untuk menyimpan media yang tersedia untuk hewan peliharaan kesayangan kita. Anda juga akan membuat koneksi untuk mengakses bucket melalui BigQuery.
Tempel dan jalankan perintah berikut di terminal:
~/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. Membuat tabel pets
Sekarang Anda akan membuat tabel di BigQuery untuk menyimpan informasi tentang hewan peliharaan Anda.
Buka tab baru di browser. Buka https://console.cloud.google.com/bigquery .
Pastikan project yang sama dengan yang telah Anda gunakan dipilih di konsol:

Sekarang Anda dapat membuat tabel menggunakan data dalam file pets.csv. File ini berisi nama, makanan favorit, mainan, dan informasi menarik lainnya tentang hewan peliharaan kami.
Salin kode berikut ke dalam kueri SQL baru untuk membuat tabel fisik dan memuat data.
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'
);
Ganti placeholder untuk bucket dalam kode dengan bucket yang Anda buat di langkah sebelumnya.
Anda dapat memeriksa semua bucket penyimpanan di tab browser terpisah yang mengarah ke URL ini: https://console.cloud.google.com/storage/browser .

Gunakan tombol Run untuk menjalankan kueri.
Setelah data berhasil dimuat, klik Buka tabel.

Klik Preview untuk melihat konten tabel. 
7. Hubungkan BigQuery ke Bucket Penyimpanan
Jika Anda melihat di bucket yang Anda buat sebelumnya, Anda akan menemukan sekumpulan file media yang terkait dengan setiap hewan peliharaan.

BigQuery memiliki kemampuan untuk membaca bucket ini dan menggunakan file bersama data dalam tabel. Jenis nilai ini disebut ObjectRef.
Dapatkan ID akun layanan untuk koneksi yang Anda buat sebelumnya dengan mengkliknya di bagian External connections.

Salin ID akun layanan.
Buka konsol Admin IAM di tab browser baru ( https://console.cloud.google.com/iam-admin/ ).
Beri akun layanan Storage Object Viewer dan Vertex AI User (Anda akan menggunakan izin ini nanti).

Klik Simpan dan 🕰️ tunggu beberapa menit.
Kembali ke tab BigQuery, gunakan kueri berikut di BigQuery Studio untuk menguji koneksi antara BigQuery dan bucket penyimpanan.
Ganti <<PROJECT_ID>> dengan project ID Anda.
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'))
Klik Lihat Hasil. Anda akan mendapatkan metadata dalam hasil:

8. Menambahkan media penyimpanan ke data terstruktur Anda
Anda dapat meningkatkan kualitas tabel pets untuk menambahkan kolom dengan foto profil setiap hewan peliharaan jika tersedia. Anda juga akan menambahkan kolom lain dengan array referensi media, untuk menyimpan semua file lain yang terkait dengan setiap hewan peliharaan.
Akses ke multimedia memerlukan koneksi, yang Anda buat di awal codelab ini setelah membuat bucket.
Tempel perintah berikut ke konsol SQL BigQuery dan jalankan untuk menambahkan dua kolom ke tabel pets Anda.
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>>;
Salin pernyataan berikut dan ganti penampung untuk PROJECT_ID dengan project ID Anda.
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;
Jalankan pernyataan. Anda akan melihat eksekusi yang berhasil setelah beberapa menit:

Periksa hasil menggunakan pratinjau tabel. Anda akan melihat metadata untuk foto profil yang ada dan media tambahan untuk kucing bernama Pixel.
SELECT *
FROM `petverse.pets`
WHERE name = 'Pixel'

9. Membuat deskripsi hewan peliharaan
Jika melihat pratinjau tabel pets, Anda akan melihat bahwa beberapa hewan peliharaan, seperti Yoda, Pixel, atau Rocky, tidak memiliki makanan atau mainan favoritnya.
Jawaban atas pertanyaan ini mungkin ada dalam video dan audio yang terkait dengan hewan peliharaan tersebut. Anda akan menggunakan fungsi AI tersemat untuk memeriksa.
Uji ini dengan pernyataan berikut:
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'
Anda dapat melihat video Rocky di bucket penyimpanan Anda.
Gunakan pernyataan berikut untuk memperbarui deskripsi yang tidak ada:
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
Gunakan pernyataan berikut untuk membuat deskripsi hewan peliharaan berdasarkan multimedia mereka ke dalam kolom baru:
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
Anda akan melihat beberapa deskripsi materi iklan setelah beberapa menit:

10. Membuat embedding
Buat tabel untuk menyimpan embedding gambar profil serta deskripsi dan hobi yang akan digunakan dalam penelusuran semantik. Kita akan menemukan kemiripan dalam hewan peliharaan menggunakan penelusuran vektor.
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;
Periksa tabel baru dari tab hasil.

Gunakan pernyataan berikut untuk memeriksa status semua penyematan:
SELECT DISTINCT(ml_generate_embedding_status),
COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;
Jika ada error, Anda akan melihatnya dalam status yang tidak kosong. Ini adalah output yang benar - tidak ada data yang salah**:**

Berikut adalah contoh data yang berisi error. Masalah ini tidak diharapkan, tetapi harus diperbaiki sebelum melanjutkan ke langkah berikutnya:

Mencari hewan peliharaan serupa
Set data default memiliki hewan peliharaan serupa di dalamnya. Berikut dua contoh Pixel (ID: 3) dan SQL (ID: 4):

Anda dapat menggunakan jarak antara embedding untuk menghitung hewan peliharaan yang serupa:
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;
Anda akan mendapatkan hasil dengan ID gambar yang mirip satu sama lain. Tindakan ini akan menyertakan semua yang ada dalam gambar. Dalam contoh ini, Pixel dan SQL serupa, dan hewan peliharaan berikutnya yang paling serupa adalah Joel (ID: 14).

Berikut gambar Joel sebagai referensi:

Coba penelusuran semantik
Anda dapat menggunakan fungsi VECTOR_SEARCH untuk menelusuri embedding teks secara semantik. Jika tabel ini lebih besar, Anda harus membuat dan mengindeks sematan.
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
Coba ubah istilah penelusuran semantik (Pets who like to relax) serta parameter fraction_lists_to_search dan lihat apa yang terjadi. Anda dapat mempelajari lebih lanjut fungsi ini di sini.
11. Membuat halaman profil dengan vibe coding
Anda akan menggunakan Gemini CLI di Cloud Shell untuk memulai aplikasi web demo yang sederhana. Aplikasi web ini telah disederhanakan dalam perintahnya untuk menunjukkan bagaimana Petverse dapat diwujudkan.
Kembali ke Cloud Shell. Anda akan mendapatkan pengalaman yang lebih baik hanya dengan konsol dalam layar penuh:

Jalankan skrip inisialisasi untuk memastikan variabel lingkungan ditetapkan, buat direktori yang berisi project ini, dan jalankan Gemini CLI:
~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini
Anda akan melihat CLI Gemini:

Ganti nama bucket dalam perintah di bawah.
Tempelkan perintah ke command line 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.
Sekarang adalah petualangan Anda. Anda akan melihat rencana dan diminta untuk memberikan konfirmasi di sepanjang prosesnya.
Sangat tidak mungkin kode dan deployment yang dihasilkan berfungsi pada percobaan pertama. Anda harus melakukan iterasi dengan Gemini CLI hingga hasilnya benar.
Jika Anda melihat proses macet dalam loop, hentikan dengan CTRL/Command + C, selidiki masalahnya, lalu minta lagi.

Sebaiknya baca setiap konfirmasi dengan cermat, satu per satu, untuk memahami tindakan yang akan dilakukan CLI:

Setelah beberapa menit, aplikasi akan siap dijalankan. Mungkin terlihat seolah-olah konsol macet:

Anda dapat mencoba aplikasi secara manual di tab Cloud Shell baru dengan gunicorn. Pastikan project telah ditetapkan:

Anda akan melihat situs baru Anda (mungkin terlihat berbeda dari ini). Jika ada yang tidak berfungsi, Anda akan dapat melihat log error dan proses debug di command line Cloud Shell yang dijalankan secara lokal.

Jika semuanya sudah oke, Anda dapat men-deploy aplikasi ke Cloud Run.
Jika project Anda termasuk dalam organisasi, pastikan Anda mengonfigurasi IAP dengan mengikuti petunjuk ini. Jika project Anda bukan bagian dari organisasi, Anda dapat mengikuti petunjuk ini untuk mengamankan akses ke aplikasi Anda. Khusus untuk setelan produksi, sebaiknya JANGAN izinkan akses yang tidak diautentikasi.

Dengan asumsi deployment berfungsi, Anda akan melihat aplikasi Cloud Run berjalan di konsol Cloud Run.
Pastikan aksesnya hanya IAP. Gunakan Edit Kebijakan untuk menambahkan pengguna Anda ke binding dan Simpan.
Tunggu beberapa menit hingga binding IAP diterapkan dan klik URL di bagian atas. Situs akan muncul.

12. Pembersihan
Langkah ini akan memandu Anda menghapus resource yang dibuat di codelab ini.
Hapus layanan Cloud Run (sesuaikan nama layanan dan region sesuai kebutuhan):
gcloud run services delete petverse-profiles --region us-central1
Hapus semua aset BigQuery:
bq rm -f petverse
gcloud bigquery connections delete pet-connection --location=us-central1
