اپراتورها و رتبه بندی مجدد AlloyDB AI

اپراتورها و رتبه بندی مجدد AlloyDB AI

درباره این codelab

subjectآخرین به‌روزرسانی: مه ۲۳, ۲۰۲۵
account_circleنویسنده: Gleb Otochkin

1. مقدمه

این کد لبه راهنمای استقرار AlloyDB با اپراتورهای هوش مصنوعی و استفاده از آنها برای کارهایی مانند جستجوی معنایی، پیوستن ها و رتبه بندی نتایج را ارائه می دهد.

  • درک اولیه از Google Cloud، کنسول
  • مهارت های اولیه در رابط خط فرمان و Cloud Shell
  • نحوه استقرار AlloyDB برای Postgres
  • چگونه اپراتورهای هوش مصنوعی AlloyDB را فعال کنیم
  • نحوه استفاده از اپراتورهای مختلف هوش مصنوعی AlloyDB
  • نحوه استفاده از عملگرهای هوش مصنوعی AlloyDB در یک گردش کار RAG

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

  • یک حساب Google Cloud و پروژه Google Cloud
  • یک مرورگر وب مانند کروم که از کنسول Google Cloud و Cloud Shell پشتیبانی می کند

2. راه اندازی و الزامات

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.

3. قبل از شروع

فعال کردن API

در داخل Cloud Shell، مطمئن شوید که ID پروژه شما تنظیم شده است:

gcloud config set project [YOUR-PROJECT-ID]

تنظیم متغیر محیطی PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

فعال کردن تمام خدمات لازم:

gcloud services enable alloydb.googleapis.com \
                       compute
.googleapis.com \
                       cloudresourcemanager
.googleapis.com \
                       servicenetworking
.googleapis.com \
                       aiplatform
.googleapis.com \
                       discoveryengine
.googleapis.com \
                       secretmanager
.googleapis.com

خروجی مورد انتظار

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

4. AlloyDB را مستقر کنید

خوشه AlloyDB و نمونه اولیه ایجاد کنید. روش زیر نحوه ایجاد یک خوشه و نمونه AlloyDB با استفاده از Google Cloud SDK را توضیح می دهد. اگر رویکرد کنسول را ترجیح می دهید، می توانید مستندات را در اینجا دنبال کنید.

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

محدوده IP خصوصی ایجاد کنید

ما باید پیکربندی دسترسی به سرویس خصوصی را در VPC خود برای AlloyDB پیکربندی کنیم. فرض در اینجا این است که ما شبکه VPC "پیش‌فرض" را در پروژه داریم و قرار است برای همه اقدامات استفاده شود.

ایجاد محدوده IP خصوصی:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

با استفاده از محدوده IP اختصاص داده شده اتصال خصوصی ایجاد کنید:

gcloud services vpc-peerings connect \
   
--service=servicenetworking.googleapis.com \
   
--ranges=psa-range \
   
--network=default

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

خوشه AlloyDB ایجاد کنید

در این بخش ما در حال ایجاد یک خوشه AlloyDB در منطقه us-central1 هستیم.

رمز عبور را برای کاربر postgres تعریف کنید. شما می توانید رمز عبور خود را تعریف کنید یا از یک تابع تصادفی برای ایجاد آن استفاده کنید

export PGPASSWORD=`openssl rand -hex 12`

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

برای استفاده در آینده به رمز عبور PostgreSQL توجه کنید:

echo $PGPASSWORD

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

یک کلاستر آزمایشی رایگان ایجاد کنید

اگر قبلاً از AlloyDB استفاده نکرده‌اید، می‌توانید یک کلاستر آزمایشی رایگان ایجاد کنید:

منطقه و نام خوشه AlloyDB را تعریف کنید. ما از ناحیه us-central1 و alloydb-aip-01 به عنوان نام خوشه استفاده می کنیم:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

برای ایجاد کلاستر دستور را اجرا کنید:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL

خروجی کنسول مورد انتظار:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

در همان جلسه پوسته ابری، یک نمونه اولیه AlloyDB برای خوشه خود ایجاد کنید. اگر اتصال شما قطع شده است، باید دوباره متغیرهای محیط نام منطقه و خوشه را تعریف کنید.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

خوشه استاندارد AlloyDB را ایجاد کنید

اگر اولین خوشه AlloyDB شما در پروژه نیست، با ایجاد یک خوشه استاندارد ادامه دهید.

منطقه و نام خوشه AlloyDB را تعریف کنید. ما از ناحیه us-central1 و alloydb-aip-01 به عنوان نام خوشه استفاده می کنیم:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

برای ایجاد کلاستر دستور را اجرا کنید:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

خروجی کنسول مورد انتظار:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION 
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

در همان جلسه پوسته ابری، یک نمونه اولیه AlloyDB برای خوشه خود ایجاد کنید. اگر اتصال شما قطع شده است، باید دوباره متغیرهای محیط نام منطقه و خوشه را تعریف کنید.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

5. پایگاه داده را آماده کنید

ما باید یک پایگاه داده ایجاد کنیم، یکپارچه سازی Vertex AI را فعال کنیم، اشیاء پایگاه داده را ایجاد کنیم و داده ها را وارد کنیم.

مجوزهای لازم را به AlloyDB اعطا کنید

مجوزهای Vertex AI را به عامل سرویس AlloyDB اضافه کنید.

یک برگه دیگر Cloud Shell را با استفاده از علامت "+" در بالا باز کنید.

4ca978f5142bb6ce.png

در تب جدید پوسته ابری اجرا کنید:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

برگه را با یکی از دستورهای اجرایی "exit" در برگه ببندید:

exit

به AlloyDB Studio متصل شوید

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

ef4bfbcf0ed2ef3a.png

سپس روی AlloyDB Studio در سمت چپ کلیک کنید:

5c155cbcd7d43a1.png

پایگاه داده postgres، user postgres را انتخاب کنید و رمز عبوری را که هنگام ایجاد کلاستر ذکر شده است، ارائه دهید. سپس بر روی دکمه "Authenticate" کلیک کنید.

432613065cac864f.png

رابط AlloyDB Studio را باز می کند. برای اجرای دستورات در پایگاه داده، روی تب "Editor 1" در سمت راست کلیک کنید.

b36c28f8165119ca.png

این رابط را باز می کند که در آن می توانید دستورات SQL را اجرا کنید

cf43aa20f292797e.png

ایجاد پایگاه داده

ایجاد شروع سریع پایگاه داده

در ویرایشگر AlloyDB Studio دستور زیر را اجرا کنید.

ایجاد پایگاه داده:

CREATE DATABASE quickstart_db

خروجی مورد انتظار:

Statement executed successfully

به Quickstart_db متصل شوید

با استفاده از دکمه تغییر کاربر/پایگاه داده، دوباره به استودیو متصل شوید.

e826ad973eb23a74.png

پایگاه داده جدید quickstart_db را از لیست کشویی انتخاب کنید و از همان کاربر و رمز عبور قبلی استفاده کنید.

1ca70c59b5aea8c1.png

این یک اتصال جدید را باز می کند که در آن می توانید با اشیاء از پایگاه داده quickstart_db کار کنید.

پسوند google_ml را تأیید کنید

نسخه برنامه افزودنی google_ml را بررسی کنید تا مطمئن شوید که 1.4.4 یا بالاتر است تا بتوانید از موتور جستجوی هوش مصنوعی استفاده کنید.

در استودیو AlloyDB در حالی که به Quickstart_db متصل هستید اجرا کنید:

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

خروجی مورد انتظار:

1.4.4

اگر نسخه کمتر از مقدار مورد نیاز است، پسوند را به روز کنید.

در استودیو AlloyDB در حالی که به Quickstart_db متصل هستید اجرا کنید:

CALL google_ml.upgrade_to_preview_version();

خروجی مورد انتظار:

Statement executed successfully

پس از اجرای موفقیت آمیز، دوباره نسخه را تأیید کنید.

در استودیو AlloyDB در حالی که به Quickstart_db متصل هستید اجرا کنید:

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

خروجی مورد انتظار:

1.4.4

6. داده های نمونه

حالا باید آبجکت هایی را در پایگاه داده ایجاد کنیم و داده ها را بارگذاری کنیم. ما از مجموعه داده های فیلم تخیلی با چند ردیف استفاده می کنیم.

عبارات زیر را در ویرایشگر استودیو AlloyDB کپی کنید و دکمه "Run" را فشار دهید.

-- Drop tables if they exist to prevent errors on re-running the script
DROP TABLE IF EXISTS movie_reviews;
DROP TABLE IF EXISTS movies;

-- Create the 'movies' table
-- This table stores information about each movie.
CREATE TABLE movies (
    id BIGINT PRIMARY KEY,              -- Unique identifier for the movie
    title TEXT NOT NULL,               -- Title of the movie
    description TEXT,                  -- A brief description or synopsis of the movie
    genres TEXT,                       -- Comma-separated list of genres (e.g., "Action, Adventure, Sci-Fi")
    actors TEXT                        -- Comma-separated list of main actors
);

-- Create the 'movie_reviews' table
-- This table stores reviews for the movies.
CREATE TABLE movie_reviews (
    review_id BIGINT PRIMARY KEY,      -- Unique identifier for the review
    movie_id BIGINT NOT NULL,          -- Foreign key referencing the movie being reviewed
    reviewer_name TEXT,                -- Name of the person who wrote the review
    rating INT CHECK (rating >= 1 AND rating <= 5), -- Rating from 1 to 5 stars
    review_text TEXT,                  -- The content of the review
    review_date DATE DEFAULT CURRENT_DATE, -- Date when the review was submitted
    FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE -- Ensures referential integrity; if a movie is deleted, its reviews are also deleted.
);

