১. ভূমিকা
স্প্যানার হলো একটি সম্পূর্ণভাবে পরিচালিত, হরাইজন্টালি স্কেলেবল এবং বিশ্বব্যাপী বিতরণযোগ্য ডাটাবেস পরিষেবা, যা রিলেশনাল এবং নন-রিলেশনাল উভয় ধরনের অপারেশনাল ওয়ার্কলোডের জন্য অত্যন্ত উপযোগী।
স্প্যানারে বিল্ট-ইন ভেক্টর সার্চ সাপোর্ট রয়েছে, যা আপনাকে এক্সাক্ট কে-নিয়ারেস্ট নেইবার (KNN) অথবা অ্যাপ্রক্সিমেট নিয়ারেস্ট নেইবার (ANN) ফিচার ব্যবহার করে বৃহৎ পরিসরে সিমিলারিটি বা সিমান্টিক সার্চ করতে এবং রিট্রিভাল অগমেন্টেড জেনারেশন (RAG) বাস্তবায়ন করতে সক্ষম করে।
স্প্যানারের ভেক্টর সার্চ কোয়েরিগুলো, আপনার অপারেশনাল ডেটার ওপর করা অন্য যেকোনো কোয়েরির মতোই, ট্রানজ্যাকশন সম্পন্ন হওয়ার সাথে সাথেই নতুন রিয়েল-টাইম ডেটা ফেরত দেয়।
এই ল্যাবে, আপনি স্প্যানার ব্যবহার করে ভেক্টর সার্চ করার জন্য প্রয়োজনীয় বেসিক ফিচারগুলো সেট আপ করা এবং SQL ব্যবহার করে VertexAI-এর মডেল গার্ডেন থেকে এমবেডিং ও LLM মডেল অ্যাক্সেস করার পদ্ধতি ধাপে ধাপে শিখবেন।
স্থাপত্যটি দেখতে এইরকম হবে:
এই ভিত্তির ওপর দাঁড়িয়ে, আপনি শিখবেন কীভাবে ScaNN অ্যালগরিদম দ্বারা সমর্থিত একটি ভেক্টর ইনডেক্স তৈরি করতে হয়, এবং আপনার সিমান্টিক ওয়ার্কলোড স্কেল করার প্রয়োজন হলে APPROX ডিসট্যান্স ফাংশনগুলো ব্যবহার করতে হয়।
আপনি যা তৈরি করবেন
এই ল্যাবের অংশ হিসেবে, আপনি যা করবেন:
- একটি স্প্যানার ইনস্ট্যান্স তৈরি করুন
- VertexAI-এর এমবেডিং এবং LLM মডেলের সাথে ইন্টিগ্রেট করার জন্য স্প্যানারের ডাটাবেস স্কিমা সেট আপ করুন।
- একটি খুচরা ডেটা সেট লোড করুন
- ডেটাসেটের বিরুদ্ধে সাদৃশ্য অনুসন্ধান কোয়েরি চালান।
- পণ্য-নির্দিষ্ট সুপারিশ প্রণয়নের জন্য এলএলএম মডেলের প্রেক্ষাপট প্রদান করুন।
- স্কিমাটি পরিবর্তন করুন এবং একটি ভেক্টর ইনডেক্স তৈরি করুন।
- নতুন তৈরি করা ভেক্টর ইনডেক্সটি ব্যবহার করার জন্য কোয়েরিগুলো পরিবর্তন করুন।
আপনি যা শিখবেন
- কীভাবে একটি স্প্যানার ইনস্ট্যান্স সেট আপ করবেন
- VertexAI-এর সাথে কীভাবে একীভূত করবেন
- একটি রিটেইল ডেটাসেটে অনুরূপ আইটেম খুঁজে বের করার জন্য ভেক্টর সার্চ করতে স্প্যানার কীভাবে ব্যবহার করবেন
- এএনএন সার্চ ব্যবহার করে ভেক্টর সার্চ ওয়ার্কলোড স্কেল করার জন্য আপনার ডাটাবেসকে কীভাবে প্রস্তুত করবেন।
আপনার যা যা লাগবে
- একটি গুগল ক্লাউড প্রজেক্ট যা একটি বিলিং অ্যাকাউন্টের সাথে সংযুক্ত।
- একটি ওয়েব ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স ।
২. সেটআপ এবং প্রয়োজনীয়তা
একটি প্রকল্প তৈরি করুন
আপনার যদি আগে থেকে কোনো গুগল অ্যাকাউন্ট (জিমেইল বা গুগল অ্যাপস) না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে। গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে ( console.cloud.google.com ) সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন।
আপনার যদি আগে থেকেই কোনো প্রজেক্ট থাকে, তাহলে কনসোলের উপরের বাম দিকের প্রজেক্ট সিলেকশন পুল-ডাউন মেনুতে ক্লিক করুন:

এবং একটি নতুন প্রজেক্ট তৈরি করতে, প্রাপ্ত ডায়ালগ বক্সে থাকা 'NEW PROJECT' বোতামটিতে ক্লিক করুন:

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

পরবর্তী প্রজেক্ট তৈরির ডায়ালগ বক্সে আপনি আপনার নতুন প্রজেক্টের বিবরণ লিখতে পারবেন:

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।
এরপরে, যদি আপনি আগে থেকে তা না করে থাকেন, তাহলে Google Cloud রিসোর্স ব্যবহার করতে এবং Spanner API সক্রিয় করতে আপনাকে ডেভেলপার কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে আপনার কয়েক ডলারের বেশি খরচ হওয়ার কথা নয়, কিন্তু আপনি যদি আরও রিসোর্স ব্যবহার করার সিদ্ধান্ত নেন অথবা সেগুলোকে চালু রাখেন, তাহলে খরচ আরও বেশি হতে পারে (এই ডকুমেন্টের শেষে 'ক্লিনআপ' অংশটি দেখুন)। গুগল ক্লাউড স্প্যানারের মূল্য তালিকা এখানে নথিভুক্ত করা আছে।
গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা ৩০০ ডলারের একটি ফ্রি ট্রায়ালের জন্য যোগ্য, যার ফলে এই কোডল্যাবটি সম্পূর্ণ বিনামূল্যে পাওয়া যাবে।
গুগল ক্লাউড শেল সেটআপ
যদিও গুগল ক্লাউড এবং স্প্যানার আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আমরা গুগল ক্লাউড শেল ব্যবহার করব, যা ক্লাউডে চালিত একটি কমান্ড লাইন পরিবেশ।
এই ডেবিয়ান-ভিত্তিক ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এর মানে হলো, এই কোডল্যাবের জন্য আপনার শুধু একটি ব্রাউজার প্রয়োজন হবে (হ্যাঁ, এটি ক্রোমবুকেও কাজ করে)।
- ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল 'Activate Cloud Shell'-এ ক্লিক করুন।
(পরিবেশের জন্য ব্যবস্থা করতে এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত)।


ক্লাউড শেলে সংযুক্ত হওয়ার পর আপনি দেখতে পাবেন যে, আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার PROJECT_ID-তে সেট করা আছে।
gcloud auth list
কমান্ড আউটপুট
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
gcloud config list project
কমান্ড আউটপুট
[core]
project = <PROJECT_ID>
যদি কোনো কারণে প্রজেক্টটি সেট করা না থাকে, তাহলে নিম্নলিখিত কমান্ডটি দিন:
gcloud config set project <PROJECT_ID>
আপনার PROJECT_ID খুঁজছেন? সেটআপের ধাপগুলিতে আপনি কোন আইডি ব্যবহার করেছিলেন তা দেখে নিন অথবা ক্লাউড কনসোল ড্যাশবোর্ডে এটি খুঁজে দেখুন:

ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা ভবিষ্যতে কমান্ড চালানোর সময় কাজে লাগতে পারে।
echo $GOOGLE_CLOUD_PROJECT
কমান্ড আউটপুট
<PROJECT_ID>
স্প্যানার এপিআই এবং ভার্টেক্সএআই এপিআই সক্রিয় করুন
gcloud services enable spanner.googleapis.com
gcloud services enable aiplatform.googleapis.com
IAM নীতি যাচাই করুন :
একটি স্প্যানার ইনস্ট্যান্সে ভেক্টর সার্চ চালু করার জন্য IAM পলিসিতে শুধুমাত্র service-<PROJECT_NUMBER>@gcp-sa-spanner.iam.gserviceaccount.com-কে ক্লাউড স্প্যানার এপিআই সার্ভিস এজেন্ট হিসেবে অনুমোদন (grant) করতে হবে। নিচের ছবির মতো উপরের বাম কোণায় থাকা তিনটি বার আইকনে ক্লিক করুন।

