Cloud SQL for MySQL-এ ভেক্টর এম্বেডিং ব্যবহার শুরু করা

১. ভূমিকা

এই কোডল্যাবে আপনি শিখবেন কীভাবে এম্বেডিং ব্যবহার করে সেম্যান্টিক সার্চের জন্য MySQL AI ইন্টিগ্রেশনের জন্য Cloud SQL ব্যবহার করতে হয় এবং ভেক্টর ডেটাতে ইন্ডেক্স ব্যবহার করে কীভাবে পারফর্ম্যান্স উন্নত করতে হয়।

8aa6ba3bc12a1593.png

পূর্বশর্ত

  • Google Cloud এবং Google Cloud কনসোল সম্পর্কে প্রাথমিক ধারণা
  • কমান্ড-লাইন ইন্টারফেস ও Cloud Shell-এর সাথে বেসিক অভিজ্ঞতা

আপনি কী শিখবেন

  • MySQL ইনস্ট্যান্সের জন্য কীভাবে Cloud SQL ডিপ্লয় করবেন
  • কীভাবে ডেটাবেস তৈরি করবেন এবং Cloud SQL AI ইন্টিগ্রেশন চালু করবেন
  • ডেটাবেসে কীভাবে ডেটা লোড করতে হয়
  • Cloud SQL Studio কীভাবে ব্যবহার করবেন
  • Cloud SQL-এ Vertex AI এম্বেডিং মডেল কীভাবে ব্যবহার করবেন
  • Agent Platform Studio কীভাবে ব্যবহার করবেন
  • Gemini Enterprise Agent Platform মডেল ব্যবহার করে কীভাবে ফলাফল আরও উন্নত করা যায়
  • ভেক্টর ইন্ডেক্স ব্যবহার করে কীভাবে পারফর্ম্যান্স উন্নত করবেন

আপনার যা প্রয়োজন হবে

  • একটি Google Cloud অ্যাকাউন্ট এবং একটি Google Cloud প্রোজেক্ট
  • Chrome-এর মতো ওয়েব ব্রাউজার

২. সেট-আপ ও প্রয়োজনীয়তা

প্রোজেক্ট সেট-আপ

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

অফিস বা স্কুলের অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন।

  1. নতুন প্রোজেক্ট তৈরি করুন অথবা আগে থেকে থাকা কোনও প্রোজেক্ট আবার ব্যবহার করুন। Google Cloud কনসোলে নতুন প্রোজেক্ট তৈরি করতে, টুলবারে প্রোজেক্ট বেছে নিন বিকল্পে ক্লিক করুন।

295004821bab6a87.png

'প্রোজেক্ট বেছে নিন' উইন্ডোতে 'নতুন প্রোজেক্ট' বোতামে ক্লিক করুন, এর ফলে নতুন প্রোজেক্টের জন্য একটি ডায়ালগ বক্স খুলে যাবে।

37d264871000675d.png

ডায়ালগে, প্রোজেক্টের নাম লিখুন এবং লোকেশন বেছে নিন।

96d86d3d5655cdbe.png

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

বিলিং চালু করুন

বিলিং চালু করার জন্য আপনার কাছে দুটি বিকল্প আছে। আপনি নিজের ব্যক্তিগত বিলিং অ্যাকাউন্ট ব্যবহার করতে পারেন অথবা নিম্নলিখিত ধাপগুলি অনুসরণ করে ক্রেডিট রিডিম করতে পারেন।

Google Cloud ক্রেডিট রিডিম করুন (ঐচ্ছিক)

এই ওয়ার্কশপ চালাতে, আপনার ক্রেডিট সহ বিলিং অ্যাকাউন্ট থাকতে হবে। শুরু করার জন্য ওয়ার্কশপ আয়োজকদের দেওয়া ক্রেডিট ব্যবহার করুন অথবা এই কোডল্যাবের উপরে ব্যানারে দেওয়া ক্রেডিট ব্যবহার করুন। আপনি আগে থেকেই কোনও বিলিং অ্যাকাউন্টের সাথে কানেক্ট করে থাকলে, এই ধাপটি এড়িয়ে যেতে পারবেন।