-- Insert sample data into the 'movies' table (20 rows)
INSERT INTO movies (id, title, description, genres, actors) VALUES
(1, 'Inception', 'A thief who steals information by entering people''s dreams.', 'Sci-Fi, Thriller, Action', 'Leonardo DiCaprio, Joseph Gordon-Levitt, Elliot Page'),
(2, 'The Matrix', 'A computer hacker learns about the true nature of his reality.', 'Sci-Fi, Action', 'Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss'),
(3, 'Interstellar', 'A team of explorers journey through a cosmic passage beyond our world in an attempt to ensure humanity''s survival.', 'Sci-Fi, Drama, Adventure', 'Matthew McConaughey, Anne Hathaway, Jessica Chastain'), -- Updated description
(4, 'The Dark Knight', 'When the menace known as the Joker wreaks havoc and chaos on the people of Gotham, Batman must accept one of the greatest psychological and physical tests of his ability to fight injustice.', 'Action, Crime, Drama', 'Christian Bale, Heath Ledger, Aaron Eckhart'),
(5, 'Pulp Fiction', 'The lives of two mob hitmen, a boxer, a gangster and his wife, and a pair of diner bandits intertwine in four tales of violence and redemption.', 'Crime, Drama', 'John Travolta, Uma Thurman, Samuel L. Jackson'),
(6, 'Forrest Gump', 'The presidencies of Kennedy and Johnson, the Vietnam War, the Watergate scandal and other historical events unfold from the perspective of an Alabama man with an IQ of 75.', 'Drama, Romance', 'Tom Hanks, Robin Wright, Gary Sinise'),
(7, 'The Shawshank Redemption', 'Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.', 'Drama', 'Tim Robbins, Morgan Freeman, Bob Gunton'),
(8, 'Gladiator', 'A former Roman General sets out to exact vengeance against the corrupt emperor who murdered his family and sent him into slavery.', 'Action, Adventure, Drama', 'Russell Crowe, Joaquin Phoenix, Connie Nielsen'),
(9, 'Fight Club', 'An insomniac office worker looking for a way to change his life crosses paths with a devil-may-care soap maker and they form an underground fight club that evolves into something much, much more.', 'Drama', 'Brad Pitt, Edward Norton, Meat Loaf'),
(10, 'The Lord of the Rings: The Return of the King', 'Gandalf and Aragorn lead the World of Men against Sauron''s army to draw his gaze from Frodo and Sam as they approach Mount Doom with the One Ring.', 'Action, Adventure, Drama', 'Elijah Wood, Viggo Mortensen, Ian McKellen'),
(11, 'Spirited Away', 'During her family''s move to the suburbs, a sullen 10-year-old girl wanders into a world ruled by gods, witches, and spirits, and where humans are changed into beasts.', 'Animation, Adventure, Family', 'Daveigh Chase, Suzanne Pleshette, Miyu Irino'),
(12, 'Parasite', 'Greed and class discrimination threaten the newly formed symbiotic relationship between the wealthy Park family and the destitute Kim clan.', 'Comedy, Drama, Thriller', 'Song Kang-ho, Lee Sun-kyun, Cho Yeo-jeong'),
(13, 'The Godfather', 'The aging patriarch of an organized crime dynasty transfers control of his clandestine empire to his reluctant son.', 'Crime, Drama', 'Marlon Brando, Al Pacino, James Caan'),
(14, 'Avengers: Endgame', 'After the devastating events of Avengers: Infinity War, the universe is in ruins. With the help of remaining allies, the Avengers assemble once more in order to reverse Thanos'' actions and restore balance to the universe.', 'Action, Adventure, Drama', 'Robert Downey Jr., Chris Evans, Mark Ruffalo'),
(15, 'Joker', 'In Gotham City, mentally troubled comedian Arthur Fleck is disregarded and mistreated by society. He then embarks on a downward spiral of revolution and bloody crime.', 'Crime, Drama, Thriller', 'Joaquin Phoenix, Robert De Niro, Zazie Beetz'),
(16, 'Mad Max: Fury Road', 'In a post-apocalyptic wasteland, a woman rebels against a tyrannical ruler in search for her homeland with the help of a group of female prisoners, a psychotic worshiper, and a drifter named Max.', 'Action, Adventure, Sci-Fi', 'Tom Hardy, Charlize Theron, Nicholas Hoult'),
(17, 'Coco', 'Aspiring musician Miguel, confronted with his family''s ancestral ban on music, enters the Land of the Dead to find his great-great-grandfather, a legendary singer.', 'Animation, Adventure, Family', 'Anthony Gonzalez, Gael García Bernal, Benjamin Bratt'),
(18, 'Whiplash', 'A promising young drummer enrolls at a cut-throat music conservatory where his dreams of greatness are mentored by an instructor who will stop at nothing to realize a student''s potential.', 'Drama, Music', 'Miles Teller, J.K. Simmons, Paul Reiser'),
(19, 'The Grand Budapest Hotel', 'The adventures of Gustave H, a legendary concierge at a famous hotel from the fictional Republic of Zubrowka between the first and second World Wars, and Zero Moustafa, the lobby boy who becomes his most trusted friend.', 'Adventure, Comedy, Drama', 'Ralph Fiennes, F. Murray Abraham, Mathieu Amalric'),
(20, 'Blade Runner 2049', 'Young Blade Runner K''s discovery of a long-buried secret leads him to track down former Blade Runner Rick Deckard, who''s been missing for thirty years.', 'Action, Drama, Mystery', 'Ryan Gosling, Harrison Ford, Ana de Armas');