আপনি সেখানে IAM নীতিটি দেখতে পাবেন:

আপনি নিচের মতো করে পারমিশন (Permission) এর অধীনে আইএএম (IAM) সেটিংটি পরীক্ষা করতে পারেন।

আর যদি Cloud Spanner API Service Agent না থাকে, তবে এটিকে অনুমোদন দেওয়ার জন্য নিচের কমান্ডটি ব্যবহার করুন। আরও নির্দেশাবলী এখানে পাওয়া যাবে।
$ gcloud beta services identity create --service=spanner.googleapis.com --project=<PROJECT_ID>
$ gcloud projects add-iam-policy-binding <PROJECT_NUMBER> --member=serviceAccount:service-<PROJECT_NUMBER>@gcp-sa-spanner.iam.gserviceaccount.com --role=roles/spanner.serviceAgent --condition=None
সারসংক্ষেপ
এই ধাপে আপনি আপনার প্রজেক্ট সেট আপ করেছেন (যদি আগে থেকে না থাকে), ক্লাউড শেল সক্রিয় করেছেন এবং প্রয়োজনীয় API-গুলো চালু করেছেন।
এরপরে
এরপরে, আপনি স্প্যানার ইনস্ট্যান্স এবং ডেটাবেস সেট আপ করবেন।
৩. একটি স্প্যানার ইনস্ট্যান্স এবং ডাটাবেস তৈরি করুন
স্প্যানার ইনস্ট্যান্স তৈরি করুন
এই ধাপে আমরা কোডল্যাবের জন্য আমাদের স্প্যানার ইনস্ট্যান্স সেট আপ করব। এটি করার জন্য, ক্লাউড শেল খুলুন এবং এই কমান্ডটি চালান:
export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--edition=ENTERPRISE \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
সর্বনিম্ন সংস্করণটি ENTERPRISE হওয়া উচিত। STANDARD সংস্করণে ভেক্টর সার্চের সুবিধা নেই।
কমান্ড আউটপুট:
$ Creating instance...done.
ডাটাবেস তৈরি করুন
আপনার ইনস্ট্যান্সটি চালু হয়ে গেলে, আপনি ডেটাবেস তৈরি করতে পারবেন। স্প্যানার একটিমাত্র ইনস্ট্যান্সে একাধিক ডেটাবেস ব্যবহারের সুযোগ দেয়।
ডাটাবেস হলো সেই জায়গা যেখানে আপনি আপনার স্কিমা নির্ধারণ করেন। এছাড়াও আপনি ডাটাবেসে কার অ্যাক্সেস থাকবে তা নিয়ন্ত্রণ করতে পারেন, কাস্টম এনক্রিপশন সেট আপ করতে পারেন, অপটিমাইজার কনফিগার করতে পারেন এবং ডেটা সংরক্ষণের সময়কাল নির্ধারণ করতে পারেন।
ডাটাবেস তৈরি করতে, আবার gcloud কমান্ড লাইন টুলটি ব্যবহার করুন:
export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
--instance=$SPANNER_INSTANCE_ID
কমান্ড আউটপুট:
$ Creating database...done.
সারসংক্ষেপ
এই ধাপে আপনি স্প্যানার ইনস্ট্যান্স এবং ডেটাবেস তৈরি করেছেন।
এরপরে
এরপরে, আপনি স্প্যানার স্কিমা এবং ডেটা সেট আপ করবেন।
৪. সিম্বাল স্কিমা এবং ডেটা লোড করুন
সিম্বাল স্কিমা তৈরি করুন
স্কিমা সেট আপ করতে, স্প্যানার স্টুডিওতে যান:

স্কিমাটির দুটি অংশ রয়েছে। প্রথমে, আপনাকে products টেবিলটি যোগ করতে হবে। এই স্টেটমেন্টটি খালি ট্যাবে কপি করে পেস্ট করুন।
স্কিমার জন্য, এই DDL-টি বক্সে কপি করে পেস্ট করুন:
CREATE TABLE products(
categoryId INT64 NOT NULL,
productId INT64 NOT NULL,
productName STRING(MAX) NOT NULL,
productDescription STRING(MAX) NOT NULL,
productDescriptionEmbedding ARRAY<FLOAT32>,
createTime TIMESTAMP NOT NULL
OPTIONS (
allow_commit_timestamp = TRUE),
inventoryCount INT64 NOT NULL,
priceInCents INT64,)
PRIMARY KEY(categoryId, productId);
এরপর, run বাটনে ক্লিক করুন এবং আপনার স্কিমা তৈরি হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করুন।
এরপরে, আপনি দুটি মডেল তৈরি করবেন এবং সেগুলোকে VertexAI মডেল এন্ডপয়েন্টগুলোতে কনফিগার করবেন।
প্রথম মডেলটি হলো একটি এমবেডিং মডেল যা টেক্সট থেকে এমবেডিং তৈরি করতে ব্যবহৃত হয়, এবং দ্বিতীয়টি হলো একটি এলএলএম মডেল যা স্প্যানারের ডেটার উপর ভিত্তি করে রেসপন্স তৈরি করতে ব্যবহৃত হয়।
স্প্যানার স্টুডিও-র একটি নতুন ট্যাবে নিম্নলিখিত স্কিমাটি পেস্ট করুন:
CREATE OR REPLACE MODEL EmbeddingsModel
INPUT(content STRING(MAX)) OUTPUT(embeddings STRUCT<values ARRAY<FLOAT32>>) REMOTE
OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-embedding-004');
CREATE OR REPLACE MODEL LLMModel
INPUT(prompt STRING(MAX)) OUTPUT(content STRING(MAX)) REMOTE
OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/gemini-2.0-flash-001',
default_batch_size = 1);
এরপর, run বাটনে ক্লিক করুন এবং আপনার মডেলগুলো তৈরি হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করুন।
স্প্যানার স্টুডিও-র বাম প্যানে আপনি নিম্নলিখিত টেবিল এবং মডেলগুলি দেখতে পাবেন:

ডেটা লোড করুন
এখন, আপনাকে আপনার ডাটাবেসে কিছু প্রোডাক্ট ইনসার্ট করতে হবে। স্প্যানার স্টুডিওতে একটি নতুন ট্যাব খুলুন, তারপর নিচের ইনসার্ট স্টেটমেন্টগুলো কপি করে পেস্ট করুন:
INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);
ডেটা প্রবেশ করাতে run বাটনে ক্লিক করুন।
সারসংক্ষেপ
এই ধাপে আপনি স্কিমাটি তৈরি করেছেন এবং cymbal-bikes ডেটাবেসে কিছু প্রাথমিক ডেটা লোড করেছেন।
এরপরে
এরপরে, আপনি পণ্যের বিবরণের জন্য এমবেডিং তৈরি করতে এমবেডিং মডেলের সাথে ইন্টিগ্রেট করবেন, এবং প্রাসঙ্গিক পণ্য খোঁজার জন্য একটি টেক্সচুয়াল সার্চ রিকোয়েস্টকে এমবেডিং-এ রূপান্তর করবেন।
৫. এমবেডিং নিয়ে কাজ করুন
পণ্যের বিবরণের জন্য ভেক্টর এমবেডিং তৈরি করুন
পণ্যগুলোর উপর সাদৃশ্য অনুসন্ধান কাজ করার জন্য, আপনাকে পণ্যের বিবরণগুলোর জন্য এমবেডিং তৈরি করতে হবে।
স্কিমাতে EmbeddingsModel তৈরি করা থাকলে, এটি একটি সাধারণ UPDATE DML স্টেটমেন্ট।
UPDATE products p1
SET
productDescriptionEmbedding = (
SELECT embeddings.values
FROM
ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT productDescription AS content))
)
WHERE categoryId = 1;
পণ্যের বিবরণ আপডেট করতে run বাটনে ক্লিক করুন।
কোনো ত্রুটি দেখা দিলে, আরও বিস্তারিত ত্রুটির বার্তা পেতে টার্মিনালে gcloud কমান্ড ব্যবহার করে sql কমান্ডটি চালানোর চেষ্টা করুন, উদাহরণস্বরূপ:
gcloud spanner databases execute-sql <YOUR_DATA_BASE> --instance=<YOUR_INSTANCE> --sql 'UPDATE products p1
SET
productDescriptionEmbedding = (
SELECT embeddings.values
FROM
ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT productDescription AS content FROM products p2 WHERE p2.productId = p1.productId))
)
WHERE categoryId = 1;'
ভেক্টর অনুসন্ধান ব্যবহার করে
এই উদাহরণে, আপনি একটি SQL কোয়েরির মাধ্যমে স্বাভাবিক ভাষায় অনুসন্ধানের অনুরোধ জানাবেন। এই কোয়েরিটি অনুসন্ধানের অনুরোধটিকে একটি এমবেডিং-এ রূপান্তরিত করবে এবং তারপর পূর্ববর্তী ধাপে তৈরি করা পণ্যের বিবরণের সংরক্ষিত এমবেডিংগুলোর উপর ভিত্তি করে অনুরূপ ফলাফল অনুসন্ধান করবে।
-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.
SELECT
productName,
productDescription,
inventoryCount,
COSINE_DISTANCE(
productDescriptionEmbedding,
(
SELECT embeddings.values
FROM
ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" AS content))
)) AS distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;
অনুরূপ পণ্যগুলো খুঁজে পেতে run বাটনে ক্লিক করুন। ফলাফলগুলো দেখতে এইরকম হবে:

