AlloyDB-তে প্রায় ১০০% নির্ভুল টেক্সট-টু-SQL পৌঁছানোর ছয়টি রেসিপি - কোডল্যাব

১. ভূমিকা

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

পূর্বশর্ত

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

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

  • কীভাবে একটি AlloyDB ক্লাস্টার এবং প্রাইমারি ইনস্ট্যান্স স্থাপন করবেন
  • QueryData, AI ফাংশন এবং Parameterized Secure View কীভাবে সক্রিয় করবেন
  • কিভাবে একটি QueryData কনটেক্সট সেট তৈরি করতে হয়
  • QueryData API-তে কীভাবে বিভিন্ন টেমপ্লেট এবং কনটেক্সট ব্যবহার করবেন
  • ফ্যাসেট ব্যবহার করে কীভাবে QueryData টেমপ্লেটগুলিকে আরও নমনীয় করা যায়
  • ভ্যালু সার্চ এবং ট্রাইগ্রাম ইনডেক্সিং ব্যবহার করে ডেটার অস্পষ্টতা কীভাবে সমাধান করা যায়
  • টেমপ্লেট ব্যবহার করে শব্দার্থিক অনুসন্ধানের জন্য এআই ফাংশন কীভাবে ব্যবহার করবেন
  • QueryData API-এর সাথে প্যারামিটারাইজড সিকিওর ভিউ কীভাবে ব্যবহার করবেন

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

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

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

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

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

কর্মক্ষেত্র বা শিক্ষা প্রতিষ্ঠানের অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন।

  1. একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। গুগল ক্লাউড কনসোলে একটি নতুন প্রজেক্ট তৈরি করতে, হেডারে থাকা 'Select a project' বোতামটিতে ক্লিক করুন, যা একটি পপ-আপ উইন্ডো খুলবে।

295004821bab6a87.png

'Select a project' উইন্ডোতে 'New Project'-এ ক্লিক করুন, যা নতুন প্রজেক্টের জন্য একটি ডায়ালগ বক্স খুলবে।

37d264871000675d.png

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

96d86d3d5655cdbe.png

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

বিলিং সক্ষম করুন

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট তৈরি করুন

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

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট তৈরি করতে, ক্লাউড কনসোলে বিলিং চালু করার জন্য এখানে যান ।

কিছু নোট:

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

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

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

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

ক্লাউড শেল সক্রিয় করুন

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

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

গুগল ক্লাউড শেল টার্মিনালের স্ক্রিনশট, যা দেখাচ্ছে যে পরিবেশটি সংযুক্ত হয়েছে।

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

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

এপিআই সক্ষম করুন

AlloyDB, Compute Engine, নেটওয়ার্কিং পরিষেবা এবং Agent Platform ব্যবহার করার জন্য, আপনার Google Cloud প্রজেক্টে এগুলোর নিজ নিজ API সক্রিয় করুন।

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

gcloud config get-value project

কমান্ডটি আপনার গুগল ক্লাউড প্রজেক্ট আইডি ফেরত দেবে।

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

PROJECT_ID=$(gcloud config get-value project)

প্রয়োজনীয় API-গুলো সক্রিয় করুন:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       geminidataanalytics.googleapis.com \
                       cloudaicompanion.googleapis.com \
                       aiplatform.googleapis.com \
                       dataplex.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 \
                       geminidataanalytics.googleapis.com \
                       cloudaicompanion.googleapis.com \
                       aiplatform.googleapis.com \
                       dataplex.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

আপনি ডকুমেন্টেশনে প্রতিটি সক্রিয় API সম্পর্কে পড়তে পারেন।

৪. AlloyDB স্থাপন করুন

AlloyDB ক্লাস্টার এবং প্রাইমারি ইনস্ট্যান্স তৈরি করুন। আপনি হয় একটি প্রস্তুত স্ক্রিপ্ট ব্যবহার করে এটি স্থাপন করতে পারেন, যা সমস্ত প্রয়োজনীয় রিসোর্স স্থাপন করবে, অথবা AlloyDB ডকুমেন্টেশন অনুসরণ করে ধাপে ধাপে নিজেই এটি করতে পারেন।

স্বয়ংক্রিয় স্ক্রিপ্ট ব্যবহার করে AlloyDB স্থাপন করুন

এই পদ্ধতিতে একটি স্বয়ংক্রিয় স্ক্রিপ্ট ব্যবহার করে AlloyDB ক্লাস্টারটি স্থাপন করা হয় এবং স্থাপিত রিসোর্সগুলোর সাথে কাজ শুরু করার জন্য প্রয়োজনীয় কনফিগারেশন বিবরণ সরবরাহ করা হয়।

ক্লাউড শেল টার্মিনালে, রিপোজিটরি থেকে ডিপ্লয়মেন্ট স্ক্রিপ্টটি ক্লোন করার জন্য কমান্ডটি চালান:

REPO_NAME="codelabs"
REPO_URL="https://github.com/GoogleCloudPlatform/$REPO_NAME"
SOURCE_DIR="alloydb-ai-nla"

git clone --no-checkout --filter=blob:none --depth=1 $REPO_URL

cd $REPO_NAME
git sparse-checkout set $SOURCE_DIR
git checkout
cd $SOURCE_DIR

ডিপ্লয়মেন্ট স্ক্রিপ্টটি চালান:

./deploy_alloydb.sh

স্ক্রিপ্টটি সম্পন্ন হতে পাঁচ থেকে সাত মিনিট সময় লাগে। আউটপুটে আপনার ক্লাস্টার ডেপ্লয়মেন্টের বিবরণ প্রদর্শিত হবে। অনুগ্রহ করে মনে রাখবেন, আপনার পাসওয়ার্ডটি ভিন্ন হবে — ভবিষ্যতের ব্যবহারের জন্য পাসওয়ার্ডটি লিখে রাখুন ।

...
<redacted>
...
Creating primary instance: alloydb-aip-01-pr (8 vCPUs for TRIAL cluster)
Operation ID: operation-1765988049916-646282264938a-bddce198-9f248715
Creating instance...done.                                                                                                                                                                                                             
----------------------------------------
Deployment Process Completed
Cluster:  alloydb-aip-01 (TRIAL)
Instance: alloydb-aip-01-pr
Region:   us-central1
Initial Password: JBBoDTgixzYwYpkF (if new cluster)
----------------------------------------
 

Google Cloud কনসোলের AlloyDB ক্লাস্টার পৃষ্ঠায় আপনার নতুন ক্লাস্টার এবং ইনস্ট্যান্স দেখুন।

4271eb55bcc9ec84.png

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

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

AlloyDB-কে প্রয়োজনীয় অনুমতি প্রদান করুন

AlloyDB সার্ভিস এজেন্টকে প্রয়োজনীয় IAM রোলগুলো প্রদান করুন:

অ্যাড (+) এ ক্লিক করে একটি নতুন ক্লাউড শেল ট্যাব খুলুন।

abc505ac4d41f24e.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
 

ডেটা অ্যাক্সেস এপিআই সক্ষম করুন

আপনার AlloyDB ক্লাস্টারে ডেটা অ্যাক্সেস এপিআই (Data Access API) সক্রিয় করুন।

একই টার্মিনাল ট্যাবে, নিম্নলিখিত কমান্ডটি চালান:

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
curl -X PATCH \
 -H "Authorization: Bearer $(gcloud auth print-access-token)" \
 -H "Content-Type: application/json" \
 https://alloydb.googleapis.com/v1alpha/projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER/instances/$ADBCLUSTER-pr?updateMask=dataApiAccess \
 -d '{
   "dataApiAccess": "ENABLED",
 }'

ডাটাবেস ফ্ল্যাগ আপডেট করুন

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

6284731b8eff74c.jpeg

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

  • alloydb.iam_authentication
  • পাসওয়ার্ড.এনফোর্স_কমপ্লেক্সিটি
  • google_ml_integration.enable_ai_query_engine
  • প্যারামিটারাইজড_ভিউ

একই টার্মিনাল ট্যাবে, নিম্নলিখিত কমান্ডগুলো চালান:

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
   --database-flags password.enforce_complexity=on,alloydb.iam_authentication=on,google_ml_integration.enable_ai_query_engine=on,parameterized_views.enabled=on \
   --region=$REGION \
   --cluster=$ADBCLUSTER \
   --project=$PROJECT_ID \
   --update-mode=FORCE_APPLY

আপনার অ্যাকাউন্টের জন্য একটি AlloyDB IAM ব্যবহারকারী তৈরি করুন:

REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud alloydb users create $(gcloud config get-value account) \
--cluster=$ADBCLUSTER \
--superuser=true \
--region=$REGION \
--type=IAM_BASED