-- Insert sample data into the 'movie_reviews' table (30 rows)
-- Reviews are linked to movies via movie_id. Includes a mix of positive and negative reviews.
-- Movie title is prepended to the review text.
INSERT INTO movie_reviews (review_id, movie_id, reviewer_name, rating, review_text) VALUES
(1, 1, 'Alice Wonderland', 5, 'Inception: Absolutely mind-bending! A masterpiece of sci-fi.'),
(2, 1, 'Bob The Critic', 2, 'Inception: Too confusing and pretentious. Didn''t enjoy it.'),
(3, 2, 'Charlie Reviewer', 5, 'The Matrix: Revolutionary visuals and a compelling story.'),
(4, 3, 'Diana Prince', 5, 'Interstellar: Visually stunning and emotionally powerful. A must-see.'),
(5, 3, 'Edward Nigma', 4, 'Interstellar: Long, but worth it for the spectacle and ideas.'),
(6, 4, 'Fiona Glenanne', 5, 'The Dark Knight: Heath Ledger''s Joker is iconic. Dark and thrilling.'),
(7, 5, 'George Costanza', 5, 'Pulp Fiction: Quirky, violent, and endlessly quotable.'),
(8, 5, 'Hannah Montana', 1, 'Pulp Fiction: Way too violent and the timeline was confusing. Hated it.'),
(9, 6, 'Ian Malcolm', 4, 'Forrest Gump: A heartwarming story with a great performance by Hanks.'),
(10, 7, 'Jane Doe', 5, 'The Shawshank Redemption: An uplifting story of hope and friendship. Perfect.'),
(11, 7, 'John Smith', 5, 'The Shawshank Redemption: Morgan Freeman is amazing. Truly a classic.'),
(12, 8, 'Kyle Broflovski', 2, 'Gladiator: Generic plot and boring action scenes. Overrated.'),
(13, 9, 'Laura Palmer', 5, 'Fight Club: Provocative and thought-provoking. Norton and Pitt are fantastic.'),
(14, 10, 'Michael Scott', 5, 'The Lord of the Rings: The Return of the King: A fitting and epic conclusion to a legendary trilogy.'),
(15, 11, 'Nancy Drew', 5, 'Spirited Away: Beautiful animation and a magical story for all ages.'),
(16, 12, 'Oscar Martinez', 5, 'Parasite: A brilliant satire with unexpected twists. Loved it!'),
(17, 12, 'Pam Beesly', 4, 'Parasite: Very intense, but incredibly well-directed and acted.'),
(18, 13, 'Quentin Coldwater', 5, 'The Godfather: A cinematic masterpiece. Brando is unforgettable.'),
(19, 14, 'Rachel Green', 3, 'Avengers: Endgame: It was okay, but felt bloated and had too many characters.'),
(20, 14, 'Steve Rogers', 5, 'Avengers: Endgame: The culmination of a decade of storytelling. Perfect ending.'),
(21, 15, 'Tony Stark', 4, 'Joker: A dark and disturbing character study. Phoenix is mesmerizing.'),
(22, 16, 'Uma Thurman', 5, 'Mad Max: Fury Road: Non-stop action and incredible practical effects. What a ride!'),
(23, 17, 'Victor Frankenstein', 5, 'Coco: A heartwarming and visually stunning celebration of family and culture.'),
(24, 18, 'Walter White', 5, 'Whiplash: Intense and gripping. J.K. Simmons is terrifyingly good.'),
(25, 19, 'Xena Warrior', 2, 'The Grand Budapest Hotel: Too quirky for its own good. Style over substance.'),
(26, 20, 'Ygritte Snow', 5, 'Blade Runner 2049: A worthy sequel that expands on the original in meaningful ways. Visually breathtaking.'),
(27, 1, 'Zack Morris', 4, 'Inception: Kept me on the edge of my seat. Very clever.'),
(28, 4, 'Buffy Summers', 5, 'The Dark Knight: The best superhero movie ever made. Ledger is a legend.'),
(29, 8, 'Clark Kent', 3, 'Gladiator: Decent action, but the story felt predictable and dragged a bit.'),
(30, 15, 'Diana Troy', 3, 'Joker: Hard to watch at times, but a powerful performance. Felt it was a bit one-note though.');

