به PetVerse خوش آمدید!

۱. مقدمه

به دنیای حیوانات خانگی خوش آمدید! ورود همه حیوانات خانگی آزاد است! 🐈🐶🐍🐟🦄

پیش‌نیازها

  • آشنایی اولیه با کنسول ابری گوگل
  • درک اولیه از دستورات SQL

آنچه یاد خواهید گرفت

  • ایجاد مجموعه داده‌ها و جداول در BigQuery
  • ستون‌های ObjectRef را برای ارجاع به چندرسانه‌ای در یک سطل ذخیره‌سازی در BigQuery ایجاد کنید
  • از توابع هوش مصنوعی در BigQuery برای بهبود مجموعه داده‌های خود از محتوای داده‌های بدون ساختار استفاده کنید.
  • برای جستجوی رسانه‌های مشابه، جاسازی‌های چندرسانه‌ای ایجاد کنید
  • ایجاد جاسازی‌های متنی برای انجام جستجوی معنایی با VECTOR_SEARCH
  • استفاده از رابط خط فرمان Gemini برای ایجاد یک برنامه وب

آنچه نیاز دارید

  • یک حساب Google Cloud و پروژه Google Cloud با یک حساب صورتحساب
  • یک مرورگر وب مانند کروم

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

۳. پوسته ابری را باز کنید

به آدرس https://shell.cloud.google.com/?show=ide%2Cterminal بروید. وقتی از شما خواسته شد، روی «مجوز دادن» کلیک کنید.

1bfca4be2c270a9f.png

مطمئن شوید که هم ویرایشگر و هم کنسول قابل مشاهده هستند:

785d186a8b11b32b.png

۴. یک اسکریپت کمکی ایجاد کنید

برای روان‌تر کردن این تجربه، یک اسکریپت کمکی ایجاد خواهید کرد که متغیرهای محیطی مربوطه را تنظیم می‌کند.

به جای <<شناسه پروژه>>، شناسه پروژه خود را در زیر قرار دهید.

دستور زیر را در ترمینال Cloud Shell کپی کنید و برای اجرا، Enter را فشار دهید.**.**

gcloud config set project <<PROJECT_ID>>

ffd97bad1f398b4b.png

دستور زیر را در ترمینال 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، نام پروژه خود را قرار دهید:

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

برای اجرای پرس و جو از دکمه Run استفاده کنید.

پس از بارگیری موفقیت‌آمیز داده‌ها، روی «برو به جدول» کلیک کنید.

d6aab61d533bedde.png

برای مشاهده محتوای جدول، روی پیش‌نمایش کلیک کنید. 20fb1cbf8826efca.png

۷. اتصال BigQuery به Storage Bucket

اگر به سطلی که قبلاً ایجاد کرده‌اید نگاه کنید، مجموعه‌ای از فایل‌های رسانه‌ای مربوط به هر حیوان خانگی را خواهید یافت.

243751f1b0aab329.gif

BigQuery قابلیت خواندن این سطل‌ها و استفاده از فایل‌ها در کنار داده‌های جداول را دارد. این نوع مقدار ObjectRef نامیده می‌شود.

با کلیک روی آن در زیر «اتصالات خارجی» ، شناسه حساب سرویس را برای اتصالی که قبلاً ایجاد کرده‌اید، دریافت کنید.

۱d9d3275483f5650.png

شناسه حساب سرویس را کپی کنید .