ব্যক্তিগত বিলিং অ্যাকাউন্ট সেট-আপ করা

আপনি Google Cloud ক্রেডিট ব্যবহার করে বিলিং সেট-আপ করলে, এই ধাপটি এড়িয়ে যেতে পারবেন।

ব্যক্তিগত বিলিং অ্যাকাউন্ট সেট-আপ করতে, Google Cloud বিলিং কনসোল থেকে বিলিং চালু করুন।

মনে রাখবেন:

  • এই ল্যাব সম্পূর্ণ করতে Google Cloud রিসোর্সে $৫ মার্কিন ডলারের কম খরচ হয়।
  • রিসোর্স মুছে দিতে এবং আরও চার্জ এড়াতে এই ল্যাবের শেষে দেওয়া ধাপগুলি অনুসরণ করুন।
  • নতুন ব্যবহারকারীরা $৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল-এর জন্য উপযুক্ত।
  • নতুন ও বর্তমান ব্যবহারকারীরা Cloud SQL ফ্রি ট্রায়াল ইনস্ট্যান্স ব্যবহার করে Cloud SQL-এর সাথে শুরু করতে পারবেন

Cloud Shell চালু করুন

আপনি নিজের কম্পিউটার থেকে রিমোটলি Google Cloud অপারেট করতে পারলেও, এই কোডল্যাবে আপনি Google Cloud Shell ব্যবহার করবেন, এটি হল ক্লাউডে চলা একটি কমান্ড-লাইন এনভায়রনমেন্ট।

Google Cloud Console-এ, উপরের ডানদিকের টুলবারে Cloud Shell আইকনে ক্লিক করুন:

Cloud Shell চালু করুন

বিকল্প হিসেবে, Google Cloud কনসোলে g এবং তারপর s প্রেস করুন অথবা Cloud Shell খুলুন।

প্রভিশন করতে এবং এনভায়রনমেন্টের সাথে কানেক্ট করতে মাত্র কয়েক মুহূর্ত সময় লাগে। এটি সম্পূর্ণ হলে, আপনি কানেক্ট করা টার্মিনাল দেখতে পাবেন:

Google Cloud Shell টার্মিনালের স্ক্রিনশট যেখানে দেখা যাচ্ছে যে এনভায়রনমেন্ট কানেক্ট করা হয়েছে

আপনার প্রয়োজনীয় সব ডেভেলপমেন্ট টুল এই ভার্চুয়াল মেশিনে লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি অফার করে এবং Google Cloud-এ চলে, যা নেটওয়ার্ক পারফর্ম্যান্স ও যাচাইকরণ উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারের মধ্যে করা যেতে পারে।

৩. শুরু করার আগে

API চালু করুন

Cloud SQL, Compute Engine, Service Networking এবং Gemini Enterprise Agent Platform ব্যবহার করতে, আপনার Google Cloud প্রোজেক্টে তাদের সংশ্লিষ্ট API চালু করুন।

Cloud Shell টার্মিনালে, আপনার প্রোজেক্ট আইডি সেট করা আছে কিনা তা নিশ্চিত করুন:

gcloud config get project

এটি খালি স্ট্রিং রিটার্ন করলে, এটি দিয়ে সেট করুন:

gcloud config set project [YOUR-PROJECT-ID]

PROJECT_ID এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:

PROJECT_ID=$(gcloud config get-value project)

প্রয়োজনীয় সব API চালু করুন:

gcloud services enable sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.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 sqladmin.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.

আপনি ডকুমেন্টেশন থেকে প্রতিটি চালু করা API সম্পর্কে পড়তে পারবেন।