اگر داده‌های نمونه و فایل‌های CSV خود را دارید که با ابزار وارد کردن Cloud SQL در کنسول Cloud سازگار است، می‌توانید به جای رویکرد ارائه‌شده از آن استفاده کنید.

7. از عملگر IF استفاده کنید

بیایید ابتدا جستجوی کلاسیک را با استفاده از رویکردهای استاندارد PostgreSQL امتحان کنیم.

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

SELECT title,description AS movies_about_space
    FROM movies
    WHERE description like
'%space%' OR title like '%space%';

هیچ نتیجه ای نداشت اما من مطمئن هستم که حداقل یک فیلم داریم که در آن دسته قرار می گیرد. ما می توانیم سعی کنیم از روش جستجوی متن کامل استفاده کنیم.

SELECT title,description
FROM movies
WHERE to_tsvector
('english', description) @@ to_tsquery('english', 'space');

و ممکن است اصلاً نتیجه ای نگیریم. بنابراین ما باید چند کلمه یا عبارات کلیدی را بدانیم تا بتوانیم از تکنیک های "کلاسیک" جستجوی PostgreSQL استفاده کنیم.

اکنون می‌توانیم از فیلتر معنایی مبتنی بر هوش مصنوعی با تابع google_ml.if استفاده کنیم. این از هوش مصنوعی در پشت صحنه برای انجام فیلتر معنایی بر اساس درخواست زبان طبیعی ما استفاده خواهد کرد.

SELECT title,description AS movies_about_space
    FROM movies
    WHERE
      google_ml.if(
        prompt => 'Here are descriptions of movies, can you return the ones about space adventures:  '||description);

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

8. از JOIN با عملگر IF استفاده کنید

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

در یک تب جدید ویرایشگر استودیو AlloyDB اجرا کنید:

SELECT title, rating, movie_reviews 
    FROM movies
    JOIN
    movie_reviews ON
      google_ml.if(
        prompt => 'Does the following reviews talk about a movie mentioned? The review: ' || review_text||' and the movie title is: '||title)
    AND
    title='Interstellar';

و ما دو بررسی مطابق با درخواست ما بر اساس نام فیلم ذکر شده در عنوان دریافت می کنیم. و حتی می توانیم درخواست را ساده تر کنیم:

SELECT title, rating, movie_reviews 
    FROM movies
    JOIN
    movie_reviews ON
      google_ml.if(
        prompt => 'Do we have the movie in the review?: ' || review_text||' and the movie title is: '||title)
    AND
    title='Interstellar';

9. نتایج امتیاز بر اساس مطالب

جدول movie_reviews دارای رتبه‌بندی برای فیلم‌ها است، اما اگر بخواهیم رتبه‌بندی خود را پیاده‌سازی کنیم، می‌توانیم از تابع google_ml.rank برای آن استفاده کنیم. ما می توانیم نظرات خود را بر اساس شرایط تعریف شده توسط یک زبان طبیعی امتیاز دهیم و به عنوان مثال 5 نقد برتر برای فیلم ها را دریافت کنیم و رتبه اصلی را برای مقایسه نشان دهیم.

SELECT rating,review_text AS top_five
    FROM movie_reviews
    ORDER BY google_ml.rank('Score of 7 to 10 if the review says the movie was really good, 3 to 6 if the review says it''s alright is and 1 to 2 if the review says it was not worth of time. Review: ' || review_text) DESC
    LIMIT 5;

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

SELECT rating,
    google_ml.rank('Score of 7 to 10 if the review says the movie was really good, 3 to 6 if the review says it''s alright is and 1 to 2 if the review says it was not worth of time. Review: ' || review_text) AS ml_rank,
    review_text AS top_five
    FROM movie_reviews
    ORDER BY ml_rank DESC
    LIMIT 5;

