PostgreSQL-এর জন্য ক্লাউড এসকিউএল-এ ভেক্টর এম্বেডিংয়ের সাথে শুরু করা

1. ভূমিকা

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

30b7c4dcdd8bb68f.png

পূর্বশর্ত

  • Google ক্লাউড, কনসোলের একটি প্রাথমিক ধারণা
  • কমান্ড লাইন ইন্টারফেস এবং ক্লাউড শেলের প্রাথমিক দক্ষতা

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

  • PostgreSQL উদাহরণের জন্য একটি ক্লাউড এসকিউএল কীভাবে স্থাপন করবেন
  • কীভাবে ডাটাবেস তৈরি করবেন এবং ক্লাউড এসকিউএল এআই ইন্টিগ্রেশন সক্ষম করবেন
  • কিভাবে ডাটাবেসে ডাটা লোড করবেন
  • ক্লাউড এসকিউএল-এ ভার্টেক্স এআই এমবেডিং মডেল কীভাবে ব্যবহার করবেন
  • Vertex AI জেনারেটিভ মডেল ব্যবহার করে ফলাফলকে কিভাবে সমৃদ্ধ করা যায়
  • ভেক্টর সূচক ব্যবহার করে কর্মক্ষমতা কিভাবে উন্নত করা যায়

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

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

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

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

ক্লাউড শেল শুরু করুন

যদিও Google ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি Google ক্লাউড শেল ব্যবহার করবেন, একটি কমান্ড লাইন পরিবেশ যা ক্লাউডে চলছে।

Google ক্লাউড কনসোল থেকে, উপরের ডানদিকে টুলবারে ক্লাউড শেল আইকনে ক্লিক করুন:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

3. আপনি শুরু করার আগে

API সক্ষম করুন

আউটপুট:

ক্লাউড শেলের ভিতরে, নিশ্চিত করুন যে আপনার প্রকল্প আইডি সেটআপ করা আছে:

gcloud config set project [YOUR-PROJECT-ID]

পরিবেশ পরিবর্তনশীল PROJECT_ID সেট করুন:

PROJECT_ID=$(gcloud config get-value project)

সমস্ত প্রয়োজনীয় পরিষেবাগুলি সক্ষম করুন:

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.

4. একটি ক্লাউড এসকিউএল ইনস্ট্যান্স তৈরি করুন

Vertex AI এর সাথে ডাটাবেস ইন্টিগ্রেশন সহ ক্লাউড এসকিউএল ইনস্ট্যান্স তৈরি করুন।

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

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

export CLOUDSQL_PASSWORD=`openssl rand -hex 12`

পাসওয়ার্ডের জন্য উত্পন্ন মান নোট করুন:

echo $CLOUDSQL_PASSWORD

PostgreSQL উদাহরণের জন্য ক্লাউড এসকিউএল তৈরি করুন

ক্লাউড শেল সেশনে চালান:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_16 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

দৃষ্টান্ত তৈরি করার পরে, আমাদের উদাহরণে ডিফল্ট ব্যবহারকারীর জন্য একটি পাসওয়ার্ড সেট করতে হবে এবং আমরা পাসওয়ার্ডের সাথে সংযোগ করতে পারি কিনা তা যাচাই করতে হবে।

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --password=$CLOUDSQL_PASSWORD

কমান্ডটি চালান এবং সংযোগের জন্য প্রস্তুত হলে প্রম্পটে আপনার পাসওয়ার্ড রাখুন।

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

Vertex AI ইন্টিগ্রেশন সক্ষম করুন

Vertex AI ইন্টিগ্রেশন ব্যবহার করতে সক্ষম হওয়ার জন্য অভ্যন্তরীণ ক্লাউড sql পরিষেবা অ্যাকাউন্টে প্রয়োজনীয় সুযোগ-সুবিধা প্রদান করুন।

ক্লাউড এসকিউএল অভ্যন্তরীণ পরিষেবা অ্যাকাউন্ট ইমেল খুঁজুন এবং এটি একটি পরিবর্তনশীল হিসাবে রপ্তানি করুন৷

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

ক্লাউড SQL পরিষেবা অ্যাকাউন্টে Vertex AI-তে অ্যাক্সেস মঞ্জুর করুন:

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

