PetVerse স্বাগতম!

১. ভূমিকা

পেটভার্সে স্বাগতম! সকল পোষ্যকে স্বাগত! 🐈🐶🐍🐟🦄

পূর্বশর্ত

  • গুগল ক্লাউড কনসোল সম্পর্কে প্রাথমিক ধারণা
  • SQL স্টেটমেন্ট সম্পর্কে প্রাথমিক ধারণা

আপনি যা শিখবেন

  • BigQuery-তে ডেটাসেট এবং টেবিল তৈরি করুন
  • BigQuery-তে স্টোরেজ বাকেটে থাকা মাল্টিমিডিয়া রেফারেন্স করার জন্য ObjectRef কলাম তৈরি করুন।
  • অসংগঠিত ডেটার বিষয়বস্তু থেকে আপনার ডেটাসেটকে উন্নত করতে BigQuery-এর AI ফাংশন ব্যবহার করুন।
  • অনুরূপ মিডিয়া খোঁজার জন্য মাল্টিমিডিয়া এমবেডিং তৈরি করুন
  • VECTOR_SEARCH ব্যবহার করে শব্দার্থিক অনুসন্ধান করার জন্য টেক্সট এমবেডিং তৈরি করুন।
  • একটি ওয়েব অ্যাপ্লিকেশন তৈরি করতে Gemini CLI ব্যবহার করুন।

আপনার যা যা লাগবে

  • একটি বিলিং অ্যাকাউন্ট সহ একটি গুগল ক্লাউড অ্যাকাউন্ট এবং গুগল ক্লাউড প্রজেক্ট
  • ক্রোমের মতো একটি ওয়েব ব্রাউজার

২. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রজেক্ট আইডি উল্লেখ করতে হবে (যা সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি আপনার নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে।
  • আপনার অবগতির জন্য জানানো যাচ্ছে যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নম্বর , এবং কিছু এপিআই এটি ব্যবহার করে থাকে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
  1. এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হবে না, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর বিলিং এড়াতে রিসোর্সগুলো বন্ধ করার জন্য, আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা প্রজেক্টটি ডিলিট করে দিতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

৩. ক্লাউড শেল খুলুন

https://shell.cloud.google.com/?show=ide%2Cterminal -এ যান। অনুরোধ করা হলে, Authorize -এ ক্লিক করুন।

1bfca4be2c270a9f.png

নিশ্চিত করুন যে এডিটর এবং কনসোল উভয়ই দৃশ্যমান আছে:

785d186a8b11b32b.png

৪. একটি সহায়ক স্ক্রিপ্ট তৈরি করুন

এই অভিজ্ঞতাটিকে আরও মসৃণ করার জন্য, আপনি একটি হেল্পার স্ক্রিপ্ট তৈরি করবেন যা প্রাসঙ্গিক এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করবে।

নিচের <<Project ID>> স্থানটিতে আপনার প্রজেক্ট আইডি বসান।

নিম্নলিখিত কমান্ডটি ক্লাউড শেল টার্মিনালে কপি করুন এবং কার্যকর করতে এন্টার চাপুন।

gcloud config set project <<PROJECT_ID>>

ffd97bad1f398b4b.png

নিম্নলিখিত কমান্ডটি ক্লাউড শেল টার্মিনালে কপি করুন এবং কার্যকর করতে এন্টার চাপুন। এটি প্রয়োজনীয় পরিষেবাগুলি সক্রিয় করবে এবং ফাইলটি তৈরি করে ক্লাউড শেলে সম্পাদনা করবে।

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-এর প্লেসহোল্ডারটি আপনার প্রজেক্টের নাম দিয়ে প্রতিস্থাপন করুন:

aec2195d576244dd.png

নিম্নলিখিত কমান্ডটি কপি করে টার্মিনালে চালান:

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

প্রত্যাশিত আউটপুট:

83d1f7405624443b.png

৫. একটি স্টোরেজ বাকেট তৈরি করুন

একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন এবং উপলব্ধ মিডিয়াগুলো আপনার নিজের বাকেটে কপি করুন। আপনি এটি আমাদের চমৎকার পোষ্যদের জন্য উপলব্ধ মিডিয়া সংরক্ষণ করতে ব্যবহার করবেন। এছাড়াও, আপনি 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 "

379f72ee2908da36.png

৬. পোষা প্রাণীদের টেবিল তৈরি করুন

এখন আপনি আপনার পোষা প্রাণী সম্পর্কিত তথ্য সংরক্ষণের জন্য BigQuery-তে একটি টেবিল তৈরি করবেন।

ব্রাউজারে একটি নতুন ট্যাব খুলুনhttps://console.cloud.google.com/bigquery -এ যান।

নিশ্চিত করুন যে আপনি এতদিন ধরে যে প্রজেক্টটি ব্যবহার করে আসছেন, সেটিই কনসোলে নির্বাচিত আছে:

f82010a317866e6.png

এখন আপনি 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'
);

