1. परिचय
Petverse में आपका स्वागत है! सभी पालतू जानवरों का स्वागत है! 🐈🐶🐍🐟🦄
ज़रूरी शर्तें
- Google Cloud Console की बुनियादी जानकारी
- एसक्यूएल स्टेटमेंट की बुनियादी जानकारी
आपको क्या सीखने को मिलेगा
- BigQuery में डेटासेट और टेबल बनाना
- BigQuery में स्टोरेज बकेट में मौजूद मल्टीमीडिया का रेफ़रंस देने के लिए, ObjectRef कॉलम बनाना
- अनस्ट्रक्चर्ड डेटा के कॉन्टेंट से अपने डेटासेट को बेहतर बनाने के लिए, BigQuery में एआई फ़ंक्शन का इस्तेमाल करना
- मिलते-जुलते मीडिया को खोजने के लिए, मल्टीमीडिया एम्बेडिंग बनाना
- VECTOR_SEARCH की मदद से सिमैंटिक सर्च करने के लिए, टेक्स्ट एम्बेडिंग बनाना
- वेब ऐप्लिकेशन बनाने के लिए, Gemini CLI का इस्तेमाल करना
आपको इन चीज़ों की ज़रूरत होगी
- बिलिंग खाते वाला Google Cloud खाता और Google Cloud प्रोजेक्ट
- कोई वेब ब्राउज़र, जैसे कि Chrome
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेट अप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.



- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, यूनीक स्ट्रिंग को अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी (आम तौर पर
PROJECT_IDके तौर पर पहचाना जाता है) का रेफ़रंस देना होगा. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक बना रहता है. - आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
- इसके बाद, आपको Cloud Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा समय नहीं लगेगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, 300 डॉलर का क्रेडिट मिलेगा. वे इसे मुफ़्त में आज़मा सकते हैं.
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. स्टोरेज बकेट बनाना
Cloud Storage बकेट बनाएं और उपलब्ध मीडिया को अपनी बकेट में कॉपी करें. इसका इस्तेमाल, हमारे प्यारे पालतू जानवरों के लिए उपलब्ध मीडिया को सेव करने के लिए किया जाएगा. 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'
);
कोड में, बकेट के प्लेसहोल्डर को उस बकेट से बदलें जिसे आपने पिछले चरण में बनाया था.
अपने सभी स्टोरेज बकेट को इस यूआरएल पर जाकर, अलग ब्राउज़र टैब में देखा जा सकता है: https://console.cloud.google.com/storage/browser .

क्वेरी को लागू करने के लिए, चलाएं बटन का इस्तेमाल करें.
डेटा लोड हो जाने के बाद, टेबल पर जाएं पर क्लिक करें.

टेबल का कॉन्टेंट देखने के लिए, झलक देखें पर क्लिक करें. 
7. BigQuery को स्टोरेज बकेट से कनेक्ट करना
अगर आपने पहले कोई बकेट बनाई थी, तो आपको उसमें हर पेट से जुड़ी मीडिया फ़ाइलों का सेट मिलेगा.

BigQuery में इन बकेट को पढ़ने और टेबल में मौजूद डेटा के साथ फ़ाइलों का इस्तेमाल करने की सुविधा है. इस वैल्यू टाइप को ObjectRef कहा जाता है.
बाहरी कनेक्शन में जाकर, उस कनेक्शन पर क्लिक करें जिसे आपने पहले बनाया था. इससे आपको सेवा खाते का आईडी मिलेगा.