و در اینجا 5 بررسی برتر وجود دارد.

 rating | ml_rank |                               top_five
--------+---------+-----------------------------------------------------------------------
     
5 |       9 | The Dark Knight: Heath Ledger's Joker is iconic. Dark and thrilling.
      5 |       9 | The Matrix: Revolutionary visuals and a compelling story.
      5 |       9 | Interstellar: Visually stunning and emotionally powerful. A must-see.
      5 |       9 | Inception: Absolutely mind-bending! A masterpiece of sci-fi.
      5 |       9 | Pulp Fiction: Quirky, violent, and endlessly quotable.
(5 rows)
5 rows in set (0.13 sec)

امتیاز انتخاب شده 9 از 10 برای نظرات برتر بود.

10. بهبود جستجوی معنایی با استفاده از رتبه بندی

ما می توانیم جستجوی معنایی خود را با رتبه بندی ترکیب کنیم تا نتایج دقیق تری به دست آوریم.

ثبت نام مدل رتبه بندی مجدد

یک برگه دیگر Cloud Shell را با استفاده از علامت "+" در بالا باز کنید.

4ca978f5142bb6ce.png

در تب جدید پوسته ابری اجرا کنید:

export PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create aip-reranking
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/discoveryengine.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
gcloud iam service-accounts add-iam-policy-binding aip-reranking@$PROJECT_ID.iam.gserviceaccount.com \
    --member="user:$(gcloud auth list --filter=status:ACTIVE --format="value(account)")" --role="roles/iam.serviceAccountTokenCreator"
gcloud iam service-accounts add-iam-policy-binding aip-reranking@$PROJECT_ID.iam.gserviceaccount.com \
    --member="user:$(gcloud auth list --filter=status:ACTIVE --format="value(account)")" --role="roles/iam.serviceAccountUser"

یک نشانه دسترسی ایجاد کنید و آن را به عنوان یک راز با نام "rerank-secret" اضافه کنید:

echo -n $(gcloud auth print-access-token \
  --impersonate-service-account="aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
  --lifetime=3600) | gcloud secrets create rerank-secret \
    --replication-policy="automatic" \
    --data-file=-
gcloud secrets add-iam-policy-binding 'rerank-secret' \
      --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
      --role="roles/secretmanager.secretAccessor"

در مثال Secret به مدت یک ساعت معتبر خواهد بود و پس از آن باید با ایجاد یک نسخه جدید به روز شود. به عنوان مثال:

echo -n $(gcloud auth print-access-token \
--impersonate-service-account="aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
 
--lifetime=3600) | gcloud secrets versions add rerank-secret \
   
--data-file=-

اکنون باید به استودیو AlloyDB سوئیچ کنیم و یک راز برای دسترسی به مدل رتبه بندی مجدد خود ایجاد کنیم.

در کنسول AlloyDB Studio، پس از تغییر $PROJECT_ID توسط پروژه، اجرا کنید:

CALL
  google_ml
.create_sm_secret(
    secret_id
=> 'rerank-secret',
    secret_path
=> 'projects/PROJECT_ID/secrets/rerank-secret/versions/latest');

و پس از تغییر PROJECT_ID توسط پروژه خود، مدل را در همان جلسه Studio ثبت کنید:

CALL
google_ml.create_model(
  model_id => 'semantic-ranker-512-002',
  model_type => 'reranking',
  model_provider => 'custom',
  model_request_url =>
    'https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/rankingConfigs/default_ranking_config:rank',
  model_qualified_name => 'semantic-ranker-512@002',
  model_auth_type => 'secret_manager',
  model_auth_id => 'rerank-secret',
  model_in_transform_fn => 'google_ml.vertexai_reranking_input_transform',
  model_out_transform_fn => 'google_ml.vertexai_reranking_output_transform');