৪. Cloud SQL ইনস্ট্যান্স তৈরি করা

Gemini Enterprise Agent Platform ডেটাবেস ইন্টিগ্রেশনের মাধ্যমে Cloud SQL ইনস্ট্যান্স তৈরি করুন।

ডেটাবেস পাসওয়ার্ড তৈরি করুন

ডিফল্ট ডেটাবেস ব্যবহারকারীর জন্য পাসওয়ার্ড নির্ধারণ করুন। আপনি নিজের পাসওয়ার্ড নির্ধারণ করতে পারেন অথবা একটি পাসওয়ার্ড তৈরি করতে র‍্যান্ডম ফাংশন ব্যবহার করতে পারেন:

export CLOUDSQL_PASSWORD=`openssl rand -hex 16`

জেনারেট করা পাসওয়ার্ডের ভ্যালু দেখান:

echo $CLOUDSQL_PASSWORD

জেনারেট করা পাসওয়ার্ডটি পরে ব্যবহার করার জন্য নোট করে রাখুন।

MySQL ইনস্ট্যান্সের জন্য Cloud SQL তৈরি করা

Google Cloud কনসোল, Terraform বা Google Cloud CLI (gcloud) সহ বিভিন্ন পদ্ধতি ব্যবহার করে Cloud SQL ইনস্ট্যান্স তৈরি করা যেতে পারে। এই কোডল্যাবে, আপনি gcloud ব্যবহার করেন। অন্যান্য টুল ব্যবহার করে কীভাবে ইনস্ট্যান্স তৈরি করতে হয় তা জানতে, ইনস্ট্যান্স তৈরি করুন ডকুমেন্টেশন দেখুন।

ইনস্ট্যান্স তৈরি করার সময় cloudsql_vector ফ্ল্যাগ চালু করা যেতে পারে। MySQL 8.0 R20241208.01_00 বা তার পরবর্তী ভার্সনের জন্য ভেক্টর সাপোর্ট উপলভ্য

Cloud Shell সেশনে এটি এক্সিকিউট করুন:

gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-password=$CLOUDSQL_PASSWORD

gcloud sql connect ব্যবহার করে ইনস্ট্যান্সের সাথে কানেক্ট করুন। প্রম্পট করা হলে, পাসওয়ার্ড লিখুন:

gcloud sql connect my-cloudsql-instance --user=root

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

$gcloud sql connect my-cloudsql-instance --user=root
Allowlisting your IP for incoming connection for 5 minutes...done.                                                                                                                           
Connecting to database with SQL user [root].Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 8.4.4-google (Google)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Ctrl+D প্রেস করে অথবা exit লিখে mysql সেশন থেকে বেরিয়ে আসুন:

exit

Gemini Enterprise Agent Platform ইন্টিগ্রেশন চালু করুন

Gemini Enterprise Agent Platform ইন্টিগ্রেশন চালু করতে Cloud SQL পরিষেবা অ্যাকাউন্টে প্রয়োজনীয় IAM ভূমিকা দিন।

Cloud SQL পরিষেবা অ্যাকাউন্টের ইমেল ফিরিয়ে আনুন এবং এনভায়রনমেন্ট ভেরিয়েবল হিসেবে এটি এক্সপোর্ট করুন:

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

Cloud SQL পরিষেবা অ্যাকাউন্টে roles/aiplatform.user ভূমিকা মঞ্জুর করুন:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

এখান থেকে Cloud SQL ডকুমেন্টেশনে ইনস্ট্যান্স তৈরি ও কনফিগারেশন সম্পর্কে আরও পড়ুন।

৫. ডেটাবেস তৈরি করুন

একটি ডেটাবেস তৈরি করুন এবং ভেক্টর সাপোর্ট চালু করুন।

ডেটাবেস তৈরি করুন