এখানে ক্লাউড SQL ডকুমেন্টেশনে উদাহরণ তৈরি এবং কনফিগারেশন সম্পর্কে আরও পড়ুন।

5. ডাটাবেস প্রস্তুত করুন

এখন আমাদের একটি ডাটাবেস তৈরি করতে হবে এবং ভেক্টর সমর্থন সক্ষম করতে হবে।

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

Quickstart_db নামের একটি ডাটাবেস তৈরি করুন। এটি করার জন্য আমাদের কাছে বিভিন্ন অপশন আছে যেমন কমান্ড লাইন ডাটাবেস ক্লায়েন্ট যেমন PostgreSQL, SDK বা Cloud SQL স্টুডিওর জন্য psql। আমরা ডাটাবেস তৈরি করতে এবং উদাহরণে সংযোগ করার জন্য SDK (gcloud) ব্যবহার করব।

ডাটাবেস তৈরি করতে ক্লাউড শেল এক্সিকিউট কমান্ডে

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

এক্সটেনশন সক্রিয় করুন

Vertex AI এবং ভেক্টরের সাথে কাজ করতে সক্ষম হওয়ার জন্য আমাদের তৈরি করা ডাটাবেসে দুটি এক্সটেনশন সক্রিয় করতে হবে।

তৈরি করা ডাটাবেসের সাথে সংযোগ করতে ক্লাউড শেল এক্সিকিউট কমান্ডে (আপনাকে আপনার পাসওয়ার্ড প্রদান করতে হবে)

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

তারপর, সফল সংযোগের পরে, sql সেশনে আপনাকে দুটি কমান্ড চালাতে হবে:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

এসকিউএল সেশন থেকে প্রস্থান করুন:

exit;

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

এখন আমাদের ডাটাবেসে অবজেক্ট তৈরি করতে হবে এবং ডেটা লোড করতে হবে। আমরা কাল্পনিক Cymbal স্টোর ডেটা ব্যবহার করতে যাচ্ছি। ডেটা CSV ফর্ম্যাটে সর্বজনীন Google স্টোরেজ বাকেটে উপলব্ধ।

প্রথমে আমাদের ডাটাবেসের সমস্ত প্রয়োজনীয় বস্তু তৈরি করতে হবে। এটি করার জন্য আমরা আমাদের ডাটাবেসে স্কিমা অবজেক্টগুলি ডাউনলোড এবং আমদানি করতে ইতিমধ্যে পরিচিত gcloud sql connect এবং gcloud স্টোরেজ কমান্ড ব্যবহার করতে যাচ্ছি।

ক্লাউড শেল এক্সিকিউট করুন এবং পাসওয়ার্ড প্রদান করুন যখন আমরা উদাহরণ তৈরি করছিলাম:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

আমরা আগের কমান্ড ঠিক কি কি? আমরা আমাদের ডাটাবেসের সাথে সংযুক্ত হয়েছি এবং ডাউনলোড করা এসকিউএল কোডটি কার্যকর করেছি যা টেবিল, সূচী এবং সিকোয়েন্স তৈরি করে।

পরবর্তী ধাপ হল ডেটা লোড করা এবং তা করার জন্য আমাদের Google ক্লাউড স্টোরেজ থেকে CSV ফাইল ডাউনলোড করতে হবে।

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

তারপর আমাদের ডাটাবেসের সাথে সংযোগ করতে হবে।

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

এবং আমাদের CSV ফাইল থেকে ডেটা আমদানি করুন।

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

এসকিউএল সেশন থেকে প্রস্থান করুন:

exit;

যদি আপনার নিজের ডেটা থাকে এবং আপনার CSV ফাইলগুলি ক্লাউড কনসোল থেকে উপলব্ধ ক্লাউড SQL আমদানি সরঞ্জামের সাথে সামঞ্জস্যপূর্ণ হয় তবে আপনি কমান্ড লাইন পদ্ধতির পরিবর্তে এটি ব্যবহার করতে পারেন।

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