কোডে থাকা বাকেটের প্লেসহোল্ডারটি আগের ধাপে তৈরি করা বাকেটটি দিয়ে প্রতিস্থাপন করুন।

আপনি একটি আলাদা ব্রাউজার ট্যাবে এই URL-টি খুলে আপনার সমস্ত স্টোরেজ বাকেট দেখতে পারেন: https://console.cloud.google.com/storage/browser

757813944bb3d8ba.png

কোয়েরিটি কার্যকর করতে রান বাটনটি ব্যবহার করুন।

ডেটা সফলভাবে লোড হয়ে গেলে, ‘টেবিলে যান’ বাটনে ক্লিক করুন।

d6aab61d533bedde.png

টেবিলের বিষয়বস্তু দেখতে প্রিভিউ-তে ক্লিক করুন। 20fb1cbf8826efca.png

৭. BigQuery-কে স্টোরেজ বাকেটের সাথে সংযুক্ত করুন

আপনি আগে তৈরি করা বাকেটটিতে দেখলে প্রতিটি পোষা প্রাণী সম্পর্কিত কিছু মিডিয়া ফাইল খুঁজে পাবেন।

243751f1b0aab329.gif

BigQuery-এর এই বাকেটগুলো থেকে ডেটা পড়ার এবং টেবিলের ডেটার পাশাপাশি ফাইলগুলো ব্যবহার করার ক্ষমতা রয়েছে। এই ভ্যালু টাইপটিকে ObjectRef বলা হয়।

এক্সটার্নাল কানেকশনস- এর অধীনে আপনার পূর্বে তৈরি করা কানেকশনটির সার্ভিস অ্যাকাউন্ট আইডি পেতে সেটিতে ক্লিক করুন।

1d9d3275483f5650.png

সার্ভিস অ্যাকাউন্ট আইডিটি কপি করুন