quickstart_db নামের একটি ডেটাবেস তৈরি করুন। আপনি ডেটাবেস ক্লায়েন্ট (যেমন mysql), Google Cloud CLI বা Cloud SQL Studio ব্যবহার করে ডেটাবেস তৈরি করতে পারবেন। এই ধাপে, gcloud ব্যবহার করুন।

Cloud Shell-এ, ডেটাবেস তৈরি করতে নিম্নলিখিত কমান্ড রান করুন:

gcloud sql databases create quickstart_db --instance=my-cloudsql-instance

৬. ডেটা লোড করুন

ডেটাবেসে টেবিল তৈরি করুন এবং CSV ফর্ম্যাটে সর্বজনীন Cloud Storage বাকেটে স্টোর করা কাল্পনিক Cymbal Store ডেটাসেট ফাইল ব্যবহার করে ডেটা লোড করুন।

Cloud Shell হবে আপনার প্রধান এনভায়রনমেন্ট, যার মাধ্যমে আপনি ডেটাবেসে কানেক্ট করতে, সব অবজেক্ট তৈরি করতে এবং ডেটা লোড করতে পারবেন।

আমাদের Cloud SQL ইনস্ট্যান্সের জন্য অনুমোদিত নেটওয়ার্কের তালিকায় আপনার Cloud Shell পাবলিক IP যোগ করুন।

ক্লাউড শেলে এক্সিকিউট করুন:

gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)

আপনার সেশন হারিয়ে গেলে, রিসেট হলে অথবা আপনি অন্য টুল থেকে কাজ করলে, আপনার CLOUDSQL_PASSWORD ভেরিয়েবল আবার এক্সপোর্ট করুন:

export CLOUDSQL_PASSWORD=...your password defined for the instance...

প্রয়োজনীয় ডেটাবেস অবজেক্ট তৈরি করুন। পাবলিক সোর্স থেকে স্কিমা ডাউনলোড ও প্রয়োগ করতে curl-এর সাথে mysql ব্যবহার করুন।

ক্লাউড শেলে এক্সিকিউট করুন:

export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

কমান্ড ব্রেকডাউন। আগের ধাপে, আপনি নিজের ডেটাবেসে কানেক্ট করেছেন এবং টেবিল, ইন্ডেক্স ও সিকোয়েন্স তৈরি করতে SQL স্ক্রিপ্ট রান করেছেন।

এরপর, curl ও mysql রান করে cymbal_products ডেটা দিয়ে ডেটাবেস পপুলেট করুন:

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_products FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

cymbal_stores-এর সাথে চালিয়ে যান।

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_stores FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

And complete with cymbal_inventory which has the number of each product in each store.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_inventory FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

ঐচ্ছিক: আপনার নিজস্ব স্যাম্পেল ডেটাসেট থাকলে, আপনি Google Cloud কনসোলে ইমপোর্ট টুল ব্যবহার করে মানানসই CSV ফাইল ইমপোর্ট করতে পারেন।

৭. এম্বেডিং তৈরি করুন

Gemini Enterprise Agent Platform থেকে text-embedding-005 মডেল ব্যবহার করে প্রোডাক্টের বিবরণের জন্য এম্বেডিং তৈরি করুন এবং ভেক্টর ডেটা হিসেবে সেগুলি স্টোর করুন।

ভেক্টর ডেটা স্টোর করতে, আপনার Cloud SQL ইনস্ট্যান্সে ভেক্টর কার্যকারিতা চালু করতে হবে।

Cloud Shell-এ এক্সিকিউট করুন:

gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on

ডেটাবেসে কানেক্ট করুন:

mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

এম্বেডিং ফাংশন ব্যবহার করে cymbal_products টেবিলে একটি নতুন কলাম embedding তৈরি করুন। সেই নতুন কলামে product_description কলামের টেক্সটের উপর ভিত্তি করে ভেক্টর এম্বেডিং থাকবে:

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);

মনে রাখবেন: ২০০০ সারির জন্য এম্বেডিং জেনারেশন সাধারণত ৫ মিনিটের মধ্যে শেষ হয়।