در یک تب جدید مرورگر ( https://console.cloud.google.com/iam-admin/ ) به کنسول مدیریت IAM بروید.

حساب کاربری سرویس را با Storage Object Viewer و Vertex AI User اعطا کنید (بعداً از این مجوز استفاده خواهید کرد).

f1ff6b305d914532.png

روی ذخیره کلیک کنید و 🕰️ چند دقیقه صبر کنید .

به تب 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'))

روی مشاهده نتایج کلیک کنید. شما باید فراداده را در نتایج دریافت کنید:

9e3d986b797e413a.png

۸. رسانه ذخیره‌سازی را به داده‌های ساختاریافته خود اضافه کنید

شما می‌توانید جدول حیوانات خانگی را ارتقا دهید تا در صورت امکان، ستونی با تصویر پروفایل هر حیوان خانگی اضافه کنید. همچنین می‌توانید ستون دیگری با آرایه‌ای از ارجاعات رسانه‌ای اضافه کنید تا تمام فایل‌های دیگر مربوط به هر حیوان خانگی را در خود جای دهد.

دسترسی به فایل چندرسانه‌ای نیاز به اتصالی دارد که شما در ابتدای این آزمایشگاه کد، پس از ایجاد سطل خود، ایجاد کرده‌اید.

دستورات زیر را در کنسول BigQuery SQL وارد کنید و آنها را اجرا کنید تا دو ستون به جدول 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;

دستور را اجرا کنید. پس از چند دقیقه باید شاهد اجرای موفقیت‌آمیز دستورات باشید:

4fa3bba70440fa65.png

نتایج را با استفاده از پیش‌نمایش جدول بررسی کنید. باید فراداده‌های مربوط به تصاویر پروفایل موجود و رسانه‌های اضافی برای گربه‌ای به نام Pixel را ببینید.

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

به دنبال حیوانات خانگی مشابه باشید

مجموعه داده پیش‌فرض، حیوانات خانگی مشابهی دارد. در اینجا دو مثال Pixel (Id: 3) و SQL (Id: 4) آورده شده است:

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;

شما باید نتایجی با شناسه‌های تصاویر مشابه یکدیگر دریافت کنید. این شامل همه چیز در تصویر خواهد بود. در این مثال، Pixel و SQL مشابه هستند و حیوان خانگی مشابه بعدی Joel (شناسه: ۱۴) است.

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 را تغییر دهید و ببینید چه اتفاقی می‌افتد. می‌توانید اطلاعات بیشتری در مورد این توابع را اینجا بیابید.

۱۱. کد وایب برای صفحه پروفایل

شما از رابط خط فرمان Gemini در Cloud Shell برای شروع یک برنامه وب ساده و آزمایشی استفاده خواهید کرد. این برنامه وب در قسمت اعلان خود ساده‌سازی شده است تا نشان دهد که چگونه Petverse می‌تواند به واقعیت تبدیل شود.

به پوسته ابری برگردید. با کنسول در حالت تمام صفحه، تجربه بهتری خواهید داشت:

b5061fb060f2a958.png

اسکریپت مقداردهی اولیه را اجرا کنید تا مطمئن شوید متغیرهای محیطی تنظیم شده‌اند، یک دایرکتوری برای قرار دادن این پروژه ایجاد کنید و Gemini CLI را اجرا کنید:

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

شما باید CLI مربوط به Gemini را ببینید:

910fda2312082974.png

نام سطل را در اعلان زیر جایگزین کنید.

دستور را در خط فرمان 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 متوقف کنید، مشکل را بررسی کنید و دوباره آن را اجرا کنید.

47d6e394fc4f5b60.png

توصیه می‌کنیم هر یک از تأییدیه‌ها را با دقت و یکی یکی بخوانید تا بفهمید CLI چه کاری انجام خواهد داد:

6a62b9c077d4cd11.png

بعد از چند دقیقه، برنامه باید آماده اجرا باشد. ممکن است به نظر برسد که کنسول گیر کرده است:

ca51ecf7b1ce08bf.png

می‌توانید به صورت دستی برنامه را در یک تب جدید Cloud Shell با gunicorn امتحان کنید. مطمئن شوید که پروژه تنظیم شده است:

f0ee1095386f7ec.png

شما باید سایت جدید خود را ببینید (ممکن است با این متفاوت باشد). اگر چیزی کار نمی‌کند، باید بتوانید گزارش‌های خطا و اشکال‌زدایی را در خط فرمان Cloud Shell که به صورت محلی اجرا می‌شود، مشاهده کنید.

27bf3e2a8d429169.gif

اگر همه چیز خوب به نظر برسد، می‌توانید به صورت اختیاری برنامه را در Cloud Run مستقر کنید.

اگر پروژه شما متعلق به یک سازمان است، مطمئن شوید که IAP را طبق این دستورالعمل‌ها پیکربندی می‌کنید. اگر پروژه شما بخشی از یک سازمان نیست، می‌توانید به جای آن از این دستورالعمل‌ها برای ایمن‌سازی دسترسی به برنامه خود پیروی کنید. به خصوص برای تنظیمات تولید، توصیه می‌کنیم دسترسی غیرمجاز را مجاز نکنید.

۲۳۶۵a۹۰ac۶a۷d۴e۵.png

با فرض اینکه استقرار (deployment) کار می‌کند، باید اجرای برنامه Cloud Run را در کنسول Cloud Run مشاهده کنید.

مطمئن شوید که دسترسی فقط IAP است. از Edit Policy برای اضافه کردن کاربر خود به binding استفاده کنید و آن را ذخیره کنید .

چند دقیقه صبر کنید تا اتصالات 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