লক্ষ্য করুন যে কোয়েরিতে অতিরিক্ত ফিল্টার ব্যবহার করা হয়েছে, যেমন শুধুমাত্র স্টকে থাকা পণ্যগুলিতেই আগ্রহী হওয়া ( inventoryCount > 0 )।
সারসংক্ষেপ
এই ধাপে, আপনি VertexAI-এর মডেলগুলির সাথে Spanner-এর ইন্টিগ্রেশনকে কাজে লাগিয়ে SQL ব্যবহার করে পণ্যের বিবরণের এমবেডিং এবং একটি সার্চ রিকোয়েস্ট এমবেডিং তৈরি করেছেন। এছাড়াও, সার্চ রিকোয়েস্টের সাথে মেলে এমন অনুরূপ পণ্য খুঁজে বের করার জন্য আপনি একটি ভেক্টর সার্চও করেছেন।
পরবর্তী পদক্ষেপ
এরপরে, প্রতিটি পণ্যের জন্য একটি কাস্টম প্রতিক্রিয়া তৈরি করতে সার্চের ফলাফলগুলো একটি LLM-এ ইনপুট হিসেবে ব্যবহার করা যাক।
৬. এলএলএম-এর সাথে কাজ করুন
স্প্যানার ভার্টেক্সএআই থেকে পরিবেশিত এলএলএম মডেলগুলির সাথে ইন্টিগ্রেট করা সহজ করে তোলে। এর ফলে ডেভেলপাররা অ্যাপ্লিকেশনকে লজিক সম্পাদনের প্রয়োজন ছাড়াই সরাসরি এসকিউএল ব্যবহার করে এলএলএম-এর সাথে ইন্টারফেস করতে পারেন।
উদাহরণস্বরূপ, আমাদের কাছে "I'd like to buy a starter bike for my 3 year old child".
পণ্যটি ব্যবহারকারীর জন্য উপযুক্ত কিনা, সে বিষয়ে ডেভেলপার নিম্নলিখিত প্রম্পটটি ব্যবহার করে প্রতিটি ফলাফলের জন্য একটি প্রতিক্রিয়া জানাতে চান:
"Answer with 'Yes' or 'No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"
এখানে সেই কোয়েরিটি দেওয়া হলো যা আপনি ব্যবহার করতে পারেন:
-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM
ML.PREDICT(
MODEL LLMModel,
(
SELECT
FORMAT(
"""Answer with Yes or No and explain why: Is this a good fit for me?
I would like to buy a starter bike for my 3 year old child \n Product Name: %s\nProduct Description: %s""", productName,productDescription) AS prompt,
-- Pass through columns.
inventoryCount,
productName,
productDescription,
FROM products
WHERE inventoryCount > 0
ORDER BY
COSINE_DISTANCE(
productDescriptionEmbedding,
(
SELECT embeddings.values
FROM
ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" AS content))
))
LIMIT 5
));
কোয়েরিটি চালানোর জন্য run বাটনে ক্লিক করুন। ফলাফলটি দেখতে এইরকম হবে:

পণ্যের বিবরণে বয়সের সীমা (২-৪ বছর) উল্লেখ থাকায় প্রথম পণ্যটি ৩ বছর বয়সী শিশুর জন্য উপযুক্ত। অন্য পণ্যগুলো তেমন মানানসই নয়।
সারসংক্ষেপ
এই ধাপে, আপনি একজন ব্যবহারকারীর দেওয়া নির্দেশনার প্রাথমিক উত্তর তৈরি করার জন্য একটি LLM ব্যবহার করেছেন।
পরবর্তী পদক্ষেপ
এরপর, ভেক্টর সার্চ স্কেলিং করার জন্য কীভাবে এএনএন (ANN) ব্যবহার করতে হয়, তা শিখে নেওয়া যাক।
৭. স্কেলিং ভেক্টর অনুসন্ধান
পূর্ববর্তী ভেক্টর সার্চের উদাহরণগুলোতে এক্সাক্ট-কেএনএন ভেক্টর সার্চ ব্যবহার করা হয়েছিল। এটি তখন দারুণ কাজ করে যখন আপনি আপনার স্প্যানার ডেটার খুব নির্দিষ্ট উপসেটগুলো কোয়েরি করতে পারেন। এই ধরনের কোয়েরিগুলোকে হাইলি-পার্টিশনেবল বলা হয়।
যদি আপনার ওয়ার্কলোডগুলো সহজে বিভাজনযোগ্য না হয় এবং আপনার কাছে বিপুল পরিমাণ ডেটা থাকে, তাহলে লুকআপ পারফরম্যান্স বাড়ানোর জন্য আপনি ScaNN অ্যালগরিদম ব্যবহার করে ANN ভেক্টর সার্চ ব্যবহার করতে চাইবেন।
স্প্যানারে তা করতে হলে আপনাকে দুটি কাজ করতে হবে:
- একটি ভেক্টর সূচক তৈরি করুন
- APPROX দূরত্ব ফাংশনগুলো ব্যবহার করার জন্য আপনার কোয়েরিটি পরিবর্তন করুন।
ভেক্টর সূচক তৈরি করুন
এই ডেটাসেটে একটি ভেক্টর ইনডেক্স তৈরি করতে, আমাদের প্রথমে প্রতিটি ভেক্টরের দৈর্ঘ্য নির্ধারণ করার জন্য productDescriptionEmbeddings কলামটি পরিবর্তন করতে হবে। কোনো কলামে ভেক্টরের দৈর্ঘ্য যোগ করতে হলে, আপনাকে মূল কলামটি ড্রপ করে আবার তৈরি করতে হবে।
ALTER TABLE products DROP COLUMN productDescriptionEmbedding;
ALTER TABLE products
ADD COLUMN productDescriptionEmbedding ARRAY<FLOAT32>(vector_length => 768);
এরপরে, পূর্বে চালানো Generate Vector embedding ধাপটি থেকে আবার এমবেডিংগুলো তৈরি করুন।
UPDATE products p1
SET
productDescriptionEmbedding = (
SELECT embeddings.values
FROM
ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT productDescription AS content FROM products p2 WHERE p2.productId = p1.productId))
)
WHERE categoryId = 1;
কলামটি তৈরি করার পরে, ইনডেক্সটি তৈরি করুন:
CREATE VECTOR INDEX ProductDescriptionEmbeddingIndex
ON products(productDescriptionEmbedding)
WHERE productDescriptionEmbedding IS NOT NULL
OPTIONS (
distance_type = 'COSINE'
);
আপনি আগ্রহী হলে https://cloud.google.com/spanner/docs/backfill-embeddings লিঙ্কে PDML সম্পর্কে দেখে নিতে পারেন। একটি একক DML স্টেটমেন্ট হলো একটি ট্রানজ্যাকশন, যা ৮০ হাজার মিউটেশনের সীমাবদ্ধতার অধীন, তাই আপনি একবারে খুব বেশি সারি আপডেট করতে পারবেন না। PDML দক্ষতার সাথে এটিকে ছোট ছোট ব্যাচে ভাগ করে নেয়।
নতুন সূচক ব্যবহার করুন
নতুন ভেক্টর ইনডেক্সটি ব্যবহার করতে হলে, আপনাকে পূর্ববর্তী এমবেডিং কোয়েরিটি সামান্য পরিবর্তন করতে হবে।
মূল প্রশ্নটি হলো:
SELECT
productName,
productDescription,
inventoryCount,
COSINE_DISTANCE(
productDescriptionEmbedding,
(
SELECT embeddings.values
FROM
ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" AS content))
)) AS distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;
আপনাকে নিম্নলিখিত পরিবর্তনগুলো করতে হবে:
- নতুন ভেক্টর ইনডেক্সের জন্য একটি ইনডেক্স হিন্ট ব্যবহার করুন:
@{force_index=ProductDescriptionEmbeddingIndex} -
COSINE_DISTANCEফাংশন কলটিকেAPPROX_COSINE_DISTANCEএ পরিবর্তন করুন। উল্লেখ্য যে, নীচের চূড়ান্ত কোয়েরিতে থাকা JSON অপশনগুলোও আবশ্যক। - ML.PREDICT ফাংশন থেকে এমবেডিংগুলো আলাদাভাবে তৈরি করুন।
- এমবেডিংগুলোর ফলাফল চূড়ান্ত কোয়েরিতে কপি করুন।
এমবেডিংগুলো তৈরি করুন এবং ব্যবহার করুন:
-- Generate the prompt embeddings
SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
);
কোয়েরি থেকে প্রাপ্ত ফলাফলগুলো হাইলাইট করুন এবং সেগুলো কপি করুন।

এরপর, আপনার কপি করা এমবেডিংগুলো পেস্ট করে নিচের কোয়েরিতে থাকা <VECTOR> স্থানটি প্রতিস্থাপন করুন।
-- Generate the embeddings and query them using the vector index
SELECT
productName,
productDescription,
inventoryCount,
APPROX_COSINE_DISTANCE(
productDescriptionEmbedding,
array<float32>[@VECTOR],
options => JSON '{\"num_leaves_to_search\": 10}') AS distance
FROM products @{force_index = ProductDescriptionEmbeddingIndex}
WHERE productDescriptionEmbedding IS NOT NULL AND inventoryCount > 0
ORDER BY distance
LIMIT 5;
এটা দেখতে অনেকটা এইরকম হওয়া উচিত:

সারসংক্ষেপ
এই ধাপে, আপনি একটি ভেক্টর ইনডেক্স তৈরি করার জন্য আপনার স্কিমা রূপান্তর করেছেন। এবং তারপর ভেক্টর ইনডেক্স ব্যবহার করে এএনএন (ANN) সার্চ করার জন্য এমবেডিং কোয়েরিটি নতুন করে লিখেছেন। আপনার ডেটা বাড়ার সাথে সাথে ভেক্টর সার্চের ওয়ার্কলোড স্কেল করার জন্য এটি একটি গুরুত্বপূর্ণ পদক্ষেপ।
পরবর্তী পদক্ষেপ
এরপর, পরিষ্কার করার পালা!
৮. পরিষ্কার করা (ঐচ্ছিক)
পরিষ্কার করার জন্য, কোডল্যাবে তৈরি করা ' retail-demo ' ইনস্ট্যান্সটি ডিলিট করে দিন।

৯. অভিনন্দন!
অভিনন্দন, আপনি স্প্যানারের বিল্ট-ইন ভেক্টর সার্চ ব্যবহার করে সফলভাবে একটি সাদৃশ্য অনুসন্ধান সম্পন্ন করেছেন। এছাড়াও, আপনি দেখেছেন যে সরাসরি SQL ব্যবহার করে এমবেডিং এবং LLM মডেলের সাহায্যে জেনারেটিভ AI কার্যকারিতা প্রদান করা কতটা সহজ।
অবশেষে, আপনি ভেক্টর সার্চ ওয়ার্কলোড স্কেল করার জন্য ScaNN অ্যালগরিদম দ্বারা সমর্থিত ANN সার্চ সম্পাদনের প্রক্রিয়াটি শিখেছেন।
এরপর কী?
স্প্যানারের এক্সাক্ট নিয়ারেস্ট নেইবার (কেএনএন ভেক্টর সার্চ) ফিচার সম্পর্কে আরও জানতে এখানে দেখুন: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors
স্প্যানারের আনুমানিক নিকটতম প্রতিবেশী (ANN ভেক্টর অনুসন্ধান) বৈশিষ্ট্য সম্পর্কে আরও জানুন এখানে: https://cloud.google.com/spanner/docs/find-approximate-nearest-neighbors
স্প্যানারের VertexAI ইন্টিগ্রেশন ব্যবহার করে SQL দিয়ে কীভাবে অনলাইন প্রেডিকশন করা যায়, সে সম্পর্কে আরও জানতে আপনি এখানে পড়তে পারেন: https://cloud.google.com/spanner/docs/ml