mysql সেশন থেকে বেরিয়ে আসুন:

exit

৮. সাদৃশ্য সার্চ রান করুন

সার্চ কোয়েরির জন্য এম্বেডিংয়ের সাথে প্রোডাক্টের বিবরণের জন্য গণনা করা ভেক্টর এম্বেডিংয়ের তুলনা করে একটি সিমিলারিটি সার্চ চালান।

আপনি কমান্ড লাইন বা Cloud SQL Studio থেকে SQL কোয়েরি চালাতে পারবেন। Cloud SQL স্টুডিও আউটপুটে একাধিক সারি সহ দীর্ঘ SQL স্টেটমেন্ট এডিট এবং এক্সিকিউট করার আরও সুবিধাজনক উপায় প্রদান করে।

Cloud SQL Studio-এর জন্য MySQL ব্যবহারকারী তৈরি করা

আপনার একটি নতুন ডেটাবেস ব্যবহারকারী প্রয়োজন যা Cloud SQL Studio ব্যবহার করতে পারে। রুট ব্যবহারকারীর জন্য আপনি যে পাসওয়ার্ড ব্যবহার করেছেন, সেটি ব্যবহার করে বিল্ট-ইন টাইপ ব্যবহারকারী student তৈরি করুন।

Cloud Shell-এ এটি এক্সিকিউট করুন:

gcloud sql users create student  --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%

Cloud SQL Studio চালু করুন

  1. Google Cloud কনসোলে, Cloud SQL ইনস্ট্যান্স বিকল্পে নেভিগেট করুন এবং my-cloudsql-instance-এ ক্লিক করুন।

Google Cloud কনসোলে Cloud SQL ইনস্ট্যান্সের তালিকা

  1. নেভিগেশন মেনুতে, Cloud SQL Studio বিকল্পে ক্লিক করুন।

Cloud SQL Studio মেনু আইটেম

  1. যাচাইকরণ ডায়ালগে, ডেটাবেসের নাম ও ক্রেডেনশিয়াল লিখুন:
    • ডেটাবেস: quickstart_db
    • ব্যবহারকারী: student
    • পাসওয়ার্ড:
  2. যাচাই করুন বিকল্পে ক্লিক করুন।

Cloud SQL Studio যাচাইকরণ ডায়ালগ

  1. SQL এডিটর খুলতে নামহীন কোয়েরি ট্যাবে ক্লিক করুন।

Cloud SQL Studio SQL এডিটর ট্যাব

কোয়েরি রান করুন

গ্রাহকের কোয়েরির সাথে সবচেয়ে প্রাসঙ্গিক সেরা ৫টি প্রোডাক্ট খুঁজে পেতে একটি কোয়েরি রান করুন: "এখানে কোন ধরনের ফলের গাছ ভালো জন্মায়?"

cosine_distance ফাংশন ব্যবহার করে আমাদের অনুরোধের জন্য সবচেয়ে উপযুক্ত প্রথম ৫টি আইটেম বেছে নিতে আপনি এই কোয়েরি চালাতে পারেন:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cosine_distance(cp.embedding ,@query_vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

Cloud SQL Studio-তে কোয়েরি লিখে রান করুন বিকল্পে ক্লিক করুন (অথবা আপনার sql সেশনে কোয়েরি রান করুন):

Cloud SQL Studio-তে SQL কোয়েরি চালানো

কোয়েরিটি কোসাইন দূরত্ব অনুযায়ী সাজানো ম্যাচিং প্রোডাক্ট দেখায়:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.13 sec)

cosine_distance ফাংশনের মাধ্যমে কোয়েরি এক্সিকিউট করতে প্রায় ০.১৩ সেকেন্ড সময় লাগে।