একটি নতুন ব্রাউজার ট্যাবে IAM অ্যাডমিন কনসোলে যান ( https://console.cloud.google.com/iam-admin/ )।

সার্ভিস অ্যাকাউন্টটিকে স্টোরেজ অবজেক্ট ভিউয়ার এবং ভার্টেক্স এআই ইউজার ব্যবহারের অনুমতি দিন (এই অনুমতিটি আপনার পরে কাজে লাগবে)।

f1ff6b305d914532.png

সেভ-এ ক্লিক করুন এবং 🕰️ কয়েক মিনিট অপেক্ষা করুন

BigQuery ট্যাবে ফিরে এসে , BigQuery এবং স্টোরেজ বাকেটের মধ্যে সংযোগ পরীক্ষা করার জন্য 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'))

ভিউ রেজাল্টস-এ ক্লিক করুন। আপনি ফলাফলের মধ্যে মেটাডেটা পেয়ে যাবেন:

9e3d986b797e413a.png

৮. আপনার স্ট্রাকচার্ড ডেটাতে স্টোরেজ মিডিয়া যোগ করুন।

আপনি পোষা প্রাণীর টেবিলটিকে আরও উন্নত করে প্রতিটি পোষা প্রাণীর প্রোফাইল ছবি (যদি থাকে) সহ একটি কলাম যোগ করতে পারেন। এছাড়াও, আপনি মিডিয়া রেফারেন্সের একটি অ্যারে সহ আরেকটি কলাম যোগ করবেন, যেখানে প্রতিটি পোষা প্রাণী সম্পর্কিত অন্যান্য সমস্ত ফাইল রাখা হবে।

মাল্টিমিডিয়া অ্যাক্সেস করার জন্য একটি কানেকশন প্রয়োজন, যেটি আপনি এই কোডল্যাবের শুরুতে আপনার বাকেট তৈরি করার পর তৈরি করেছিলেন।

আপনার pets টেবিলে দুটি কলাম যোগ করতে, নিম্নলিখিত কমান্ডগুলি BigQuery SQL কনসোলে পেস্ট করে চালান।

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;

স্টেটমেন্টটি চালান। কয়েক মিনিট পর আপনি সফল এক্সিকিউশন দেখতে পাবেন:

4fa3bba70440fa65.png

টেবিল প্রিভিউ ব্যবহার করে ফলাফলগুলো যাচাই করুন। আপনি পিক্সেল নামের বিড়ালটির বিদ্যমান প্রোফাইল ছবি এবং অতিরিক্ত মিডিয়ার মেটাডেটা দেখতে পাবেন।

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

a1511d749e88d5f5.png

৯. পোষা প্রাণীদের বিবরণ তৈরি করুন

আপনি যদি পোষা প্রাণীদের টেবিলটি প্রিভিউ করেন, তাহলে লক্ষ্য করবেন যে ইয়োডা, পিক্সেল বা রকির মতো কিছু পোষা প্রাণীর প্রিয় খাবার বা প্রিয় খেলনা নেই।

এই প্রশ্নগুলোর উত্তর এই পোষ্যগুলো সম্পর্কিত ভিডিও এবং অডিওতে থাকতে পারে। যাচাই করার জন্য আপনি অন্তর্নির্মিত এআই ফাংশন ব্যবহার করবেন।

নিম্নলিখিত বিবৃতিটি দিয়ে এটি পরীক্ষা করুন:

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

কয়েক মিনিট পর আপনি কিছু সৃজনশীল বর্ণনা দেখতে পাবেন:

fab3b59caa69aec7.png

১০. এমবেডিং তৈরি করুন

সিমান্টিক সার্চে ব্যবহারের জন্য প্রোফাইল পিকচার, বিবরণ এবং শখের এমবেডিংগুলো সংরক্ষণ করতে একটি টেবিল তৈরি করুন। আমরা ভেক্টর সার্চ ব্যবহার করে পোষা প্রাণীদের মধ্যে সাদৃশ্য খুঁজে বের করব।

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;

ফলাফল ট্যাব থেকে নতুন টেবিলটি দেখুন।

c9e876d75147c343.png

সমস্ত এমবেডিংয়ের অবস্থা পরীক্ষা করতে নিম্নলিখিত বিবৃতিটি ব্যবহার করুন:

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

যদি কোনো ত্রুটি থাকে , তবে আপনি সেগুলোকে একটি অ-ফাঁকা অবস্থায় দেখতে পাবেন। এটাই সঠিক আউটপুট - কোনো রেকর্ডে ত্রুটি নেই:

e6754936c31ca5cf.png

নিচে ত্রুটিযুক্ত কিছু রেকর্ডের উদাহরণ দেওয়া হলো। এগুলো অপ্রত্যাশিত, কিন্তু পরবর্তী ধাপগুলোতে যাওয়ার আগে এগুলো ঠিক করা প্রয়োজন:

736545fbc7ce4ac8.png

একই রকম পোষা প্রাণী খুঁজুন

ডিফল্ট ডেটাসেটে একই রকম পোষা প্রাণী রয়েছে। এখানে দুটি উদাহরণ দেওয়া হলো: পিক্সেল (আইডি: ৩) এবং এসকিউএল (আইডি: ৪):

cfebe01afc5f4858.png

আপনি এমবেডিংগুলোর মধ্যকার দূরত্ব ব্যবহার করে সদৃশ পোষা প্রাণী গণনা করতে পারেন:

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;

আপনার এমন ছবিগুলোর আইডি সহ ফলাফল পাওয়া উচিত যেগুলো একে অপরের সাথে সাদৃশ্যপূর্ণ। এর মধ্যে ছবির সবকিছুই অন্তর্ভুক্ত থাকবে। এই উদাহরণে, পিক্সেল এবং এসকিউএল সাদৃশ্যপূর্ণ, এবং এর পরের সবচেয়ে সাদৃশ্যপূর্ণ পোষ্যটি হলো জোয়েল (আইডি: ১৪)।

99ce203add04a6b1.png

তুলনার জন্য জোয়েলের একটি ছবি দেওয়া হলো:

f78e0ca0fe235ba2.png

আপনি টেক্সট এমবেডিংগুলোর মধ্যে শব্দার্থগতভাবে অনুসন্ধান করার জন্য 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 প্যারামিটারটি পরিবর্তন করে দেখুন কী হয়। আপনি এই ফাংশনগুলো সম্পর্কে এখানে আরও জানতে পারবেন।

১১. প্রোফাইল পেজে ভাইব কোড ব্যবহার করুন

আপনি ক্লাউড শেলে জেমিনি সিএলআই ব্যবহার করে একটি সাধারণ, ডেমো ওয়েব অ্যাপ্লিকেশন চালু করবেন। পেটভার্স কীভাবে প্রাণবন্ত হয়ে উঠতে পারে তা দেখানোর জন্য এই ওয়েব অ্যাপ্লিকেশনটির প্রম্পট সরল করা হয়েছে।

ক্লাউড শেলে ফিরে যান। শুধু কনসোলটি ফুল স্ক্রিনে ব্যবহার করলে আপনার অভিজ্ঞতা আরও ভালো হবে:

b5061fb060f2a958.png

এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করা হয়েছে কিনা তা নিশ্চিত করতে ইনিশিয়ালাইজেশন স্ক্রিপ্টটি চালান, এই প্রজেক্টটি রাখার জন্য একটি ডিরেক্টরি তৈরি করুন এবং Gemini CLI এক্সিকিউট করুন:

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

আপনার মিথুন রাশির CLI দেখা উচিত:

910fda2312082974.png

নিচের প্রম্পটে বাকেটের নামটি প্রতিস্থাপন করুন।

প্রম্পটটি জেমিনি কমান্ড লাইনে পেস্ট করুন।

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 চেপে এটিকে থামান, সমস্যাটি খতিয়ে দেখুন এবং পুনরায় চালু করুন।

47d6e394fc4f5b60.png

সিএলআই কী করবে তা বোঝার জন্য আমরা প্রতিটি নিশ্চিতকরণপত্র এক এক করে মনোযোগ সহকারে পড়ার পরামর্শ দিচ্ছি:

6a62b9c077d4cd11.png

কয়েক মিনিট পর অ্যাপ্লিকেশনটি চালু হওয়ার জন্য প্রস্তুত হয়ে যাবে। এমনও হতে পারে যে কনসোলটি আটকে আছে বলে মনে হচ্ছে:

ca51ecf7b1ce08bf.png

আপনি gunicorn ব্যবহার করে একটি নতুন ক্লাউড শেল ট্যাবে অ্যাপ্লিকেশনটি ম্যানুয়ালি চেষ্টা করতে পারেন। নিশ্চিত করুন যে প্রজেক্টটি সেট করা আছে:

f0ee1095386f7ec.png

আপনি আপনার নতুন সাইটটি দেখতে পাবেন (এটি এর থেকে ভিন্ন দেখতে হতে পারে)। যদি কোনো কিছু কাজ না করে, তবে আপনি স্থানীয়ভাবে চালু থাকা ক্লাউড শেল কমান্ড লাইনে এরর এবং ডিবাগিং লগ দেখতে পাবেন।

27bf3e2a8d429169.gif

সবকিছু ঠিকঠাক থাকলে, আপনি চাইলে অ্যাপ্লিকেশনটি ক্লাউড রান-এ ডেপ্লয় করতে পারেন।

আপনার প্রজেক্টটি যদি কোনো প্রতিষ্ঠানের অন্তর্ভুক্ত হয়, তাহলে এই নির্দেশাবলী অনুসরণ করে IAP কনফিগার করুন। আপনার প্রজেক্টটি যদি কোনো প্রতিষ্ঠানের অংশ না হয়, তাহলে আপনার অ্যাপ্লিকেশনের অ্যাক্সেস সুরক্ষিত করতে এর পরিবর্তে এই নির্দেশাবলী অনুসরণ করতে পারেন। বিশেষ করে প্রোডাকশন সেটিংসের জন্য, আমরা প্রমাণীকরণবিহীন অ্যাক্সেস অনুমোদন না করার পরামর্শ দিই।

2365a90ac6a7d4e5.png

যদি ডেপ্লয়মেন্ট সফল হয়, তাহলে আপনি ক্লাউড রান কনসোলে ক্লাউড রান অ্যাপ্লিকেশনটি চলতে দেখবেন।

নিশ্চিত করুন যে অ্যাক্সেসটি শুধুমাত্র IAP (ইন-অ্যাপ পারচেজ) ভিত্তিক। আপনার ব্যবহারকারীকে বাইন্ডিং-এ যুক্ত করতে 'এডিট পলিসি' ব্যবহার করুন এবং সেভ করুন

IAP বাইন্ডিংগুলো প্রোপাগেট হওয়ার জন্য কয়েক মিনিট অপেক্ষা করুন এবং উপরের URL- টিতে ক্লিক করুন। সাইটটি দেখা যাবে।

3943c556ba912466.png

১২. পরিষ্কার করুন

এই ধাপে আপনাকে এই কোডল্যাবে তৈরি করা রিসোর্সগুলো মুছে ফেলার প্রক্রিয়াটি দেখানো হবে।

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