از مدل رتبه بندی مجدد استفاده کنید

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

بیایید فیلم های اکشن را پیدا کنیم و سپس آنها را با استفاده از "کامپیوتر و آینده" به عنوان شرایط رتبه بندی کنیم.

WITH
  action_movies AS (
    SELECT
      title,
      description,
      ROW_NUMBER() OVER (ORDER BY title, description) AS ref_number
    FROM
      movies
    WHERE
      google_ml.if(
        prompt => 'The following movies are action movies. The movie title: ' || title || ' and the description is: ' || description
      )
  ),
  ranked_documents_array AS (
    SELECT
      ARRAY_AGG(description ORDER BY ref_number) AS docs
    FROM
      action_movies
  ),
  reranked_results AS (
    SELECT
      r.index,
      r.score
    FROM
      ranked_documents_array,
      ai.rank(
        model_id => 'semantic-ranker-512-002',
        search_string => 'Computers and future',
        documents => ranked_documents_array.docs
      ) AS r
  )
SELECT
  am.title,
  left(am.description,80) as description,
  rr.score
FROM
  action_movies am
JOIN
  reranked_results rr ON am.ref_number = rr.index
ORDER BY
  rr.score DESC;

نتایج، فیلم‌های اکشن را فهرست می‌کنند که امیدواریم فیلم‌های مربوط به آینده و رایانه‌ها را در صدر قرار دهد.

title                     |                                   description                                    | score
-----------------------------------------------+----------------------------------------------------------------------------------+--------
 
The Matrix                                    | A computer hacker learns about the true nature of his reality.                   | 0.0145
 
Mad Max: Fury Road                            | In a post-apocalyptic wasteland, a woman rebels against a tyrannical ruler in se |  0.002
 
Avengers: Endgame                             | After the devastating events of Avengers: Infinity War, the universe is in ruins | 0.0018
 
Blade Runner 2049                             | Young Blade Runner K's discovery of a long-buried secret leads him to track down | 0.0004
 The Lord of the Rings: The Return of the King | Gandalf and Aragorn lead the World of Men against Sauron'
s army to draw his gaze |  1e-05
 
The Dark Knight                               | When the menace known as the Joker wreaks havoc and chaos on the people of Gotha |  1e-05
 
Inception                                     | A thief who steals information by entering people's dreams.                      |  1e-05
 Gladiator                                     | A former Roman General sets out to exact vengeance against the corrupt emperor w |  1e-05
(8 rows)

آن را با شرایط مختلف امتحان کنید و ببینید رتبه بندی چگونه بر ترتیب خروجی تأثیر می گذارد.

11. پاکسازی محیط

پس از اتمام کار با آزمایشگاه، نمونه ها و خوشه های AlloyDB را نابود کنید

خوشه AlloyDB و همه نمونه ها را حذف کنید

خوشه با نیروی گزینه از بین می رود که همچنین تمام نمونه های متعلق به خوشه را حذف می کند.

در پوسته ابری، متغیرهای پروژه و محیط را تعریف کنید، اگر اتصال شما قطع شده و تمام تنظیمات قبلی از بین رفته است:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

حذف خوشه:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

بک آپ های AlloyDB را حذف کنید

تمام بک آپ های AlloyDB برای خوشه را حذف کنید:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

خروجی کنسول مورد انتظار:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

12. تبریک میگم

برای تکمیل کد لبه تبریک می گویم.

آنچه را پوشش داده ایم

  • نحوه استقرار AlloyDB برای Postgres
  • چگونه اپراتورهای هوش مصنوعی AlloyDB را فعال کنیم
  • نحوه استفاده از اپراتورهای مختلف هوش مصنوعی AlloyDB
  • نحوه استفاده از عملگرهای هوش مصنوعی AlloyDB در یک گردش کار RAG

13. نظرسنجی

خروجی:

چگونه از این آموزش استفاده خواهید کرد؟