একই কোয়েরি রান করুন, তবে approx_distance ফাংশন ব্যবহার করে KNN সার্চ ব্যবহার করুন। আপনার এম্বেডিংয়ের জন্য ANN ইন্ডেক্স না থাকলে, এটি ব্যাকগ্রাউন্ডে অটোমেটিক সঠিক সার্চে ফিরে যায়:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

এবং এখানে কোয়েরির মাধ্যমে পাওয়া প্রোডাক্টের তালিকা দেওয়া হল।

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set, 1 warning (0.12 sec)

কোয়েরি এক্সিকিউট করতে মাত্র ০.১২ সেকেন্ড সময় লেগেছে। আমরা KNN সঠিক cosine_distance ফাংশনের মতো একই ফলাফল পেয়েছি।

Cloud SQL for MySQL ডকুমেন্টেশন থেকে ফাংশন সম্পর্কে আরও জানুন

৯. উদ্ধার করা ডেটা ব্যবহার করে LLM-এর উত্তর উন্নত করা

Gemini Enterprise Agent Platform ফাউন্ডেশন ল্যাঙ্গুয়েজ মডেলে প্রম্পটে গ্রাউন্ডেড কন্টেক্সট হিসেবে কোয়েরি ফলাফল পাস করে ক্লায়েন্ট অ্যাপ্লিকেশনে জেনারেটিভ AI উত্তর উন্নত করুন।

এটি করতে:

  1. Cloud SQL-এ ভেক্টর সার্চ ফলাফল থেকে JSON পেলোড জেনারেট করুন।
  2. Agent Platform Studio-তে প্রম্পটটি পরীক্ষা করুন।
  3. google_ml ইন্টিগ্রেশন ব্যবহার করে SQL থেকে সরাসরি এন্ড-টু-এন্ড প্রম্পট এক্সিকিউট করুন।

JSON ফর্ম্যাটে আউটপুট জেনারেট করুন

JSON হিসেবে ফলাফল ফর্ম্যাট করতে এবং একটি সারি রিটার্ন করতে কোয়েরি পরিবর্তন করুন:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1)
SELECT json_arrayagg(json_object('product_name',product_name,'description',description,'sale_price',sale_price,'zip_code',zip_code,'product_id',product_id)) FROM trees;

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

[{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}]

Agent Platform Studio-তে প্রম্পট রান করুন

এজেন্ট প্ল্যাটফর্ম স্টুডিওতে জেনারেটিভ মডেলে প্রম্পটে প্রসঙ্গ হিসেবে জেনারেট করা JSON প্রদান করুন।

  1. Google Cloud কনসোলে, Agent Platform Studio খুলুন।

Agent Platform Studio নেভিগেশন

  1. Agent Platform Studio-তে নিম্নলিখিত প্রম্পট লিখুন:

Agent Platform Studio-তে প্রম্পট লেখা হচ্ছে

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
<JSON_OUTPUT>
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

আপনার কোয়েরি থেকে JSON রেসপন্স দিয়ে পরিবর্তন করুন:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

Agent Platform Studio-তে প্রম্পট

  1. প্রম্পট রান করুন।

Agent Platform Studio-তে প্রম্পটের ফলাফল

উত্তরে দাম, বিবরণ এবং অতিরিক্ত তথ্য অন্তর্ভুক্ত থাকে যা মডেলটি গাছ এবং লোকেশন সম্পর্কে তথ্যের উপর ভিত্তি করে বাহ্যিক সোর্স থেকে পায়।

SQL-এ প্রম্পট রান করুন

এছাড়াও, আপনি Gemini Enterprise Agent Platform-এর সাথে Cloud SQL AI ইন্টিগ্রেশন ব্যবহার করে সরাসরি SQL-এর মধ্যে জেনারেটিভ মডেল থেকে উত্তর পেতে পারেন।

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

  1. উত্তর জেনারেট করার জন্য gemini-3.5-flash মডেল রেজিস্টার করুন (-এর জায়গায় আপনার প্রোজেক্ট আইডি লিখুন):
CALL
  mysql.ml_create_model_registration(
  'gemini-3.5-flash',
  'https://aiplatform.googleapis.com/v1/projects/<PROJECT_ID>/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
  'google',
  'GENERIC',
  NULL,
  'auth_type_cloudsql_service_agent_iam',
  NULL, NULL, NULL, NULL);

এছাড়াও, আমরা Gemini Enterprise Agent Platform-এর সাথে Cloud SQL AI ইন্টিগ্রেশন ব্যবহার করতে পারি যাতে ডেটাবেসে সরাসরি SQL ব্যবহার করে জেনারেটিভ মডেল থেকে একই ধরনের উত্তর পাওয়া যায়।

এখন আমরা SQL ব্যবহার করে জেনারেটিভ AI টেক্সট মডেলের প্রম্পটের অংশ হিসেবে সরবরাহ করার জন্য JSON ফলাফল সহ সাবকোয়েরিতে জেনারেট করা ব্যবহার করতে পারি।

ডেটাবেসের mysql বা Cloud SQL Studio সেশনে কোয়েরি রান করুন

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
         (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1),
prompt AS (
SELECT
       CONCAT( 'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:', json_arrayagg(json_object('product_name',trees.product_name,'description',trees.description,'sale_price',trees.sale_price,'zip_code',trees.zip_code,'product_id',trees.product_id)) , 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information') AS prompt_text
FROM
        trees),
response AS (
SELECT
       mysql.ML_PREDICT_ROW('gemini-3.5-flash',
        json_object('contents',
        json_object('role',
        'user',
        'parts',
        json_array(
        json_object('text',
        prompt_text))))) AS resp
FROM
        prompt)
SELECT
JSON_EXTRACT(resp, '$.candidates[0].content.parts[0].text')
FROM
        response;

আর এখানে স্যাম্পেল আউটপুট দেওয়া হল। মডেল ভার্সন ও প্যারামিটারের উপর নির্ভর করে আপনার আউটপুট আলাদা হতে পারে।:

"Hello there! I'd be happy to help you find the perfect fruit tree for your space. \n\nBased on your area, a wonderful option we currently have in stock is the **Malus Domestica** (the classic Apple Tree)!\n\nHere are the key details:\n\n* **Product Name:** Malus Domestica (Classic Apple Tree)\n* **Price:** $100.00\n\n### Why it's a great choice:\n* **Beautiful Seasonal Foliage:** It features vibrant green leaves during the summer that turn into gorgeous shades of red, orange, and yellow in the autumn. \n* **Shade & Size:** It grows to approximately 30 feet tall, making it a strong, durable tree that offers excellent shade for your yard alongside delicious fresh fruit.\n* **Growing Conditions:** It thrives best in cool, moist climates with well-draining, loamy soil and is ideal for USDA Hardiness Zones 4–8.\n\n### Supplemental Care Tips:\n* **Planting Location:** Choose a spot that gets full sunlight (at least 6 hours a day) to ensure maximum fruit production.\n* **Soil:** Make sure the soil is rich and loamy with good drainage so the roots stay healthy.\n* **Cross-Pollination:** Apple trees often produce a higher yield when planted near another compatible apple tree variety, so if you have extra space, adding a companion tree in the future can boost your harvest!\n\nLet me know if you have any questions about planting or care, or if you'd like help adding this to your cart!"

আউটপুট মার্কডাউন ফর্ম্যাটে দেখানো হয়।

১০. সবচেয়ে কাছের-প্রতিবেশী ইনডেক্স তৈরি করুন

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

ScaNN ইন্ডেক্স তৈরি করা

আমরা আমাদের পরীক্ষার জন্য ScaNN ইন্ডেক্স টাইপ ব্যবহার করে দেখতে চলেছি।

এম্বেডিং কলামের জন্য ইন্ডেক্স তৈরি করতে, আপনাকে এম্বেডিং কলামের জন্য আমাদের দূরত্ব পরিমাপের সংজ্ঞা দিতে হবে। আপনি ডকুমেন্টেশন থেকে প্যারামিটার সম্পর্কে বিস্তারিত পড়তে পারবেন।

CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;

উত্তরের তুলনা করুন

ভেক্টর সার্চ কোয়েরি আবার রান করে ফলাফল দেখুন:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

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

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.08 sec)

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