পরবর্তী ধাপ হল Google Vertex AI থেকে টেক্সটেমবেডিং-004 মডেল ব্যবহার করে আমাদের পণ্যের বিবরণের জন্য এম্বেডিং তৈরি করা এবং সেগুলিকে ভেক্টর ডেটা হিসাবে সংরক্ষণ করা।

ডাটাবেসের সাথে সংযোগ করুন:

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

এবং এমবেডিং ফাংশন ব্যবহার করে আমাদের cymbal_products টেবিলে একটি ভার্চুয়াল কলাম এমবেডিং তৈরি করুন।

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

এটি কিছুটা সময় নিতে পারে তবে 900-1000 সারির জন্য এটি 5 মিনিটের বেশি সময় নেওয়া উচিত নয় এবং সাধারণত এটি অনেক দ্রুত হয়।

8. সাদৃশ্য অনুসন্ধান চালান

আমরা এখন বর্ণনার জন্য গণনা করা ভেক্টর মান এবং আমাদের অনুরোধের জন্য আমরা যে ভেক্টর মান পাই তার উপর ভিত্তি করে সাদৃশ্য অনুসন্ধান ব্যবহার করে আমাদের অনুসন্ধান চালাতে পারি।

SQL ক্যোয়ারী একই কমান্ড লাইন ইন্টারফেস থেকে gcloud sql সংযোগ t ব্যবহার করে বা বিকল্প হিসাবে, ক্লাউড SQL স্টুডিও থেকে চালানো যেতে পারে। ক্লাউড এসকিউএল স্টুডিওতে যেকোনো মাল্টিরো এবং জটিল ক্যোয়ারী ম্যানেজ করা ভালো।

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

কনসোলে ক্লাউড এসকিউএল ইন্সট্যান্সে ক্লিক করুন যা আমরা আগে তৈরি করেছি।

b8d4844da1114a0b.png

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

ce3f27dc21367f2e.png

এটি একটি ডায়ালগ খুলবে যেখানে আপনি ডাটাবেসের নাম এবং আপনার শংসাপত্রগুলি প্রদান করবেন:

  • ডাটাবেস: quickstart_db
  • ব্যবহারকারী: postgres
  • পাসওয়ার্ড: প্রধান ডাটাবেস ব্যবহারকারীর জন্য আপনার উল্লেখ করা পাসওয়ার্ড

এবং "প্রমাণিত করুন" বোতামে ক্লিক করুন।

2591c8bbc93e4e97.png

এটি পরবর্তী উইন্ডোটি খুলবে যেখানে আপনি SQL এডিটর খুলতে ডানদিকে "সম্পাদক" ট্যাবে ক্লিক করুন।

74307cb101a3ba9d.png

এখন আমরা আমাদের প্রশ্ন চালানোর জন্য প্রস্তুত.

কোয়েরি চালান

একটি ক্লায়েন্টের অনুরোধের সাথে সবচেয়ে ঘনিষ্ঠভাবে সম্পর্কিত উপলব্ধ পণ্যগুলির একটি তালিকা পেতে একটি ক্যোয়ারী চালান৷ ভেক্টর মান পেতে আমরা যে অনুরোধটি Vertex AI-তে পাঠাতে যাচ্ছি তা শোনাচ্ছে "এখানে কী ধরনের ফলের গাছ ভাল জন্মে?"

আমাদের অনুরোধের জন্য সবচেয়ে উপযুক্ত প্রথম 10টি আইটেম বেছে নেওয়ার জন্য আপনি যে প্রশ্নটি চালাতে পারেন তা এখানে রয়েছে:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::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 10;

ক্লাউড SQL স্টুডিও এডিটরে ক্যোয়ারীটি কপি করে পেস্ট করুন এবং "RUN" বোতামটি চাপুন বা quickstart_db ডাটাবেসের সাথে সংযোগকারী আপনার কমান্ড লাইন সেশনে পেস্ট করুন।

cd07549522fd04c9.png

এবং এখানে প্রশ্নের সাথে মেলে বেছে নেওয়া পণ্যগুলির একটি তালিকা রয়েছে৷