টার্মিনালে exit কমান্ডটি চালিয়ে ট্যাবটি বন্ধ করুন:

exit

AlloyDB Studio-এর সাথে সংযোগ করুন

পরবর্তী অধ্যায়গুলোতে, আপনি AlloyDB Studio-তে ডাটাবেস সংযোগের প্রয়োজন হয় এমন সমস্ত SQL কমান্ড চালাতে পারবেন।

AlloyDB Studio খোলার জন্য, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. Google Cloud কনসোলে, AlloyDB for PostgreSQL-এর ক্লাস্টার পৃষ্ঠায় যান।
  2. এর ওয়েব ইন্টারফেসটি খুলতে আপনার প্রাথমিক ইনস্ট্যান্সটি নির্বাচন করুন।

1d7298e7096e7313.png

  1. তারপর বাম দিকে AlloyDB Studio-তে ক্লিক করুন:

a33131c72ad29478.png

  1. postgres ডাটাবেসটি নির্বাচন করুন, IAM Authentication বেছে নিন এবং Authenticate-এ ক্লিক করুন।

8ddfb250344ca749.jpeg

এই কাজটি AlloyDB Studio ইন্টারফেসটি খোলে।

  1. SQL এডিটর খোলার জন্য Untitled Query ট্যাবটি নির্বাচন করুন।

6696bc771fab9983.png

এটি একটি এডিটর খোলে যেখানে আপনি SQL কমান্ড চালাতে পারবেন, যেমনটি নিচের ছবিতে দেখানো হয়েছে:

ae34288e5bf237c7.png

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

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

AlloyDB Studio এডিটরে, ডাটাবেস তৈরি করতে নিম্নলিখিত কমান্ডটি চালান:

CREATE DATABASE quickstart_db

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

Statement executed successfully

quickstart_db-এর সাথে সংযোগ করুন

AlloyDB Studio-তে Change database/user-এ ক্লিক করুন।

6f5c98f5d0b3d550.png

ডাটাবেস তালিকা থেকে quickstart_db নির্বাচন করুন, IAM Authentication নির্বাচন করুন এবং প্রমাণীকরণ করুন।

a1940c26c36ff840.jpeg

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

এক্সটেনশনগুলি সক্ষম করুন

আপনার ডাটাবেসে সমস্ত প্রয়োজনীয় এক্সটেনশন সক্রিয় আছে এবং সেগুলোর সঠিক ন্যূনতম সংস্করণ রয়েছে কিনা তা যাচাই করতে পরীক্ষা করুন।

আপনার ডাটাবেসে সমস্ত প্রয়োজনীয় এক্সটেনশন আছে কিনা তা যাচাই করুন:

SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector', 'google_ml_integration', 'parameterized_views');

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

        extname        |   extversion   
-----------------------+----------------
 google_ml_integration | 1.5.9
 parameterized_views   | 1.0
 vector                | 0.8.2.google-1

যদি এটি উপরের সমস্ত সারিগুলি ফেরত না দেয়, তার মানে হল কিছু এক্সটেনশন সক্রিয় করা নেই।

এক্সটেনশনগুলি সক্রিয় করার আগে আমাদের নিশ্চিত করতে হবে যে ইনস্ট্যান্সটিতে "google_ml_integration.enable_ai_query_engine" এবং "parameterized_views.enabled" এই সমস্ত ডাটাবেস ফ্ল্যাগগুলি সক্রিয় করা আছে।

AlloyDB Studio-তে quickstart_db-এর সাথে সংযুক্ত থাকা অবস্থায় নিম্নলিখিত কমান্ডটি চালান:

show google_ml_integration.enable_ai_query_engine;
show parameterized_views.enabled;

যদি সেগুলোর কোনোটি "অফ" দেখায়, তাহলে "আপডেট ডেটাবেস ফ্ল্যাগস" ধাপটি পুনরায় করার চেষ্টা করুন এবং আবার "show..." কমান্ড ব্যবহার করে স্ট্যাটাস পরীক্ষা করুন।

প্রয়োজনীয় এক্সটেনশনগুলো সক্রিয় করুন।

AlloyDB Studio-তে quickstart_db-এর সাথে সংযুক্ত থাকা অবস্থায় নিম্নলিখিত কমান্ডটি চালান:

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS parameterized_views;

parameterized_views এবং google_ml-এর এক্সটেনশন সংস্করণগুলো যাচাই করুন।

AlloyDB Studio-তে quickstart_db-এর সাথে সংযুক্ত থাকা অবস্থায় নিম্নলিখিত কমান্ডটি চালান:

SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector', 'google_ml_integration', 'parameterized_views');

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

        extname        |   extversion   
-----------------------+----------------
 google_ml_integration | 1.5.9
 parameterized_views   | 1.0
 vector                | 0.8.2.google-1

সংস্করণটি প্রয়োজনীয় সংস্করণের চেয়ে কম হলে parameterized_views এক্সটেনশনটি আপডেট করার চেষ্টা করুন।

প্যারামিটারাইজড ভিউগুলির জন্য চেষ্টা করুন:

ALTER EXTENSION parameterized_views UPDATE;

সংস্করণটি পুনরায় যাচাই করুন।

AlloyDB Studio-তে quickstart_db-এর সাথে সংযুক্ত থাকা অবস্থায় নিম্নলিখিত কমান্ডটি চালান:

SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector', 'google_ml_integration', 'parameterized_views');

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

        extname        |   extversion   
-----------------------+----------------
 google_ml_integration | 1.5.9
 parameterized_views   | 1.0
 vector                | 0.8.2.google-1

৬. নমুনা তথ্য

এখন আপনাকে ডাটাবেসে অবজেক্ট তৈরি করতে হবে এবং ডেটা লোড করতে হবে। আপনি একটি কাল্পনিক রিয়েল এস্টেট কোম্পানির ডেটাসেট ব্যবহার করতে যাচ্ছেন। এতে সম্পত্তি বিক্রয় এবং এজেন্টদের সম্পর্কে কাল্পনিক ডেটা রয়েছে। ক্লোন করা রিপোজিটরিতে real_estate_data.sql নামক SQL স্ক্রিপ্টে ডেটাটি সরবরাহ করা হয়েছে।

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

আপনার ক্লোন করা রিপোজিটরি থেকে AlloyDB ডেটাবেসে ডেটা ইম্পোর্ট করতে Google SDK (gcloud) ব্যবহার করুন। এর জন্য আপনাকে একটি ক্লাউড স্টোরেজ বাকেট তৈরি করতে হবে এবং AlloyDB সার্ভিস অ্যাকাউন্টকে অ্যাক্সেস দিতে হবে। বিকল্পভাবে, ডকুমেন্টেশনে বর্ণিত পদ্ধতি অনুযায়ী আপনি ওয়েব কনসোল ব্যবহার করেও এটি করার চেষ্টা করতে পারেন।

গুগল ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
gcloud storage buckets create gs://$PROJECT_ID-import --project=$PROJECT_ID --location=$REGION
gcloud storage buckets add-iam-policy-binding gs://$PROJECT_ID-import --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" --role=roles/storage.objectViewer

ডেটা লোড করুন

ডাটাবেস SQL ডাম্পটি ক্লোন করা রিপোজিটরি ফোল্ডারে অবস্থিত। নিম্নলিখিত কমান্ডটি ধরে নেয় যে, পূর্ববর্তী ধাপে AlloyDB ক্লাস্টার তৈরি করার সময় আপনি রিপোজিটরিটি ক্লোন করতে আপনার হোম ডিরেক্টরিকে প্রারম্ভিক বিন্দু হিসেবে ব্যবহার করেছেন।

ডাটাবেস ডাম্প ফাইলটি আপনার ক্লাউড স্টোরেজ বাকেটে কপি করুন:

REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR
gcloud storage cp ~/$REPO_NAME/$SOURCE_DIR/real_estate_data.sql  gs://$PROJECT_ID-import

quickstart_db-তে ডেটাসেটটি ইম্পোর্ট করুন:

PROJECT_ID=$(gcloud config get-value project)
CLUSTER_NAME=alloydb-aip-01
REGION=us-central1
IAM_USER=$(gcloud config get-value account)
gcloud alloydb clusters import $CLUSTER_NAME  --region=us-central1 --database=quickstart_db --gcs-uri=gs://$PROJECT_ID-import/real_estate_data.sql --project=$PROJECT_ID --sql --user=$IAM_USER

এই কমান্ডটি স্যাম্পল ডেটাসেটটিকে quickstart_db ডাটাবেসে লোড করবে।

AlloyDB Studio ব্যবহার করে real_estate.agents টেবিলের রেকর্ড সংখ্যা গণনা করে ইম্পোর্টটি যাচাই করুন:

SELECT COUNT(*) FROM real_estate.agents;

৭. স্কিমা অনটোলজি প্রস্তুত করুন

আপনার QueryData কনটেক্সট সেট তৈরি করুন, স্কিমা মেটাডেটা সরবরাহ করুন এবং ADK এজেন্ট চালান।

মেটাডেটা তৈরি করুন

মেটাডেটা হলো ডাটাবেস টেবিল এবং কলামে প্রয়োগ করা SQL মন্তব্যসমূহ। এই মন্তব্যগুলো ডাটাবেস অবজেক্ট নির্বাচন করার সময় QueryData ইঞ্জিনকে নির্দেশনা প্রদান করে।

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

এখানে real_estate স্কিমাতে প্রয়োগ করা মেটাডেটার একটি উদাহরণ কোড দেওয়া হলো:

COMMENT ON TABLE real_estate.agents IS 'Stores profile, contact, brokerage affiliation, and active status for individual real estate agents.';

COMMENT ON COLUMN real_estate.agents.agent_id IS 'Primary key uniquely identifying each real estate agent in the database.';

...

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

স্কিমা অনটোলজি কনটেক্সট তৈরি করুন

একটি কনটেক্সট সেটে কোয়েরি টেমপ্লেট, ফেসেট এবং ভ্যালু সার্চ থাকে, যা এআই মডেলকে কোয়েরি তৈরি করতে সহায়তা করে। কনটেক্সট সেট ছাড়া একটি এআই এজেন্ট public স্কিমা থেকে শুধুমাত্র উপলব্ধ তথ্য ব্যবহার করে কোয়েরি তৈরি করার চেষ্টা করবে; মূলত টেবিলের নাম, কলাম এবং মেটাডেটার উপর ভিত্তি করে একটি স্বাভাবিক কোয়েরি অনুরোধের উত্তর দেওয়ার জন্য সঠিক অবজেক্টগুলো অনুমান করার চেষ্টা করবে।

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

ওয়েব কনসোলে সেট করা কোয়েরি ডেটা কনটেক্সট লোড করুন

একটি কনটেক্সট সেট লোড করতে, AlloyDB Studio খুলুন এবং বাম প্যানেলের নীচে আপনি Context sets এবং তিনটি ডট দেখতে পাবেন।

d3578ceee65cd0dd.jpeg

ওই তিনটি ডটে ক্লিক করুন এবং Create context set বেছে নিন।

খোলা ডায়ালগ বক্সে নিম্নলিখিত মানগুলি দিন:

  • নাম: sixrecipes
  • বিবরণ: Real Estate Query Data
  • প্রসঙ্গ ফাইল আপলোড করুন: এটি খালি রাখুন

আপনি যদি প্রথমবারের মতো Create বোতামটি চাপেন, তাহলে কনটেক্সট স্টোরেজ ইনিশিয়ালাইজ হতে কিছুটা সময় লাগতে পারে।

কন্টেক্সট সেটের নামের ডানদিকে থাকা তিনটি ডটে আবার ক্লিক করে QueryData কন্টেক্সট সেট আইডিটি যাচাই করুন এবং Edit context set নির্বাচন করুন।

6739fb9f54d7f79d.jpeg

ডানদিকে খোলা ট্যাবের শীর্ষে কনটেক্সট সেট আইডিটি দেখা যায়।

746b38c52a70bb3c.jpeg

পরবর্তী ধাপগুলোর জন্য এই আইডিটি সংরক্ষণ করুন।

এআই এজেন্ট শুরু করুন

কোয়েরি তৈরি ও কার্যকর করার জন্য QueryData ব্যাকএন্ডের সাথে যোগাযোগ করতে আপনি AlloyDB Studio ইন্টারফেস ব্যবহার করতে পারেন, যেমনটি ডকুমেন্টেশনে বর্ণনা করা আছে। কিন্তু এই ল্যাবে আপনি ডেটাবেসের সাথে যোগাযোগের প্রধান মাধ্যম হিসেবে একটি এআই এজেন্ট ব্যবহার করবেন। এআই এজেন্টগুলো ভবিষ্যতের ওয়ার্কলোডের জন্য একটি অধিক বাস্তবসম্মত পরিস্থিতি এবং Google ADK ফ্রেমওয়ার্ক একটি চমৎকার ওয়েব ইন্টারফেস প্রদান করে, যেখানে আপনি মডেল, এপিআই এবং অ্যাপ্লিকেশনগুলোর মধ্যকার সমস্ত ধাপ ও মিথস্ক্রিয়া দেখতে পারেন।

ক্লাউড শেলে এজেন্ট সোর্স কনফিগারেশন পর্যালোচনা করুন:

REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR/data_agent
edit agent.py

ফাইলটিতে আপনি দেখতে পাবেন, আমরা আমাদের স্কিমাতে টেবিলের তালিকাটি কোথায় নির্ধারণ করেছি। আমরা ভবিষ্যতের কোনো এক ধাপে সে বিষয়ে আবার ফিরে আসব।

# List of database tables included in QueryData API requests
TABLE_IDS = [
    "real_estate.municipalities",
    "real_estate.cities",
    "real_estate.agents",
    "real_estate.properties",
    "real_estate.schools",
    "real_estate.school_to_property",
    "real_estate.property_transactions",
    "real_estate.secure_offers",
]

এবং QueryData API নিয়ে কাজ করার জন্য call_querydata_api একটি প্রসিডিউর রয়েছে, সাথে QueryData API দক্ষতা নিয়ে কাজ করার জন্য একটি টুলসেটও আছে।

