1. บทนำ
ยินดีต้อนรับสู่ Petverse ยินดีต้อนรับสัตว์เลี้ยงทุกตัว 🐈🐶🐍🐟🦄
ข้อกำหนดเบื้องต้น
- ความเข้าใจพื้นฐานเกี่ยวกับคอนโซล Google Cloud
- ความเข้าใจพื้นฐานเกี่ยวกับคำสั่ง SQL
สิ่งที่คุณจะได้เรียนรู้
- สร้างชุดข้อมูลและตารางใน BigQuery
- สร้างคอลัมน์ ObjectRef เพื่ออ้างอิงมัลติมีเดียในที่เก็บข้อมูลใน BigQuery
- ใช้ฟังก์ชัน AI ใน BigQuery เพื่อปรับปรุงชุดข้อมูลจากเนื้อหาของข้อมูลที่ไม่มีโครงสร้าง
- สร้างการฝังมัลติมีเดียเพื่อค้นหาสื่อที่คล้ายกัน
- สร้างการฝังข้อความเพื่อทำการค้นหาเชิงความหมายด้วย VECTOR_SEARCH
- ใช้ Gemini CLI เพื่อสร้างเว็บแอปพลิเคชัน
สิ่งที่คุณต้องมี
- บัญชี Google Cloud และโปรเจ็กต์ Google Cloud ที่มีบัญชีสำหรับการเรียกเก็บเงิน
- เว็บเบราว์เซอร์ เช่น Chrome
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
3. เปิด Cloud Shell
ไปที่ https://shell.cloud.google.com/?show=ide%2Cterminal เมื่อมีข้อความแจ้ง ให้คลิกให้สิทธิ์

ตรวจสอบว่าทั้งเอดิเตอร์และคอนโซลปรากฏอยู่

4. สร้างสคริปต์ตัวช่วย
คุณจะต้องสร้างสคริปต์ตัวช่วยที่จะตั้งค่าตัวแปรสภาพแวดล้อมที่เกี่ยวข้องเพื่อให้ประสบการณ์การใช้งานนี้ราบรื่นยิ่งขึ้น
แทนที่ <<Project ID>> ด้วยรหัสโปรเจ็กต์ของคุณด้านล่าง
คัดลอกคำสั่งต่อไปนี้ลงในเทอร์มินัล Cloud Shell แล้วกด Enter เพื่อเรียกใช้**
gcloud config set project <<PROJECT_ID>>
คัดลอกคำสั่งต่อไปนี้ลงในเทอร์มินัล Cloud Shell แล้วกด Enter เพื่อเรียกใช้** ซึ่งจะเปิดใช้บริการที่จำเป็น สร้างไฟล์ และแก้ไขไฟล์ใน 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
คุณควรเห็นแท็บใหม่ที่มีชื่อไฟล์ วางสคริปต์ต่อไปนี้ลงในไฟล์ใหม่
#!/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."
แทนที่ตัวยึดตำแหน่งสำหรับ PROJECT_ID ด้วยชื่อโปรเจ็กต์ของคุณ

คัดลอกคำสั่งต่อไปนี้และเรียกใช้ในเทอร์มินัล
chmod +x petverse-setup.sh
~/petverse-setup.sh
ผลลัพธ์ที่คาดไว้

5. สร้างที่เก็บข้อมูล
สร้าง Bucket ของ Cloud Storage แล้วคัดลอกสื่อที่มีไปยัง Bucket ของคุณเอง คุณจะใช้โฟลเดอร์นี้เพื่อจัดเก็บสื่อที่พร้อมใช้งานสำหรับสัตว์เลี้ยงแสนน่ารัก นอกจากนี้ คุณยังสร้างการเชื่อมต่อเพื่อเข้าถึงที่เก็บข้อมูลผ่าน BigQuery ได้ด้วย
วางและเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
~/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. สร้างตารางสัตว์เลี้ยง
ตอนนี้คุณจะสร้างตารางใน BigQuery เพื่อจัดเก็บข้อมูลเกี่ยวกับสัตว์เลี้ยง
เปิดแท็บใหม่ในเบราว์เซอร์ ไปที่ https://console.cloud.google.com/bigquery
ตรวจสอบว่าได้เลือกโปรเจ็กต์เดียวกันกับที่ใช้ในคอนโซล

ตอนนี้คุณสร้างตารางโดยใช้ข้อมูลในไฟล์ pets.csv ได้แล้ว ไฟล์นี้มีชื่อ อาหารโปรด ของเล่น และข้อมูลอื่นๆ ที่น่าสนใจเกี่ยวกับสัตว์เลี้ยงของเรา
คัดลอกโค้ดต่อไปนี้ลงในการค้นหาด้วย SQL ใหม่เพื่อสร้างตารางจริงและโหลดข้อมูล
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'
);
แทนที่ตัวยึดตำแหน่งสำหรับ Bucket ในโค้ดด้วย Bucket ที่คุณสร้างไว้ในขั้นตอนก่อนหน้า
คุณตรวจสอบที่เก็บข้อมูลทั้งหมดได้ในแท็บเบราว์เซอร์แยกต่างหากซึ่งชี้ไปยัง URL นี้ https://console.cloud.google.com/storage/browser

ใช้ปุ่มเรียกใช้เพื่อดำเนินการค้นหา
เมื่อโหลดข้อมูลสำเร็จแล้ว ให้คลิกไปที่ตาราง

คลิกแสดงตัวอย่างเพื่อดูเนื้อหาของตาราง 
7. เชื่อมต่อ BigQuery กับ Bucket
หากดูในที่เก็บข้อมูลที่คุณสร้างไว้ก่อนหน้านี้ คุณจะเห็นชุดไฟล์สื่อที่เกี่ยวข้องกับสัตว์เลี้ยงแต่ละตัว

BigQuery มีความสามารถในการอ่านข้อมูลลงใน Bucket เหล่านี้และใช้ไฟล์ควบคู่ไปกับข้อมูลในตาราง ประเภทค่านี้เรียกว่า ObjectRef
รับรหัสบัญชีบริการสำหรับการเชื่อมต่อที่คุณสร้างไว้ก่อนหน้านี้โดยคลิกที่รหัสในส่วนการเชื่อมต่อภายนอก

คัดลอกรหัสบัญชีบริการ
ไปที่คอนโซลผู้ดูแลระบบ IAM ในแท็บเบราว์เซอร์ใหม่ ( https://console.cloud.google.com/iam-admin/ )
ให้สิทธิ์บัญชีบริการด้วยผู้ดูออบเจ็กต์ Storage และผู้ใช้ Vertex AI (คุณจะใช้สิทธิ์นี้ในภายหลัง)

คลิกบันทึกและ🕰️รอสัก 2-3 นาที
กลับไปที่แท็บ BigQuery ใช้การค้นหาต่อไปนี้ใน BigQuery Studio เพื่อทดสอบการเชื่อมต่อระหว่าง BigQuery กับที่เก็บข้อมูล
แทนที่ <<PROJECT_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'))
คลิกดูผลลัพธ์ คุณควรได้รับข้อมูลเมตาในผลลัพธ์

8. เพิ่มสื่อจัดเก็บข้อมูลลงใน Structured Data
คุณสามารถปรับปรุงตารางสัตว์เลี้ยงเพื่อเพิ่มคอลัมน์ที่มีรูปโปรไฟล์ของสัตว์เลี้ยงแต่ละตัวได้หากมี นอกจากนี้ คุณยังเพิ่มคอลัมน์อื่นที่มีอาร์เรย์ของการอ้างอิงสื่อเพื่อเก็บไฟล์อื่นๆ ทั้งหมดที่เกี่ยวข้องกับสัตว์เลี้ยงแต่ละตัวได้ด้วย
การเข้าถึงมัลติมีเดียต้องมีการเชื่อมต่อ ซึ่งคุณสร้างไว้ในช่วงต้นของ Codelab นี้หลังจากสร้างที่เก็บข้อมูล
วางคำสั่งต่อไปนี้ลงในคอนโซล SQL ของ BigQuery แล้วเรียกใช้เพื่อเพิ่ม 2 คอลัมน์ลงในตาราง pets
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>>;
คัดลอกคำสั่งต่อไปนี้และแทนที่ตัวยึดตำแหน่งสำหรับ PROJECT_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;
เรียกใช้ใบแจ้งยอด คุณควรเห็นการดำเนินการที่สำเร็จหลังจากผ่านไปไม่กี่นาที

ตรวจสอบผลลัพธ์โดยใช้ตัวอย่างตาราง คุณควรเห็นข้อมูลเมตาสำหรับรูปโปรไฟล์ที่มีอยู่และสื่อเพิ่มเติมสำหรับแมวชื่อพิกเซล
SELECT *
FROM `petverse.pets`
WHERE name = 'Pixel'

9. สร้างคำอธิบายสัตว์เลี้ยง
หากดูตัวอย่างตารางสัตว์เลี้ยง คุณจะเห็นว่าสัตว์เลี้ยงบางตัว เช่น Yoda, Pixel หรือ Rocky ไม่มีอาหารหรือของเล่นที่ชอบ
คำตอบของคำถามเหล่านี้อาจอยู่ในวิดีโอและเสียงที่เกี่ยวข้องกับสัตว์เลี้ยงเหล่านี้ คุณจะใช้ฟังก์ชัน AI แบบฝังเพื่อตรวจสอบ
ทดสอบด้วยข้อความต่อไปนี้
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'
คุณดูวิดีโอของ Rocky ได้ในที่เก็บข้อมูล
ใช้คำสั่งต่อไปนี้เพื่ออัปเดตคำอธิบายที่ขาดหายไป
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
ใช้คำสั่งต่อไปนี้เพื่อสร้างคำอธิบายของสัตว์เลี้ยงตามมัลติมีเดียของสัตว์เลี้ยงลงในคอลัมน์ใหม่
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
คุณควรเห็นคำอธิบายครีเอทีฟโฆษณาหลังจากผ่านไป 2-3 นาที

10. สร้างการฝัง
สร้างตารางเพื่อจัดเก็บการฝังสำหรับรูปโปรไฟล์ รวมถึงคำอธิบายและงานอดิเรกเพื่อใช้ในการค้นหาเชิงความหมาย เราจะค้นหาความคล้ายคลึงภายในสัตว์เลี้ยงโดยใช้การค้นหาเวกเตอร์
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;
ดูตารางใหม่ได้จากแท็บผลลัพธ์

ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบสถานะของ Embedding ทั้งหมด
SELECT DISTINCT(ml_generate_embedding_status),
COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;
หากมีข้อผิดพลาด คุณจะเห็นข้อผิดพลาดเหล่านั้นในสถานะที่ไม่ว่าง นี่คือเอาต์พุตที่ถูกต้อง - ไม่มีระเบียนที่มีข้อผิดพลาด**:**

ตัวอย่างของระเบียนที่มีข้อผิดพลาดมีดังนี้ ข้อผิดพลาดเหล่านี้ไม่ควรเกิดขึ้น แต่ต้องได้รับการแก้ไขก่อนดำเนินการตามขั้นตอนถัดไป

มองหาสัตว์เลี้ยงที่คล้ายกัน
ชุดข้อมูลเริ่มต้นมีสัตว์เลี้ยงที่คล้ายกัน ตัวอย่าง 2 รายการต่อไปนี้คือ Pixel (รหัส: 3) และ SQL (รหัส: 4)

คุณใช้ระยะห่างระหว่างการฝังเพื่อคำนวณสัตว์เลี้ยงที่คล้ายกันได้โดยทำดังนี้
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;
คุณควรได้รับผลการค้นหาที่มีรหัสของรูปภาพที่คล้ายกัน ซึ่งจะรวมทุกอย่างในรูปภาพ ในตัวอย่างนี้ Pixel และ SQL มีความคล้ายกัน และสัตว์เลี้ยงที่คล้ายกันมากที่สุดถัดไปคือ Joel (รหัส: 14)

นี่คือรูปภาพของ Joel สำหรับใช้อ้างอิง

ลองใช้การค้นหาเชิงความหมาย
คุณสามารถใช้ฟังก์ชัน VECTOR_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
ลองเปลี่ยนข้อความค้นหาเชิงความหมาย (Pets who like to relax) รวมถึงพารามิเตอร์ fraction_lists_to_search แล้วดูผลลัพธ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันเหล่านี้ได้ที่นี่
11. Vibe Code หน้าโปรไฟล์
คุณจะใช้ Gemini CLI ใน Cloud Shell เพื่อเริ่มต้นใช้งานเว็บแอปพลิเคชันสาธิตแบบง่าย เราได้ลดความซับซ้อนของเว็บแอปพลิเคชันนี้ในพรอมต์เพื่อแสดงให้เห็นว่า Petverse จะเกิดขึ้นได้อย่างไร
กลับไปที่ Cloud Shell คุณจะได้รับประสบการณ์การใช้งานที่ดียิ่งขึ้นเมื่อใช้เพียงคอนโซลในโหมดเต็มหน้าจอ

เรียกใช้สคริปต์การเริ่มต้นเพื่อให้แน่ใจว่าได้ตั้งค่าตัวแปรสภาพแวดล้อมแล้ว สร้างไดเรกทอรีเพื่อเก็บโปรเจ็กต์นี้ และเรียกใช้ Gemini CLI
~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini
คุณควรเห็น CLI ของ Gemini ดังนี้

แทนที่ชื่อของ Bucket ในพรอมต์ด้านล่าง
วางพรอมต์ลงในบรรทัดคำสั่งของ 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.
ตอนนี้เป็นการผจญภัยของคุณแล้ว ระบบจะแสดงแผนให้คุณเห็นและขอให้คุณยืนยันระหว่างดำเนินการ
โค้ดและการติดตั้งใช้งานที่สร้างขึ้นไม่น่าจะทำงานได้ตั้งแต่ครั้งแรก คุณจะต้องทำซ้ำด้วย Gemini CLI จนกว่าจะถูกต้อง
หากเห็นว่ากระบวนการติดอยู่ในลูป ให้หยุดด้วย CTRL/Command + C ตรวจสอบปัญหา แล้วแจ้งอีกครั้ง

เราขอแนะนำให้อ่านการยืนยันแต่ละรายการอย่างละเอียดทีละรายการเพื่อทำความเข้าใจว่า CLI จะทำอะไร

หลังจากผ่านไปสักครู่ แอปพลิเคชันควรพร้อมที่จะดำเนินการ ในบางครั้งคอนโซลอาจดูเหมือนค้างอยู่

คุณลองใช้แอปพลิเคชันด้วยตนเองในแท็บ Cloud Shell ใหม่ด้วย Gunicorn ได้ ตรวจสอบว่าได้ตั้งค่าโปรเจ็กต์ดังนี้

คุณควรเห็นเว็บไซต์ใหม่ (ซึ่งอาจมีลักษณะแตกต่างจากที่แสดง) หากมีสิ่งใดไม่ทำงาน คุณควรจะเห็นข้อผิดพลาดและบันทึกการแก้ไขข้อบกพร่องในบรรทัดคำสั่งของ Cloud Shell ที่ดำเนินการในเครื่อง

หากทุกอย่างดูดีแล้ว คุณจะเลือกทำให้ใช้งานได้แอปพลิเคชันใน Cloud Run หรือไม่ก็ได้
หากโปรเจ็กต์อยู่ในองค์กร ให้ตรวจสอบว่าได้กำหนดค่า IAP ตามวิธีการเหล่านี้ หากโปรเจ็กต์ไม่ได้เป็นส่วนหนึ่งขององค์กร คุณสามารถทำตามวิธีการเหล่านี้แทนเพื่อรักษาความปลอดภัยในการเข้าถึงแอปพลิเคชัน โดยเฉพาะอย่างยิ่งสำหรับการตั้งค่าเวอร์ชันที่ใช้งานจริง เราขอแนะนำว่าอย่าอนุญาตการเข้าถึงที่ไม่ผ่านการตรวจสอบสิทธิ์

หากการติดตั้งใช้งานทำงานได้ คุณควรเห็นแอปพลิเคชัน Cloud Run ทำงานในคอนโซล Cloud Run
ตรวจสอบว่าสิทธิ์เข้าถึงเป็น IAP เท่านั้น ใช้แก้ไขนโยบายเพื่อเพิ่มผู้ใช้ลงในการเชื่อมโยง แล้วบันทึก
รอสักครู่เพื่อให้การเชื่อมโยง IAP มีผล แล้วคลิก URL ที่ด้านบน เว็บไซต์ควรปรากฏขึ้น

12. ล้างข้อมูล
ขั้นตอนนี้จะแนะนำวิธีการลบทรัพยากรที่สร้างขึ้นใน Codelab นี้
ลบบริการ Cloud Run (ปรับชื่อบริการและภูมิภาคตามต้องการ)
gcloud run services delete petverse-profiles --region us-central1
ลบชิ้นงาน BigQuery ทั้งหมด
bq rm -f petverse
gcloud bigquery connections delete pet-connection --location=us-central1