product_name       |                                   description                                    | sale_price | zip_code |      distance       
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree             | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.43922018972266397
 Meyer Lemon Tree        | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by  |         34 |    93230 |  0.4685112926118228
 Toyon                   | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 |  0.4835677149651668
 California Lilac        | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.4947204525907498
 California Peppertree   | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 |  0.5054166905547247
 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d |     100.00 |    93230 |  0.5084219510932597
 California Sycamore     | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.5140519790508755
 Coast Live Oak          | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev |     500.00 |    93230 |  0.5143126438081371
 Fremont Cottonwood      | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i |     200.00 |    93230 |  0.5174774727252058
 Madrone                 | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.5227400803389093
(10 rows)

9. পুনরুদ্ধার করা ডেটা ব্যবহার করে এলএলএম প্রতিক্রিয়া উন্নত করুন

আমরা কার্যকর করা প্রশ্নের ফলাফল ব্যবহার করে একটি ক্লায়েন্ট অ্যাপ্লিকেশনে Gen AI LLM প্রতিক্রিয়া উন্নত করতে পারি এবং একটি Vertex AI জেনারেটিভ ফাউন্ডেশন ল্যাঙ্গুয়েজ মডেলের প্রম্পটের অংশ হিসাবে সরবরাহকৃত প্রশ্নের ফলাফলগুলি ব্যবহার করে একটি অর্থপূর্ণ আউটপুট প্রস্তুত করতে পারি।

এটি অর্জন করতে আমাদের ভেক্টর অনুসন্ধান থেকে আমাদের ফলাফলের সাথে একটি JSON তৈরি করতে হবে, তারপর একটি অর্থপূর্ণ আউটপুট তৈরি করতে Vertex AI-তে একটি LLM মডেলের জন্য একটি প্রম্পট হিসাবে সেই জেনারেট করা JSON ব্যবহার করুন। প্রথম ধাপে আমরা JSON তৈরি করি, তারপর আমরা এটিকে Vertex AI স্টুডিওতে পরীক্ষা করি এবং শেষ ধাপে আমরা এটিকে একটি SQL স্টেটমেন্টে অন্তর্ভুক্ত করি যা একটি অ্যাপ্লিকেশনে ব্যবহার করা যেতে পারে।

JSON ফর্ম্যাটে আউটপুট তৈরি করুন

JSON ফর্ম্যাটে আউটপুট তৈরি করতে ক্যোয়ারী পরিবর্তন করুন এবং Vertex AI-তে পাস করার জন্য শুধুমাত্র একটি সারি ফেরত দিন

PostgreSQL এর জন্য ক্লাউড এসকিউএল

এখানে প্রশ্নের উদাহরণ হল:

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
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

এবং এখানে আউটপুটে প্রত্যাশিত JSON:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

ভার্টেক্স এআই স্টুডিওতে প্রম্পট চালান

ভার্টেক্স এআই স্টুডিওতে জেনারেটিভ এআই টেক্সট মডেলের প্রম্পটের অংশ হিসেবে আমরা জেনারেট করা JSON ব্যবহার করতে পারি।

ক্লাউড কনসোলে ভার্টেক্স এআই স্টুডিও চ্যাট খুলুন।

449b5959fa0e93bd.png

এটি আপনাকে অতিরিক্ত API সক্ষম করতে বলতে পারে তবে আপনি অনুরোধটি উপেক্ষা করতে পারেন। আমাদের ল্যাব শেষ করার জন্য আমাদের কোনো অতিরিক্ত API-এর প্রয়োজন নেই।

আমরা যে প্রম্পটটি ব্যবহার করতে যাচ্ছি তা এখানে:

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:
[place your JSON here]
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:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
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 মানগুলির সাথে এবং gemini-2.0-ফ্ল্যাশ মডেল ব্যবহার করে প্রম্পট চালাই তখন ফলাফলটি এখানে রয়েছে:

2c5145ebc04daae1.png

এই উদাহরণে মডেল থেকে আমরা যে উত্তর পেয়েছি তা নিম্নরূপ। মনে রাখবেন যে সময়ের সাথে মডেল এবং পরামিতি পরিবর্তনের কারণে আপনার উত্তর ভিন্ন হতে পারে:

"ঠিক আছে, উপলব্ধ পণ্য তালিকার উপর ভিত্তি করে, আমাদের কাছে সবচেয়ে ভাল গাছ যা আপনার এলাকায় ভালভাবে বেড়ে উঠতে পারে তা হল চেরি গাছ।

এটির দাম $75.00।

যদিও আপনার সঠিক জিপ কোডে (93230) ক্রমবর্ধমান অবস্থার বিষয়ে আমার কাছে সুনির্দিষ্ট বিবরণ নেই, চেরি গাছগুলি সাধারণত মাঝারি জলবায়ু এবং সুনিষ্কাশিত মাটি সহ অঞ্চলগুলিতে উন্নতি করতে পরিচিত। ফল উৎপাদনের জন্য তাদের সাধারণত একটি নির্দিষ্ট সময়ের শীতকালের প্রয়োজন হয়, তাই এটি মনে রাখতে হবে। যাইহোক, তারা একটি বাগানে একটি চমৎকার সংযোজন হতে পারে, যখন পরিস্থিতি সঠিক হয় তখন সৌন্দর্য এবং সুস্বাদু চেরি উভয়ই প্রদান করে।"

PSQL এ প্রম্পট চালান

ডাটাবেসে সরাসরি SQL ব্যবহার করে একটি জেনারেটিভ মডেল থেকে অনুরূপ প্রতিক্রিয়া পেতে আমরা Vertex AI-এর সাথে Cloud SQL AI ইন্টিগ্রেশন ব্যবহার করতে পারি। কিন্তু gemini-2.0-flash-exp মডেল ব্যবহার করতে আমাদের প্রথমে এটি নিবন্ধন করতে হবে।

PostgreSQL এর জন্য ক্লাউড এসকিউএল-এ চালান

এক্সটেনশনটি 1.4.2 বা উচ্চতর সংস্করণে আপগ্রেড করুন (যদি বর্তমান সংস্করণটি কম হয়)। gcloud sql কানেক্ট থেকে quickstart_db ডাটাবেসের সাথে সংযোগ করুন যেমন এটি আগে দেখানো হয়েছে (বা ক্লাউড SQL স্টুডিও ব্যবহার করুন) এবং কার্যকর করুন:

SELECT extversion from pg_extension where extname='google_ml_integration';

যদি প্রত্যাবর্তিত মানটি 1.4.2 এর কম হয় তবে চালান:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.2';

তারপরে আমাদের google_ml_integration.enable_model_support ডাটাবেস পতাকা "চালু" সেট করতে হবে। এটি সম্পাদন করতে আপনি ওয়েব কনসোল ইন্টারফেস ব্যবহার করতে পারেন বা নিম্নলিখিত gcloud কমান্ডটি চালাতে পারেন।

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

কমান্ডটি ব্যাকগ্রাউন্ডে কার্যকর হতে প্রায় 1-3 মিনিট সময় নেয়। তারপর আপনি psql সেশনে বা quickstart_db ডাটাবেসের সাথে সংযোগকারী Cloud SQL Studio ব্যবহার করে নতুন পতাকা যাচাই করতে পারেন।

show google_ml_integration.enable_model_support;

psql সেশন থেকে প্রত্যাশিত আউটপুট "চালু":

quickstart_db => show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

তারপর আমাদের দুটি মডেল নিবন্ধন করতে হবে। প্রথমটি ইতিমধ্যে ব্যবহৃত টেক্সট-এমবেডিং-004 মডেল। যেহেতু আমরা মডেল নিবন্ধন ক্ষমতা সক্ষম করেছি তাই এটি নিবন্ধিত করা প্রয়োজন৷

পিএসকিউএল বা ক্লাউড এসকিউএল স্টুডিওতে চালানো মডেলটি নিবন্ধন করতে নিম্নলিখিত কোডটি ব্যবহার করুন:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'cloudsql_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

এবং পরবর্তী মডেলটি আমাদের নিবন্ধন করতে হবে তা হল gemini-2.0-flash-001 যা ব্যবহারকারী-বান্ধব আউটপুট তৈরি করতে ব্যবহার করা হবে।

CALL
  google_ml.create_model(
    model_id => 'gemini-2.0-flash-001',
    model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.0-flash-001:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'cloudsql_service_agent_iam');