def call_querydata_api(
    prompt: str,
    target_project_id: str = project_id,
    target_location: str = location,
    target_cluster_id: str = cluster_name,
    target_instance_id: str = instance_name,
    target_database_id: str = database_name,
    target_context_set_id: str = context_set_id,
    target_table_ids: list[str] = TABLE_IDS,
) -> dict:
    """Calls the Gemini Data Analytics QueryData API to translate natural ...
<Redacted>
...

# ADK File-Based Skill

database_query_skill = load_skill_from_dir(
    pathlib.Path(__file__).parent / "skills" / "database-query-skill"
)

skill_toolset = SkillToolset(
    skills=[database_query_skill]
)

এই হলো প্রম্পট এবং উপলব্ধ টুলগুলোসহ মূল এজেন্টটি।

# Agent configuration

root_agent = Agent(
    model=MODEL_ID,
    name='root_agent',
    description='A helpful assistant for analyst requests.',
    instruction=f"""
    Answer user questions to the best of your knowledge using provided tools.
    Do not try to generate non-existent data but use the grounded data from the database.
    When you answer questions about database contents, real estate properties, or sales activity:
    1. Refer to database-query-skill for instructions on querying data using QueryData API.
    2. Use `call_querydata_api` to submit the natural language prompt to the QueryData API.
       CRITICAL: Call `call_querydata_api` EXACTLY ONCE per user request. Do NOT make retries, follow-up calls, or rephrased calls to `call_querydata_api`, even if the result contains zero rows or empty data.
    3. Immediately parse the JSON response from that first `call_querydata_api` call.
    4. Format your final response to the user containing:
       - The generated SQL query (formatted in a Markdown SQL code block).
       - The query results formatted as a Markdown table (constructed from `queryResult.columns` and `queryResult.rows`).
       - The natural language answer (`naturalLanguageAnswer`).
    """,
    tools=[call_querydata_api, skill_toolset],
)

এজেন্টের সিস্টেম নির্দেশাবলী বোঝার জন্য data_agent/SKILL.md পর্যালোচনা করুন:

REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR/data_agent
edit SKILL.md

এজেন্ট শুরু করার আগে আপনাকে Agent এবং QueryData API অনুরোধের প্যারামিটারসহ একটি .env ফাইল প্রস্তুত করতে হবে।

আপনার কনটেক্সট সেট আইডি একটি এনভায়রনমেন্ট ভেরিয়েবলে এক্সপোর্ট করুন:

export QUERYDATA_CONTEXTSET=<context set id from the Create Context Set chapter>

data_agent ডিরেক্টরিতে আপনার রানটাইম এনভায়রনমেন্ট কনফিগারেশন ফাইল (.env) তৈরি করুন:

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR/data_agent
echo "GOOGLE_GENAI_USE_ENTERPRISE=true" > .env
echo "GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project -q)" >> .env
echo "GOOGLE_CLOUD_LOCATION=global" >> .env
echo "QUERYDATA_CONTEXTSET=$QUERYDATA_CONTEXTSET" >> .env
echo "ALLOYDB_CLUSTER=alloydb-aip-01" >> .env
echo "ALLOYDB_INSTANCE=alloydb-aip-01-pr" >> .env
echo "ALLOYDB_DATABASE=quickstart_db" >> .env
echo "ALLOYDB_LOCATION=$REGION" >> .env

নির্ভরতাগুলি ইনস্টল করুন এবং এজেন্ট ওয়েব পরিষেবাটি চালু করুন:

cd ~/$REPO_NAME/$SOURCE_DIR/
uv sync

এজেন্ট চালু করুন:

uv run adk web --allow_origins 'regex:https://.*\.cloudshell\.dev'

http://127.0.0.1:8000 এন্ডপয়েন্টটি ব্যবহার করলে আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন।

INFO:     Started server process [83608]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://127.0.0.1:8000.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

4aa60270e31efe37.jpeg

এজেন্ট ইন্টারফেস চালু করতে ক্লাউড শেলে তৈরি করা ওয়েব সার্ভার ইউআরএল-এ (যেমন, http://127.0.0.1:8000) ক্লিক করুন। যদি এটি কাজ না করে, তবে ক্লাউড শেলে এজেন্ট ইন্টারফেসটি খুলতে ওয়েব প্রিভিউ -> পোর্ট ৮০০০-এ প্রিভিউ-তে ক্লিক করুন।

উপরের বাম দিকের ড্রপডাউনে data_agent নির্বাচিত আছে কিনা তা যাচাই করুন।

ad695db289666da3.jpeg

কোয়েরি তৈরি এবং চালানো

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

কাস্টম টেমপ্লেট বা ফেসেট ছাড়া বেস QueryData-এর পারফরম্যান্স মূল্যায়ন করতে এজেন্ট চ্যাট ইন্টারফেসে এই স্বাভাবিক ভাষার প্রম্পটটি চালান:

How many properties are currently for sale in San Diego?

এবং অ্যারো বাটনটি চাপুন।

77773a81de6360a2.jpeg

এটি উপযুক্ত দক্ষতাটি খুঁজে বের করে এজেন্ট ওয়ার্কফ্লো শুরু করবে এবং সেই দক্ষতা ও ফাংশন ব্যবহার করে এপিআই এন্ডপয়েন্টে অনুরোধ পাঠাবে ও তৈরি করা কোয়েরি এবং ফলাফল ফেরত আনবে।

de9b3e4854b9a506.jpeg

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

605dcf936ba38cb8.jpeg

একটি ফলো-আপ প্রশ্ন জমা দিন (প্রশ্ন ২):

List agents who sold a property for over $1000000.

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

তৈরি হওয়া SQL স্টেটমেন্টটি দেখতে এইরকম:

SELECT DISTINCT "a"."agent_id", "a"."firstname", "a"."lastname", "a"."email", "a"."brokerage" 
FROM "real_estate"."agents" AS "a" 
INNER JOIN "real_estate"."property_transactions" AS "t" ON "a"."agent_id" = "t"."seller_agent_id" 
WHERE "t"."sale_price" > 1000000 AND "a"."agent_id" IS NOT NULL 
ORDER BY "a"."lastname" ASC NULLS LAST;

অন্য একটি কোয়েরি চেষ্টা করুন (প্রশ্ন ৩):

What is the average price of a single-family home with a garage in San Diego?

QueryData একটি খালি কনটেক্সট সেট করে সাধারণ কোয়েরি তৈরি করে, কিন্তু ব্যবসায়িক কাজের জন্য প্রায়শই নির্দিষ্ট ব্যবসায়িক যুক্তি এবং সুনির্দিষ্ট আচরণের প্রয়োজন হয়।

৮. ব্যাখ্যার সংযোজনের মাধ্যমে উচ্চ নির্ভুলতা এবং ব্যবসায়িক প্রাসঙ্গিকতা অর্জন করুন

প্রম্পটগুলিতে ব্যাখ্যা অন্তর্ভুক্ত করার মাধ্যমে নিশ্চিত করা হয় যে তৈরি হওয়া কোয়েরিগুলো নির্দিষ্ট ব্যবসায়িক যুক্তির সাথে মেলে।

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

এজেন্টে নিম্নলিখিত স্বাভাবিক ভাষার নির্দেশটি (প্রশ্ন ৪) ব্যবহার করে দেখুন।

Single level Del Mar houses

ইঞ্জিনটি একটি সাধারণ কোয়েরি ফেরত দেয়, কিন্তু এতে কিছু অতিরিক্ত শর্তও অন্তর্ভুক্ত থাকতে পারে, যেমন is_single_family = TRUE :

SELECT p."property_id", p."address_street", p."price", p."bedrooms", p."bathrooms", p."listing_status", p."is_single_family", p."num_stories", c."city_name" 
FROM "real_estate"."properties" AS p 
JOIN "real_estate"."cities" AS c ON p."city_id" = c."city_id" 
WHERE c."city_name" ILIKE 'Del Mar' AND p."num_stories" = 1 AND p."is_single_family" = TRUE 
ORDER BY p."property_id" ASC NULLS LAST;

ফলাফল হিসেবে আমরা একটি ফেরত সারি পাই:

Natural Language Answer
The database contains one single-level, single-family house in Del Mar:

Address: 999 Main Ave (Postal Code: 90024)
Price: $3,800,000.00
Bedrooms: 4
Bathrooms: 3.5
Listing Status: Active
Features: Single-family home (1 story), has a garage, and no condo fees.

অন্য একটি প্রম্পট পরীক্ষা করুন (প্রশ্ন ৫):

Del Mar houses close to good schools

এটি প্রপার্টিগুলো সাজানোর জন্য proximity_miles এবং school_ranking কলামগুলো ব্যবহার করার মতো যথেষ্ট স্মার্ট, কিন্তু প্রতিটি মেট্রিকের ওজন এবং গুরুত্ব মূল্যায়ন করে না।

SELECT "p"."property_id", "p"."address_street", "p"."price", "p"."bedrooms", "p"."bathrooms", "s"."school_name", "s"."school_ranking", "sp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
INNER JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
INNER JOIN "real_estate"."school_to_property" AS "sp" ON "p"."property_id" = "sp"."property_id" 
INNER JOIN "real_estate"."schools" AS "s" ON "sp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' AND "sp"."proximity_miles" IS NOT NULL AND "s"."school_ranking" IS NOT NULL 
ORDER BY "sp"."proximity_miles" ASC NULLS LAST, "s"."school_ranking" ASC NULLS LAST;

উদাহরণ কোয়েরিকে একটি টেমপ্লেটে সাধারণীকরণ করুন

ব্যবসায়িক যুক্তির জন্য প্রয়োজন:

  • ২ মাইলের মধ্যে
  • স্কুলের র‍্যাঙ্কিং ৫ বা তার কম
  • ভারযুক্ত ক্রমবিন্যাস: ৮০% শিক্ষা প্রতিষ্ঠানের র‍্যাঙ্কিং + ২০% নৈকট্য (স্কোর = ০.৮ * শিক্ষা প্রতিষ্ঠানের র‍্যাঙ্কিং + ০.২ * নৈকট্যের দূরত্ব)

ওয়েটেড র‍্যাঙ্কিং ফর্মুলাটি হলো:

‬‭‬‭‬‭‬‭‬Score = 0.8 * school_ranking + 0.2 * proximity_miles

Cloud Shell-এর কমান্ড-লাইন ইন্টারফেস ব্যবহার করে sixrecipe_context1_1.json কনটেক্সট ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context1_1.json

অথবা ক্লাউড শেল মেনু থেকে Download মেনু আইটেমটি ব্যবহার করে:

c0d781806d966dcb.jpeg

এই স্ট্যান্ডার্ড কাঠামোটি নির্ধারণ করতে AlloyDB Studio ব্যবহার করে আপনার sixrecipe context set-এ sixrecipe_context1_1.json ফাইলটি আপলোড করুন। sixrecipes context-এর ডানদিকে থাকা তিনটি ডটে ক্লিক করুন এবং নতুন ফাইলটি আপলোড করতে "Edit context set" ব্যবহার করুন। এটি কার্যকরভাবে পুরানো খালি context-টিকে নতুনটি দিয়ে প্রতিস্থাপন করবে।

টেমপ্লেটটি ভালো স্কুল নৈকট্য নিয়মের জন্য সুস্পষ্ট SQL টেমপ্লেট নিয়ম সংজ্ঞায়িত করে:

{
  "facets": [],
  "templates": [
    {
      "nl_query": "Riverside houses close to good schools.",
      "sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\", \"s\".\"school_name\", \"stp\".\"proximity_miles\" FROM \"real_estate\".\"properties\" AS \"p\" JOIN \"real_estate\".\"cities\" AS \"c\" ON \"p\".\"city_id\" = \"c\".\"city_id\" JOIN \"real_estate\".\"school_to_property\" AS \"stp\" ON \"p\".\"property_id\" = \"stp\".\"property_id\" JOIN \"real_estate\".\"schools\" AS \"s\" ON \"stp\".\"school_id\" = \"s\".\"school_id\" WHERE \"c\".\"city_name\" = 'Riverside' AND \"s\".\"school_ranking\" <= 5 AND \"stp\".\"proximity_miles\" <= 2 ORDER BY 0.8 * \"s\".\"school_ranking\" + 0.2 * \"stp\".\"proximity_miles\"",
      "intent": "Houses in Riverside close to good schools (within 2 miles of schools with a rank of at least 5).",
      "manifest": "A given city houses close to good schools.",
      "parameterized": {
        "parameterized_intent": "Houses in $1 close to good schools (within 2 miles of schools with a rank of at least 5).",
        "parameterized_sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\", \"s\".\"school_name\", \"stp\".\"proximity_miles\" FROM \"real_estate\".\"properties\" AS \"p\" JOIN \"real_estate\".\"cities\" AS \"c\" ON \"p\".\"city_id\" = \"c\".\"city_id\" JOIN \"real_estate\".\"school_to_property\" AS \"stp\" ON \"p\".\"property_id\" = \"stp\".\"property_id\" JOIN \"real_estate\".\"schools\" AS \"s\" ON \"stp\".\"school_id\" = \"s\".\"school_id\" WHERE \"c\".\"city_name\" = $1 AND \"s\".\"school_ranking\" <= 5 AND \"stp\".\"proximity_miles\" <= 2 ORDER BY 0.8 * \"s\".\"school_ranking\" + 0.2 * \"stp\".\"proximity_miles\""
      }
    }
  ]
}

প্রম্পটটি পুনরায় চালান:

Del Mar houses close to good schools

ফলস্বরূপ কোয়েরিটি এখন টেমপ্লেটে সংজ্ঞায়িত ব্যবসায়িক যুক্তির সাথে মিলে যায়:

SELECT "p"."address_street", "p"."address_postal_code", "s"."school_name", "stp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
JOIN "real_estate"."school_to_property" AS "stp" ON "p"."property_id" = "stp"."property_id" 
JOIN "real_estate"."schools" AS "s" ON "stp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' AND "s"."school_ranking" <= 5 AND "stp"."proximity_miles" <= 2 
ORDER BY 0.8 * "s"."school_ranking" + 0.2 * "stp"."proximity_miles"

উৎপাদিত SQL স্টেটমেন্টের সাথে নিম্নলিখিত ইনটেন্টটি উৎপাদিত হয়:

intentExplanation: "Houses in Del Mar close to good schools (within 2 miles of schools with a rank of at least 5)."

আপনি ADK ওয়েব ইন্টারফেসের বাম প্যানে অভিপ্রায়টি দেখতে পারেন, যেমনটি এখানে দেখানো হয়েছে:

bfb9d6bc718f57cf.jpeg

ফলাফলে আমাদের স্কোর অনুসারে সাজানো দুটি বৈশিষ্ট্য দেখানো হয়েছে:

Query Results
address_street        address_postal_code        school_name        proximity_miles
200 Coast Blvd        92014        Del Mar Heights Elementary        0.50
100 Del Mar Heights Rd        92014        Del Mar Heights Elementary        1.00
Answer
Based on the data, here are the properties in Del Mar located within 2 miles of a top-rated school (ranking of 5 or better):

200 Coast Blvd (92014)

School: Del Mar Heights Elementary
Proximity: 0.50 miles
100 Del Mar Heights Rd (92014)

School: Del Mar Heights Elementary
Proximity: 1.00 miles

পরবর্তী অধ্যায়ে আপনি টেমপ্লেটটির পরিধি প্রসারিত করবেন।

একাধিক প্রশ্ন সংগ্রহ ও ব্যাখ্যা করার মাধ্যমে ব্যাখ্যা অন্তর্ভুক্ত করুন

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

আপডেট করা কনটেক্সট ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context1_2.json

আপডেট করা sixrecipe_context1_2.json ফাইলটি আপনার কনটেক্সট সেটে আপলোড করুন।

নতুন কনটেক্সট সেট ফাইলে আমরা আমাদের ম্যানিফেস্টটি: "manifest": "A given city houses close to good schools." থেকে পরিবর্তন করে: "manifest": "A given city houses close to good schools, or are great for families with kids." করছি। এটি এই টেমপ্লেটটির ব্যবহারের সুযোগকে শুধু একটি ক্ষেত্রের বাইরেও প্রসারিত করে।

এই প্রশ্নটি জমা দিন (প্রশ্ন ৬):

Houses in Waterloo great for families with kids.

এজেন্টটি আপনার প্রমিত কোয়েরি লজিক প্রয়োগ করার জন্য আপডেট করা টেমপ্লেট ম্যানিফেস্ট ব্যবহার করে, যা উপরের মতো একই কোয়েরি ফেরত দেয়, যার উদ্দেশ্য হলো:

intentExplanation
:
"Houses in Waterloo close to good schools (within 2 miles of schools with a rank of at least 5)."

৯. নমনীয়তা বজায় রেখে উচ্চ নির্ভুলতা অর্জনের জন্য ফেসেটেড টেমপ্লেট ব্যবহার করুন।

ফ্যাসেট হলো মডিউলার SQL কন্ডিশন যা টেমপ্লেটের সাথে ডায়নামিকভাবে একত্রিত করা হয়, যাতে প্রতিটি বিন্যাসের জন্য আলাদা টেমপ্লেট তৈরি না করেই কোয়ালিফায়ার (যেমন 'স্টার্টার ফ্যামিলি', 'ওশান ভিউ') পরিচালনা করা যায়।

প্রতিটি কোয়েরি বা শর্তের জন্য টেমপ্লেট তৈরি করার পরিবর্তে, আমরা ফ্র্যাগমেন্ট প্রস্তুত করতে পারি যা বিদ্যমান টেমপ্লেটগুলিতে প্রয়োগ করে কোয়েরিতে নতুন মাত্রা যোগ করা যায়।

নিম্নলিখিত অ্যাট্রিবিউট সহ প্রপার্টিগুলোর জন্য একটি ফেসেট সংজ্ঞায়িত করুন:

  • একটি একক-পরিবারের বাড়ি
  • একটি সক্রিয় তালিকাভুক্তির অবস্থা
  • তিন থেকে চারটি শোবার ঘর এবং কমপক্ষে দুটি বাথরুম
  • এমন একটি পৌরসভায় অবস্থান যেখানে প্রতি ১,০০,০০০ বাসিন্দার মধ্যে অপরাধের হার ৫০০-এর কম।

ফ্যাসেটেড কনটেক্সট ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context2_1.json

ফ্যাসেটগুলো কনফিগার করতে AlloyDB Studio-তে আপনার sixrecipes কনটেক্সট সেটে sixrecipe_context2_1.json ফাইলটি আপলোড করুন।

  "facets": [
    {
      "sql_snippet": "real_estate.properties.is_single_family = TRUE AND real_estate.properties.listing_status = 'Active' AND real_estate.properties.bedrooms BETWEEN 3 AND 4 AND real_estate.properties.bathrooms >= 2.0 AND 500 > (SELECT m.crime_rate_per_100k FROM real_estate.cities c JOIN real_estate.municipalities m ON c.municipality_id = m.municipality_id AND c.city_id = real_estate.properties.city_id)",
      "intent": "for a starter family (active single-family home listings with 3 to 4 bedrooms, 2+ bathrooms, and a crime rate under 500 per 100,000 residents)",
      "manifest": "for a starter family",
      "parameterized": {
        "parameterized_intent": "for a starter family (active single-family home listings with 3 to 4 bedrooms, 2+ bathrooms, and a crime rate under 500 per 100,000 residents)",
        "parameterized_sql_snippet": "real_estate.properties.is_single_family = TRUE AND real_estate.properties.listing_status = 'Active' AND real_estate.properties.bedrooms BETWEEN 3 AND 4 AND real_estate.properties.bathrooms >= 2.0 AND 500 > (SELECT m.crime_rate_per_100k FROM real_estate.cities c JOIN real_estate.municipalities m ON c.municipality_id = m.municipality_id AND c.city_id = real_estate.properties.city_id)"
      }
    }
  ]

এই NL কোয়েরিটি (Q7) চালান:

Del Mar houses close to good schools for a starter family.

ইঞ্জিনটি আপনার ফেসেট শর্তগুলো সরাসরি মূল কোয়েরির সাথে যুক্ত করে দেয়:

SELECT "p"."address_street", "p"."address_postal_code", "s"."school_name", "stp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
JOIN "real_estate"."school_to_property" AS "stp" ON "p"."property_id" = "stp"."property_id" 
JOIN "real_estate"."schools" AS "s" ON "stp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' 
  AND "s"."school_ranking" <= 5 
  AND "stp"."proximity_miles" <= 2 
  AND "p"."is_single_family" = TRUE 
  AND "p"."listing_status" = 'Active' 
  AND "p"."bedrooms" BETWEEN 3 AND 4 
  AND "p"."bathrooms" >= 2.0 
  AND 500 > (
    SELECT m.crime_rate_per_100k 
    FROM real_estate.cities c 
    JOIN real_estate.municipalities m ON c.municipality_id = m.municipality_id 
    AND c.city_id = p.city_id
  ) 
ORDER BY 0.8 * "s"."school_ranking" + 0.2 * "stp"."proximity_miles"

এবং এই হলো ফলাফল:

Query Results
address_street        address_postal_code        school_name        proximity_miles
200 Coast Blvd        92014        Del Mar Heights Elementary        0.50
Natural Language Answer
Based on your criteria, there is an active listing for a single-family house in Del Mar that fits your needs:

Address: 200 Coast Blvd, Del Mar, 92014
Nearby School: Del Mar Heights Elementary (ranked within the top 5)
Proximity to School: 0.50 miles

আরও দিক যোগ করা

নতুন উদীয়মান ধারার উপর ভিত্তি করে যদি আমরা আরও একটি মাত্রা যোগ করতে চাই—যেমন সম্পত্তিটির জন্য একটি জানালা-দৃশ্য—তাহলে কেমন হয়?

একটি ফেসেট সংজ্ঞার ভিতরে সমুদ্রের দৃশ্য সম্পর্কিত শব্দার্থিক মিল যোগ করুন।

    {
      "sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'unobstructed, panoramic, ocean vista, vast Pacific, breathtaking, commanding view, deep blue horizon, massive, sweeping view')::vector) < 0.4)",
      "intent": "with ocean view",
      "manifest": "with ocean view",
      "parameterized": {
        "parameterized_intent": "with ocean view",
        "parameterized_sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'unobstructed, panoramic, ocean vista, vast Pacific, breathtaking, commanding view, deep blue horizon, massive, sweeping view')::vector) < 0.4)"
      }

উপরের ফেসেট সংজ্ঞায় ০.৪ মানটি হলো পরীক্ষামূলকভাবে ক্রমাঙ্কিত একটি থ্রেশহোল্ড। বহু-মাত্রিক কনটেক্সট ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context2_2.json

sixrecipe_context2_2.json আপনার কনটেক্সট সেটে আপলোড করুন এবং এই প্রম্পটটি (প্রশ্ন ৮) চালান:

Ocean view Del Mar homes near good schools.

আউটপুটটিতে google_ml.embedding মাধ্যমে ভেক্টর সাদৃশ্য মেলানোর সাথে সাধারণ শর্তাবলী অন্তর্ভুক্ত থাকে:

SELECT "p"."address_street", "p"."address_postal_code", "s"."school_name", "stp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
JOIN "real_estate"."school_to_property" AS "stp" ON "p"."property_id" = "stp"."property_id" 
JOIN "real_estate"."schools" AS "s" ON "stp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' AND "s"."school_ranking" <= 5 AND "stp"."proximity_miles" <= 2 
AND (((p.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'unobstructed, panoramic, ocean vista, vast Pacific, breathtaking, commanding view, deep blue horizon, massive, sweeping view')::vector) <= 0.4)) 
ORDER BY 0.8 * "s"."school_ranking" + 0.2 * "stp"."proximity_miles";

এবং কোয়েরিটি একটি প্রপার্টি রিটার্ন করে:

Query Results
address_street        address_postal_code        school_name        proximity_miles
100 Del Mar Heights Rd        92014        Del Mar Heights Elementary        1.00
Answer
The ocean-view home in Del Mar near a top-ranked school is located at 100 Del Mar Heights Rd (92014).

It is situated just 1.00 mile away from Del Mar Heights Elementary, which is one of the area's highly-ranked schools (ranking of 5 or better).

AlloyDB Studio-তে প্রপার্টির বিবরণ দেখে এবং নিম্নলিখিত কোয়েরিটি চালিয়ে ফলাফল যাচাই করুন:

select description from real_estate.properties where address_postal_code='92014' and description is not null;

এটিতে "মহিমান্বিত সামুদ্রিক দৃশ্য" সহ বর্ণনাটি দেখানো হবে।

Well-located 2-bedroom condo with excellent proximity to coastal shopping and dining. The balcony provides a magnificent marine spectacle against an azure backdrop. Under contract, high monthly HOA fee.

১০. ভ্যালু সার্চ ব্যবহার করে আপনার ব্যক্তিগত তথ্যের দ্ব্যর্থতা নিরসন

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

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

একটি কোয়েরিতে অস্পষ্টতা

বাস্তব জীবনে বিভিন্ন নাম ও স্থানের বানান ভুলের কারণে বিষয়টি আরও কঠিন হতে পারে। টাইপো এবং দ্ব্যর্থক শব্দ সম্বলিত এই প্রম্পটটি (প্রশ্ন ৯) চালান:

Westwod's sold properties in the last 1 month.

এখানে দুটি সমস্যা আছে - নামটি ভুল বানানে লেখা এবং এটা স্পষ্ট নয় যে আমরা ঐ স্থানে বিক্রি হওয়া একই নামের সম্পত্তিগুলো নিয়ে কথা বলছি, নাকি কোনো রিয়েল এস্টেট এজেন্সি নিয়ে। যখন আমরা কোয়েরিটি চালাই, তখন এটি নিচের মতো একটি কোয়েরি ফেরত দেয়।

SELECT "p"."property_id", "p"."address_street", "p"."address_postal_code", "p"."price" AS "listing_price", "p"."bedrooms", "p"."bathrooms", "p"."listing_status", "pt"."sale_date", "pt"."sale_price", "c"."city_name" FROM "real_estate"."properties" AS "p" INNER JOIN "real_estate"."property_transactions" AS "pt" ON "p"."property_id" = "pt"."property_id" INNER JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" WHERE ("c"."city_name" ILIKE '%Westwood%' OR "c"."city_name" ILIKE '%Westwod%') AND "pt"."sale_date" >= '2025-09-01'::date AND "pt"."sale_date" <= '2025-09-30'::date ORDER BY "pt"."sale_date" DESC NULLS LAST, "pt"."sale_price" DESC NULLS LAST

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

ফাজি স্ট্রিং তুলনা সমর্থন করার জন্য AlloyDB Studio-তে pg_trgm এক্সটেনশনটি সক্রিয় করুন:

CREATE EXTENSION IF NOT EXISTS pg_trgm;

এরপরে আমরা এক্সটেনশনটি ব্যবহার করে আমাদের QueryData কনটেক্সট সেটে ভ্যালু সার্চ যোগ করতে পারব।

আমরা যে মান অনুসন্ধানগুলো ব্যবহার করতে চাই তার তালিকা নিচে দেওয়া হলো:

"value_searches": [
    {
      "conceptType": "Municipality name",
      "query": "/* Requires extension: pg_trgm */ WITH TrigramMetrics AS (SELECT T.municipality_name AS original_value, (T.municipality_name % $value::text) AS normalized_dist FROM real_estate.municipalities T WHERE T.municipality_name % $value::text) SELECT original_value AS value, 'real_estate.municipalities.municipality_name' AS columns, 'Name of the municipality' AS concept_type, normalized_dist AS distance, ''::text AS context FROM TrigramMetrics",
      "description": "Trigram match for municipality name"
    },
    {
      "conceptType": "City name",
      "query": "/* Requires extension: pg_trgm */ WITH TrigramMetrics AS (SELECT T.city_name AS original_value, (T.city_name % $value::text) AS normalized_dist FROM real_estate.cities T WHERE T.city_name % $value::text) SELECT original_value AS value, 'real_estate.cities.city_name' AS columns, 'Name of the city' AS concept_type, normalized_dist AS distance, ''::text AS context FROM TrigramMetrics",
      "description": "Trigram match for city name"
    },
    {
      "conceptType": "Brokerage name",
      "query": "/* Requires extension: pg_trgm */ WITH TrigramMetrics AS (SELECT T.brokerage AS original_value, (T.brokerage % $value::text) AS normalized_dist FROM real_estate.agents T WHERE T.brokerage % $value::text) SELECT original_value AS value, 'real_estate.agents.brokerage' AS columns, 'Name of the brokerage' AS concept_type, normalized_dist AS distance, ''::text AS context FROM TrigramMetrics",
      "description": "Trigram match for brokerage name"
    }
  ]

মান অনুসন্ধান প্রসঙ্গ ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context3_1.json

sixrecipe_context3_1.json ফাইলটি QueryData sixrecipes কনটেক্সট সেটে আপলোড করুন এবং সংরক্ষণ করুন।

প্রম্পটটি পুনরায় চালান (প্রশ্ন ৯):

Westwod's sold properties in the last 1 month.

এটি একটি স্পষ্টীকরণমূলক প্রতিক্রিয়া দিয়েছে, কারণ মান অনুসন্ধানে এটি একই রকম মান সহ ৩টি ভিন্ন সত্তা খুঁজে পেয়েছে:

The database requires some clarification to provide the exact information you need:

The search term 'Westwod' (Westwood) is ambiguous because it can refer to:

A municipality name (e.g., the municipality of Westwood)
A city name (e.g., the city of Westwood)
A brokerage name (e.g., properties sold by agents affiliated with the Westwood brokerage)
Could you please clarify which of these you are referring to?

এই চিহ্নটি আমাদের একটি সূত্র দেয় যে কেন এটি সেই নির্দিষ্ট পথটি বেছে নিয়েছে।

88c52932dcbef8f9.jpeg

এখানে সম্পূর্ণ লেখাটি দেওয়া হলো:

"[NOT_ENOUGH_INFO] The search term 'Westwod' is ambiguous because it can refer to a municipality name, a city name, or a brokerage name. Could you please clarify if you are referring to properties sold within the municipality of Westwood, the city of Westwood, or properties sold by agents affiliated with the Westwood brokerage?"

কোয়েরি থেকে অস্পষ্টতা দূর করা

ইনপুট প্রম্পট পরিমার্জন করুন (প্রশ্ন ১০):

Westwood city location properties sold in September 2025.

এবং এখন আমাদের কাছে কোয়েরি এবং তার ফলাফল রয়েছে:

Generated SQL
SELECT "p"."property_id", "p"."address_street", "p"."address_postal_code", "p"."price", "pt"."sale_date", "pt"."sale_price" 
FROM "real_estate"."properties" AS "p" 
INNER JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
INNER JOIN "real_estate"."property_transactions" AS "pt" ON "p"."property_id" = "pt"."property_id" 
WHERE "c"."city_name" = 'Westwood' 
  AND "pt"."sale_date" >= '2025-09-01'::date 
  AND "pt"."sale_date" <= '2025-09-30'::date 
ORDER BY "pt"."sale_date" ASC NULLS LAST

Query Results
property_id        address_street        address_postal_code        price        sale_date        sale_price
32        999 Main St        99999        3800000.00        2025-09-12        1000000.00

১১. শব্দার্থিক অনুসন্ধান এবং এআই ফাংশন

AlloyDB AI ফাংশনগুলো অসংগঠিত ডেটার উপর সিমান্টিক ফিল্টারিং করতে সক্ষম করে। স্ট্যান্ডার্ড ডাটাবেস অপারেটরগুলোর পাশাপাশি ai.if এবং google_ml.embedding-এর মতো ফাংশনগুলো সরাসরি SQL কোয়েরিতে ব্যবহার করুন।

ILIKE অপারেটর সহ টেমপ্লেট

প্রথম ধাপ হিসেবে, ILIKE অপারেটরসহ নতুন কনটেক্সট ফাইলটি আপলোড করুন।

ILIKE টেমপ্লেট কনটেক্সট ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context4_1.json

‘বাসযোগ্য’ বাড়িগুলির জন্য স্ট্যান্ডার্ড ILIKE প্যাটার্ন ম্যাচিং মূল্যায়ন করতে আপনার কনটেক্সট সেটে sixrecipe_context4_1.json ফাইলটি আপলোড করুন।

    {
      "nl_query": "Move-in ready houses",
      "sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND (\"p\".description ILIKE '%turnkey%' OR \"p\".description ILIKE '%move-in%')",
      "intent": "Move-in ready houses",
      "manifest": "Move-in ready houses",
      "parameterized": {
        "parameterized_intent": "Move-in ready houses",
        "parameterized_sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND (\"p\".description ILIKE '%turnkey%' OR \"p\".description ILIKE '%move-in%')"
      }
    }

এই প্রশ্নটি জমা দিন (প্রশ্ন ১১):

List move-in ready houses.

ফলাফলস্বরূপ কোয়েরি:

SELECT "p"."address_street", "p"."address_postal_code" 
FROM "real_estate"."properties" AS "p" 
WHERE "p".listing_status = 'Active' 
  AND "p"."description" IS NOT NULL 
  AND ("p".description ILIKE '%turnkey%' OR "p".description ILIKE '%move-in%')

এটি একটি মিলে যাওয়া রেকর্ড ফেরত দেয়।

Query Results
address_street        address_postal_code
40 Main St, Unit 8        N2H 2G8

AI.IF ফাংশন সহ টেমপ্লেট

AI.IF টেমপ্লেট কনটেক্সট ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context4_2.json

ai.if সিমান্টিক ফিল্টারিং ফাংশনটি মূল্যায়ন করতে sixrecipe_context4_2.json ফাইলটি আপনার কনটেক্সট সেটে আপলোড করুন।

    {
      "nl_query": "List Move-in ready houses",
      "sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND ai.if('Does this description represent a move-in ready house? Description: ' || \"p\".\"description\")",
      "intent": "List Move-in ready houses",
      "manifest": "List Move-in ready houses",
      "parameterized": {
        "parameterized_intent": "List Move-in ready houses",
        "parameterized_sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND ai.if('Does this description represent a move-in ready house? Description: ' || \"p\".\"description\")"
      }
    }

প্রশ্নটি পুনরাবৃত্তি করুন (প্রশ্ন ১২):

List move-in ready houses.

তৈরি করা SQL:

SELECT "p"."address_street", "p"."address_postal_code" 
FROM "real_estate"."properties" AS "p" 
WHERE "p".listing_status = 'Active' 
  AND "p"."description" IS NOT NULL 
  AND ai.if('Does this description represent a move-in ready house? Description: ' || "p"."description")

এর ফলে ফলাফলে আমরা একই বৈশিষ্ট্য পাই:

Query Results
Address Street        Address Postal Code
40 Main St, Unit 8        N2H 2G8
Natural Language Answer
The move-in ready home currently available is located at:

Address: 40 Main St, Unit 8
Postal Code: N2H 2G8

এম্বেডিং সার্চ কনটেক্সট ফাইলটি ডাউনলোড করুন:

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context4_3.json

google_ml.embedding ব্যবহার করে সিমান্টিক ভেক্টর সার্চ মূল্যায়ন করতে এবং নতুন রান্নাঘরের সরঞ্জামসহ বাড়ি খুঁজতে sixrecipe_context4_3.json ফাইলটি আপনার কনটেক্সট সেটে আপলোড করুন।

AlloyDB ভেক্টর সার্চ ব্যবহার করে sixrecipe_context4_3.json ফাইলের সাথে একটি অতিরিক্ত ফেসেট যোগ করে কনটেক্সট সেটটি আপডেট করুন।

    {
      "sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'Upgraded kitchen appliances')::vector) < 0.4)",
      "intent": "with upgraded kitchen appliances",
      "manifest": "with upgraded kitchen appliances",
      "parameterized": {
        "parameterized_intent": "with upgraded kitchen appliances",
        "parameterized_sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'Upgraded kitchen appliances')::vector) < 0.4)"
      }
    }

উপরের ফেসেট সংজ্ঞায় উল্লিখিত ০.৪ মানটি হলো পরীক্ষামূলকভাবে ক্রমাঙ্কিত একটি থ্রেশহোল্ড।

এই কোয়েরিটি চালান (প্রশ্ন ১৩):

List move-in ready houses with upgraded kitchen appliances.

তৈরি করা SQL:

SELECT "p"."address_street", "p"."address_postal_code" FROM "real_estate"."properties" AS "p" WHERE "p"."listing_status" = 'Active' AND "p"."description" IS NOT NULL AND ai.if('Does this description represent a Move-in ready house? Description: ' || "p"."description") AND ((("p"."description_embedding" <=> google_ml.embedding('gemini-embedding-001', 'Upgraded kitchen appliances')::vector) < 0.4))

এখানে কোয়েরির ফলাফল এবং স্বাভাবিক ভাষার সুপারিশ দেওয়া হলো:

Query Results
Address        Postal Code
40 Main St, Unit 8        N2H 2G8
Natural Language Answer
The move-in ready house with upgraded kitchen appliances is located at:

Address: 40 Main St, Unit 8
Postal Code: N2H 2G8

১২. নিরাপত্তা ও গোপনীয়তা

যখনই QueryData API কোয়েরি তৈরি করে, তখন একটি গোপনীয়তার ঝুঁকি থাকে যে তৈরি হওয়া কোয়েরিগুলো অন্য ব্যবহারকারীদের ডেটা প্রকাশ করে দিতে পারে। Parameterized Secure Views (PSVs) NL2SQL তৈরির সময় সারি-স্তরের নিরাপত্তা সীমা প্রয়োগ করে।

প্যারামিটারযুক্ত সুরক্ষিত ভিউ তৈরি করুন

আমাদের কাছে real_estate.offers নামে একটি টেবিল আছে, যেখানে আমাদের সমস্ত রিয়েল এস্টেট ডিলের অফার সম্পর্কিত তথ্য রয়েছে। আমরা চাই আমাদের এজেন্টরা যেন শুধু তাদের নিজেদের ডিলগুলোই দেখতে পায়, কিন্তু অন্য এজেন্টদের ডিলগুলো নয়। আমরা agent_id-এর উপর ভিত্তি করে সারি ফিল্টার করার সুবিধা সহ একটি PSV তৈরি করি।

AlloyDB Studio-তে offers টেবিলের জন্য একটি প্যারামিটারাইজড সিকিওর ভিউ তৈরি করুন:

CREATE VIEW real_estate.secure_offers
  WITH (security_barrier) AS
SELECT offer_id, property_id, buyer_agent_id,
    seller_agent_id, offer_amount, offer_date,
    offer_status, offer_expiration_date,
    contingencies
FROM real_estate.offers
WHERE buyer_agent_id = $@agent_id;

প্যারামিটারাইজড সিকিউরিটি ভিউ ডেফিনিশন যাচাই করুন:

SELECT definition
FROM parameterized_views.all_parameterized_views
WHERE schemaname = 'real_estate' AND viewname = 'secure_offers';

real_estate.offers টেবিলটির ব্যাপারে কী হবে?

AlloyDB প্যারামিটারাইজড সিকিওর ভিউ ব্যবহার করে QueryData ডেটা অ্যাক্সেস সীমিত করুন

agent.py ফাইলে, real_estate.offers-এর পরিবর্তে real_estate.secure_offers নামক প্যারামিটারাইজড সিকিউরিটি ভিউটি TABLE_IDS-এ রেজিস্টার করা হয়েছে:

agent.py সোর্স কোড:

 List of database tables included in QueryData API requests
TABLE_IDS = [
    "real_estate.municipalities",
    "real_estate.cities",
    "real_estate.agents",
    "real_estate.properties",
    "real_estate.schools",
    "real_estate.school_to_property",
    "real_estate.property_transactions",
    "real_estate.secure_offers",
]

এবং agent_id=1 সহ একজন এজেন্টের জন্য সেশন রানটাইম কনটেক্সট পাস করে:

            "parameterized_secure_view_parameters": {
                "parameters": {
                    "key": "agent_id",
                    "value": "1"
                }
            }
        },

এর ফলে প্রতিটি QueryData API অনুরোধে সেই প্যারামিটারটি পাঠানো হবে এবং যখন অনুরোধে সুরক্ষিত ভিউটি অন্তর্ভুক্ত করা হবে, তখন এটি ফিল্টারিং প্রয়োগ করে শুধুমাত্র সেই নির্দিষ্ট এজেন্টের ফলাফলগুলো ফেরত দেবে।

এই কোয়েরিটি চালান (প্রশ্ন ১৪):

List the offer id and listing price in 2025 where the offer was within 5% of the final selling price.

তৈরি করা SQL:

SELECT "o"."offer_id", "p"."price" AS "listing_price" 
FROM "real_estate"."secure_offers" AS "o" 
INNER JOIN "real_estate"."properties" AS "p" ON "o"."property_id" = "p"."property_id" 
INNER JOIN "real_estate"."property_transactions" AS "t" ON "o"."property_id" = "t"."property_id" 
WHERE "o"."offer_date" >= '2025-01-01' 
  AND "o"."offer_date" <= '2025-12-31' 
  AND "o"."offer_amount" IS NOT NULL 
  AND "t"."sale_price" IS NOT NULL 
  AND "p"."price" IS NOT NULL 
  AND ABS("o"."offer_amount" - "t"."sale_price") <= (0.05 * "t"."sale_price") 
ORDER BY "o"."offer_id" ASC NULLS LAST

ভিউটি কোয়েরি করলে তা সক্রিয় এজেন্ট সেশন প্যারামিটার দ্বারা ফলাফল ফিল্টার করে, অননুমোদিত রেকর্ড ডেটা সুরক্ষিত রাখে এবং শুধুমাত্র দুটি রেকর্ড ফেরত দেয়।

Query Results
Offer ID        Listing Price
7        $750,000.00
8        $510,000.00
Natural Language Answer
Here are the offers from 2025 where the offer amount was within 5% of the final selling price:

Offer ID 7: Listing Price of $750,000.00
Offer ID 8: Listing Price of $510,000.00

AlloyDB Studio-তে মূল real_estate.offers টেবিলের বিরুদ্ধে নিম্নলিখিত কোয়েরিটি চালালে:

SELECT "o"."offer_id", "p"."price" AS "listing_price" 
FROM "real_estate"."offers" AS "o" 
INNER JOIN "real_estate"."properties" AS "p" ON "o"."property_id" = "p"."property_id" 
INNER JOIN "real_estate"."property_transactions" AS "t" ON "o"."property_id" = "t"."property_id" 
WHERE "o"."offer_date" >= '2025-01-01' 
  AND "o"."offer_date" <= '2025-12-31' 
  AND "o"."offer_amount" IS NOT NULL 
  AND "t"."sale_price" IS NOT NULL 
  AND "p"."price" IS NOT NULL 
  AND ABS("o"."offer_amount" - "t"."sale_price") <= (0.05 * "t"."sale_price") 
ORDER BY "o"."offer_id" ASC NULLS LAST

এটি দুইটির বেশি রেকর্ড ফেরত দেয়, যেখানে সকল এজেন্টের তথ্য দেখানো হয়।

এর মাধ্যমেই আমাদের ল্যাব শেষ হলো! আপনারা QueryData API, AI ফাংশন এবং AlloyDB প্যারামিটারাইজড সিকিওর ভিউ ব্যবহার করার পদ্ধতি শিখেছেন।

১৩. পরিবেশ পরিষ্কার করা

ল্যাবের কাজ শেষ হলে AlloyDB ইনস্ট্যান্স এবং ক্লাস্টারটি ধ্বংস করে দিন।

AlloyDB ক্লাস্টার এবং এর সমস্ত ইনস্ট্যান্স মুছে ফেলুন

force অপশনটির মাধ্যমে ক্লাস্টারটি ধ্বংস করা হয়, যা ক্লাস্টারের অন্তর্গত সমস্ত ইনস্ট্যান্সকেও মুছে দেয়।

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

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.                                                                                                                                                                                                                                                            

ক্লাউড স্টোরেজ বাকেট মুছুন

চলমান স্টোরেজ চার্জ এড়াতে ক্লাউড স্টোরেজ ইম্পোর্ট বাকেটটি মুছে ফেলুন:

gcloud storage rm -r gs://${PROJECT_ID}-import 

১৪. অভিনন্দন

কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!

আমরা যা আলোচনা করেছি

  • কীভাবে একটি AlloyDB ক্লাস্টার এবং প্রাইমারি ইনস্ট্যান্স স্থাপন করবেন
  • AlloyDB-এর জন্য কীভাবে QueryData, AI ফাংশন এবং প্যারামিটারাইজড সিকিওর ভিউ সক্রিয় করবেন
  • কিভাবে একটি QueryData কনটেক্সট সেট তৈরি করতে হয়
  • QueryData API-তে কীভাবে বিভিন্ন টেমপ্লেট এবং কনটেক্সট ব্যবহার করবেন
  • ফ্যাসেট ব্যবহার করে কীভাবে QueryData টেমপ্লেটগুলিকে আরও নমনীয় করা যায়
  • ভ্যালু সার্চ এবং ট্রাইগ্রাম ইনডেক্সিং ব্যবহার করে ডেটার অস্পষ্টতা কীভাবে সমাধান করা যায়
  • টেমপ্লেট ব্যবহার করে শব্দার্থিক অনুসন্ধানের জন্য এআই ফাংশন কীভাবে ব্যবহার করবেন
  • QueryData API-এর সাথে প্যারামিটারাইজড সিকিওর ভিউ কীভাবে ব্যবহার করবেন

জরিপ

আউটপুট:

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

শুধু একবার পড়ে দেখুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।