सेवा खाते का आईडी कॉपी करें.
नए ब्राउज़र टैब में IAM एडमिन कंसोल ( https://console.cloud.google.com/iam-admin/ ) पर जाएं.
सेवा खाते को स्टोरेज ऑब्जेक्ट व्यूअर और Vertex AI उपयोगकर्ता की भूमिका असाइन करें. इस अनुमति का इस्तेमाल बाद में किया जाएगा.

सेव करें और 🕰️ कुछ मिनट इंतज़ार करें पर क्लिक करें.
BigQuery टैब में वापस जाकर, BigQuery और स्टोरेज बकेट के बीच कनेक्शन की जांच करने के लिए, BigQuery Studio में इस क्वेरी का इस्तेमाल करें.
<<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. अपने स्ट्रक्चर्ड डेटा में स्टोरेज मीडिया जोड़ना
पालतू जानवर टेबल को बेहतर बनाया जा सकता है. इसके लिए, हर पालतू जानवर की प्रोफ़ाइल फ़ोटो वाला कॉलम जोड़ा जा सकता है. हालांकि, यह कॉलम सिर्फ़ उन पालतू जानवरों के लिए जोड़ा जा सकता है जिनकी प्रोफ़ाइल फ़ोटो उपलब्ध है. आपको एक और कॉलम जोड़ना होगा. इसमें मीडिया रेफ़रंस की एक ऐरे होगी, ताकि हर पालतू जानवर से जुड़ी अन्य सभी फ़ाइलों को सेव किया जा सके.
मल्टीमीडिया को ऐक्सेस करने के लिए, कनेक्शन की ज़रूरत होती है. आपने बकेट बनाने के बाद, इस कोडलैब की शुरुआत में यह कनेक्शन बनाया था.
यहां दिए गए निर्देशों को BigQuery एसक्यूएल कंसोल में चिपकाएं और उन्हें एक्ज़ीक्यूट करें, ताकि आपकी 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 - के लिए उनके पसंदीदा खाने या खिलौने की जानकारी मौजूद नहीं है.
इन सवालों के जवाब, इन पालतू जानवरों से जुड़े वीडियो और ऑडियो में मिल सकते हैं. जांच करने के लिए, एम्बेड किए गए एआई फ़ंक्शन का इस्तेमाल किया जाएगा.
इसकी जांच करने के लिए, इस स्टेटमेंट का इस्तेमाल करें:
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'
आपको रॉकी का वीडियो, अपने स्टोरेज बकेट में दिखेगा.
ब्यौरे की जानकारी अपडेट करने के लिए, इस स्टेटमेंट का इस्तेमाल करें:
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
कुछ मिनटों के बाद, आपको क्रिएटिव के कुछ ब्यौरे दिखने चाहिए:

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;
नतीजे वाले टैब में जाकर, नई टेबल देखें.

सभी एम्बेडिंग का स्टेटस देखने के लिए, इस स्टेटमेंट का इस्तेमाल करें:
SELECT DISTINCT(ml_generate_embedding_status),
COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;
अगर कोई गड़बड़ी है, तो आपको स्टेटस कॉलम में गड़बड़ी दिखेगी. यह सही आउटपुट है - इसमें कोई गड़बड़ी नहीं है**:**

यहां गड़बड़ियों वाले रिकॉर्ड का एक उदाहरण दिया गया है. इन समस्याओं का सामना नहीं करना चाहिए. हालांकि, अगले चरणों को जारी रखने से पहले इन्हें ठीक करना ज़रूरी है:

मिलते-जुलते पालतू जानवर ढूंढें
डिफ़ॉल्ट डेटासेट में मिलते-जुलते पालतू जानवर हैं. यहां 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 है (Id: 14).

रेफ़रंस के लिए, यहां जोएल की एक तस्वीर दी गई है:

सिमैंटिक सर्च की सुविधा आज़माएं
टेक्स्ट एम्बेडिंग में सिमैंटिक तौर पर खोजने के लिए, 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. किसी प्रोफ़ाइल पेज के लिए वाइब कोड जनरेट करना
Cloud Shell में Gemini CLI का इस्तेमाल करके, एक सामान्य डेमो वेब ऐप्लिकेशन बनाया जाएगा. इस वेब ऐप्लिकेशन के प्रॉम्प्ट को आसान बनाया गया है, ताकि यह दिखाया जा सके कि Petverse को कैसे लागू किया जा सकता है.
Cloud Shell पर वापस जाएं. कंसोल को फ़ुल स्क्रीन में देखने पर आपको बेहतर अनुभव मिलेगा:

यह पक्का करने के लिए कि एनवायरमेंट वैरिएबल सेट हैं, इनिशियलाइज़ेशन स्क्रिप्ट चलाएं. साथ ही, इस प्रोजेक्ट को शामिल करने के लिए एक डायरेक्ट्री बनाएं और Gemini CLI को एक्ज़ीक्यूट करें:
~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini
आपको Gemini का सीएलआई दिखेगा:

नीचे दिए गए प्रॉम्प्ट में बकेट का नाम बदलें.
प्रॉम्प्ट को 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 दबाकर इसे रोकें. इसके बाद, समस्या की जांच करें और फिर से प्रॉम्प्ट दें.

हमारा सुझाव है कि आप एक-एक करके, पुष्टि करने वाले हर मैसेज को ध्यान से पढ़ें. इससे आपको यह समझने में मदद मिलेगी कि सीएलआई क्या करेगा:

कुछ मिनटों के बाद, ऐप्लिकेशन को लागू किया जा सकेगा. ऐसा हो सकता है कि कंसोल काम न कर रहा हो:

gunicorn की मदद से, Cloud Shell के नए टैब में ऐप्लिकेशन को मैन्युअल तरीके से आज़माया जा सकता है. पक्का करें कि प्रोजेक्ट सेट हो:

आपको अपनी नई साइट दिखेगी. हालांकि, यह इससे अलग दिख सकती है. अगर कोई सुविधा काम नहीं कर रही है, तो आपको Cloud Shell की कमांड लाइन में गड़बड़ी और डीबग करने से जुड़े लॉग दिखेंगे. ये लॉग, स्थानीय तौर पर एक्ज़ीक्यूट होते हैं.

अगर सब कुछ ठीक लगता है, तो ऐप्लिकेशन को Cloud Run में डिप्लॉय किया जा सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है.
अगर आपका प्रोजेक्ट किसी संगठन से जुड़ा है, तो पक्का करें कि आपने इन निर्देशों का पालन करके, IAP को कॉन्फ़िगर किया हो. अगर आपका प्रोजेक्ट किसी संगठन का हिस्सा नहीं है, तो अपने ऐप्लिकेशन का ऐक्सेस सुरक्षित करने के लिए, इन निर्देशों का पालन करें. खास तौर पर, प्रोडक्शन सेटिंग के लिए हमारा सुझाव है कि बिना पुष्टि किए ऐक्सेस करने की अनुमति न दें.

अगर डिप्लॉयमेंट सही तरीके से काम करता है, तो आपको Cloud Run कंसोल में Cloud Run ऐप्लिकेशन चलता हुआ दिखेगा.
पक्का करें कि ऐक्सेस सिर्फ़ IAP के लिए हो. उपयोगकर्ता को बाइंडिंग में जोड़ने के लिए, नीति में बदलाव करें का इस्तेमाल करें. इसके बाद, सेव करें पर क्लिक करें.
कुछ मिनट इंतज़ार करें, ताकि IAP बाइंडिंग लागू हो सकें. इसके बाद, सबसे ऊपर मौजूद यूआरएल पर क्लिक करें. साइट दिखनी चाहिए.

12. व्यवस्थित करें
इस चरण में, इस कोडलैब में बनाए गए संसाधनों को मिटाने का तरीका बताया गया है.
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