EXPLAIN কমান্ড ব্যবহার করে এক্সিকিউশন প্ল্যান চেক করুন:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
EXPLAIN ANALYZE SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 5;

এক্সিকিউশন প্ল্যান (উদ্ধৃতি):

...
-> Nested loop inner join  (cost=443 rows=5) (actual time=1.14..1.18 rows=5 loops=1)
                                -> Vector index scan on cp  (cost=441 rows=5) (actual time=1.1..1.1 rows=5 loops=1)
                                -> Single-row index lookup on cp using PRIMARY (uniq_id=cp.uniq_id)  (cost=0.25 rows=1) (actual time=0.0152..0.0152 rows=1 loops=5)

...

এটি cp টেবিলে(cymbal_products টেবিলের উপনাম) ভেক্টর ইনডেক্স স্ক্যান দেখায়।

MySQL-এ সিম্যান্টিক সার্চ কীভাবে কাজ করে তা দেখতে আপনার নিজস্ব ডেটা দিয়ে এটি ব্যবহার করে দেখুন বা বিভিন্ন সার্চ কোয়েরি পরীক্ষা করুন।

১১. পরিবেশ ক্লিন-আপ করুন

Cloud SQL ইনস্ট্যান্স মুছে দিন

ল্যাবের কাজ শেষ হয়ে গেলে Cloud SQL ইনস্ট্যান্সটি ধ্বংস করুন

আপনি ডিসকানেক্ট হয়ে গেলে এবং আগের সব সেটিংস হারিয়ে গেলে, ক্লাউড শেলে প্রোজেক্ট ও এনভায়রনমেন্ট ভেরিয়েবল নির্ধারণ করুন:

export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)

ইনস্ট্যান্স মুছুন:

gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID

প্রত্যাশিত কনসোল আউটপুট:

student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
All of the instance data will be lost when the instance is deleted.

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

Deleting Cloud SQL instance...done.                                                                                                                
Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].

১২. অভিনন্দন

কোডল্যাব সম্পূর্ণ করার জন্য অভিনন্দন।

Google Cloud লার্নিং পাথ

এই ল্যাবটি Production-Ready AI with Google Cloud লার্নিং পাথের অংশ।

আপনি কী কী কভার করেছেন

  • MySQL ইনস্ট্যান্সের জন্য কীভাবে Cloud SQL ডিপ্লয় করবেন
  • কীভাবে ডেটাবেস তৈরি করবেন এবং Cloud SQL AI ইন্টিগ্রেশন চালু করবেন
  • ডেটাবেসে কীভাবে ডেটা লোড করতে হয়
  • Cloud SQL Studio কীভাবে ব্যবহার করবেন
  • Cloud SQL-এ Vertex AI এম্বেডিং মডেল কীভাবে ব্যবহার করবেন
  • Agent Platform Studio কীভাবে ব্যবহার করবেন
  • Gemini Enterprise Agent Platform মডেল ব্যবহার করে কীভাবে ফলাফল আরও উন্নত করা যায়
  • ভেক্টর ইন্ডেক্স ব্যবহার করে কীভাবে পারফর্ম্যান্স উন্নত করবেন

একই ধরনের AlloyDB-এর জন্য কোডল্যাব অথবা Postgres-এর জন্য Cloud SQL-এর কোডল্যাব ব্যবহার করে দেখুন

সমীক্ষা

আউটপুট:

আপনি কীভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধু এটি পড়ুন এটি পড়ুন এবং অনুশীলন সম্পূর্ণ করুন