আপনি সর্বদা google_ml.model_info_view থেকে তথ্য নির্বাচন করে নিবন্ধিত মডেলের তালিকা যাচাই করতে পারেন।

select model_id,model_type from google_ml.model_info_view;

এখানে নমুনা আউটপুট আছে

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
               model_id               |   model_type   
--------------------------------------+----------------
 textembedding-gecko                  | text_embedding
 textembedding-gecko@001              | text_embedding
 gemini-1.5-pro:streamGenerateContent | generic
 gemini-1.5-pro:generateContent       | generic
 gemini-1.0-pro:generateContent       | generic
 text-embedding-004                   | text_embedding
 gemini-2.0-flash-001                 | generic

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

psql বা ক্লাউড এসকিউএল স্টুডিও সেশনে ডাটাবেসে ক্যোয়ারী চালান

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
        (cp.embedding <=> google_ml.embedding('text-embedding-004',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        '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_agg(trees) || '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
        json_array_elements(google_ml.predict_row( model_id =>'gemini-2.0-flash-001',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

এবং এখানে প্রত্যাশিত আউটপুট. মডেল সংস্করণ এবং পরামিতিগুলির উপর নির্ভর করে আপনার আউটপুট ভিন্ন হতে পারে।

"That" "'s a great question! Based on your location (assuming you're" " in zip code 93230), I have a suggestion for a" " fruit tree that should thrive.\n\nWe have the **Cherry Tree** available.\n\n**Product Name:** Cherry Tree\n\n**Description:** This is a beautiful cherry" " tree that will produce delicious cherries. It's a deciduous tree (meaning it loses its leaves in the fall) growing to about 15 feet tall." " The leaves are dark green in summer, turning a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy.\n\n**Sale Price:** $75.00\n\n**Important Considerations for Growing" " Cherry Trees:**\n\n* **Climate:** Cherry trees prefer a cool, moist climate, and 93230 falls within a suitable range (USDA zones 4-9). However, it's always a good idea to" " check the specific microclimate of your property (sun exposure, drainage etc.).\n* **Soil:** They do best in sandy soil. If your soil is different, you may need to amend it to improve drainage.\n* **Pollination:** Many cherry varieties require a second, compatible cherry tree for proper pollination" ". Check the specific pollination needs of this variety before purchase if you want a significant cherry yield.\n\nThis cherry tree is a beautiful addition to any yard and will provide you with delicious cherries if you can meet its needs. Would you like to know more about its pollination requirements, or perhaps see if we have any other" " fruit trees suitable for your area?\n" ""

10. একটি নিকটতম-প্রতিবেশী সূচক তৈরি করুন

আমাদের ডেটাসেট বেশ ছোট এবং প্রতিক্রিয়া সময় প্রাথমিকভাবে AI মডেলগুলির সাথে মিথস্ক্রিয়াগুলির উপর নির্ভর করে। কিন্তু যখন আপনার লক্ষ লক্ষ ভেক্টর থাকে তখন ভেক্টর অনুসন্ধান আমাদের প্রতিক্রিয়া সময়ের একটি উল্লেখযোগ্য অংশ নিতে পারে এবং সিস্টেমে একটি উচ্চ লোড দিতে পারে। এটি উন্নত করতে আমরা আমাদের ভেক্টরের উপরে একটি সূচক তৈরি করতে পারি।

HNSW সূচক তৈরি করুন

আমরা আমাদের পরীক্ষার জন্য HNSW সূচক টাইপ চেষ্টা করতে যাচ্ছি। এইচএনএসডব্লিউ হল হায়াররার্কিক্যাল নেভিগেবল স্মল ওয়ার্ল্ড এবং এটি একটি মাল্টিলেয়ার গ্রাফ সূচকের প্রতিনিধিত্ব করে।

আমাদের এমবেডিং কলামের জন্য সূচক তৈরি করতে আমাদের এমবেডিং কলাম, দূরত্ব ফাংশন এবং ঐচ্ছিকভাবে m বা ef_constructions মত পরামিতিগুলিকে সংজ্ঞায়িত করতে হবে। আপনি ডকুমেন্টেশনে প্যারামিটারগুলি সম্পর্কে বিস্তারিত পড়তে পারেন।

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

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

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
CREATE INDEX
quickstart_db=>

প্রতিক্রিয়া তুলনা

এখন আমরা EXPLAIN মোডে ভেক্টর অনুসন্ধান ক্যোয়ারী চালাতে পারি এবং সূচকটি ব্যবহার করা হয়েছে কিনা তা যাচাই করতে পারি।

EXPLAIN (analyze) 
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
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

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

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
                                 Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,...
<redacted>
...,0.017593635,-0.040275685,-0.03914233,-0.018452475,0.00826032,-0.07372604
]'::vector)
                           ->  Index Scan using product_inventory_pkey on cymbal_inventory ci  (cost=0.42..7.17 rows=1 width=37) (actual time=0.104..0.104 rows=0 loops=3)
                                 Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
                                 Filter: (inventory > 0)
                                 Rows Removed by Filter: 1
                     ->  Materialize  (cost=0.28..8.31 rows=1 width=8) (actual time=0.133..0.134 rows=1 loops=1)
                           ->  Index Scan using product_stores_pkey on cymbal_stores cs  (cost=0.28..8.30 rows=1 width=8) (actual time=0.129..0.129 rows=1 loops=1)
                                 Index Cond: (store_id = 1583)
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

আউটপুট থেকে আমরা স্পষ্ট দেখতে পাচ্ছি যে প্রশ্নটি "cymbal_products_embeddings_hnsw ব্যবহার করে সূচক স্ক্যান" ব্যবহার করছে।

এবং যদি আমরা ব্যাখ্যা ছাড়াই ক্যোয়ারী চালাই:

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
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

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

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

আমরা দেখতে পাচ্ছি যে ফলাফলটি একই এবং একই চেরি গাছটি ফেরত দিতে পারি যা সূচক ছাড়াই আমাদের অনুসন্ধানে শীর্ষে ছিল। পরামিতি এবং সূচক প্রকারের উপর নির্ভর করে এটি সম্ভব যে ফলাফল সামান্য ভিন্ন হতে পারে। আমার পরীক্ষার সময় সূচীকৃত ক্যোয়ারী কোন সূচক ছাড়াই 131.301 ms বনাম 167.631 ms ফলাফল দিয়েছে কিন্তু আমরা একটি খুব ছোট ডেটাসেটের সাথে কাজ করছিলাম এবং পার্থক্যটি একটি বড় ডেটাতে আরও উল্লেখযোগ্য হবে।

আপনি ভেক্টরের জন্য উপলব্ধ বিভিন্ন সূচী এবং ডকুমেন্টেশনে উপলব্ধ ল্যাংচেইন ইন্টিগ্রেশন সহ আরও ল্যাব এবং উদাহরণ চেষ্টা করতে পারেন।

11. পরিবেশ পরিষ্কার করুন

ক্লাউড এসকিউএল ইন্সট্যান্স মুছুন

আপনি ল্যাব দিয়ে সম্পন্ন হলে ক্লাউড 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].

12. অভিনন্দন

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

আমরা কভার করেছি কি

  • PostgreSQL উদাহরণের জন্য একটি ক্লাউড এসকিউএল কীভাবে স্থাপন করবেন
  • কীভাবে ডাটাবেস তৈরি করবেন এবং ক্লাউড এসকিউএল এআই ইন্টিগ্রেশন সক্ষম করবেন
  • কিভাবে ডাটাবেসে ডাটা লোড করবেন
  • ক্লাউড এসকিউএল-এ ভার্টেক্স এআই এমবেডিং মডেল কীভাবে ব্যবহার করবেন
  • Vertex AI জেনারেটিভ মডেল ব্যবহার করে ফলাফলকে কিভাবে সমৃদ্ধ করা যায়
  • ভেক্টর সূচক ব্যবহার করে কর্মক্ষমতা কিভাবে উন্নত করা যায়

HNSW এর পরিবর্তে ScaNN সূচক সহ AlloyDB-এর জন্য অনুরূপ কোডল্যাব ব্যবহার করে দেখুন

13. সমীক্ষা

আউটপুট:

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

শুধুমাত্র এটি মাধ্যমে পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন