স্প্যানার ভেক্টর অনুসন্ধানের সাথে শুরু করা

১. ভূমিকা

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

স্প্যানারে বিল্ট-ইন ভেক্টর সার্চ সাপোর্ট রয়েছে, যা আপনাকে এক্সাক্ট কে-নিয়ারেস্ট নেইবার (KNN) অথবা অ্যাপ্রক্সিমেট নিয়ারেস্ট নেইবার (ANN) ফিচার ব্যবহার করে বৃহৎ পরিসরে সিমিলারিটি বা সিমান্টিক সার্চ করতে এবং রিট্রিভাল অগমেন্টেড জেনারেশন (RAG) বাস্তবায়ন করতে সক্ষম করে।

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

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

The architecture would look like this:

d179a760add7adc0.png

এই ভিত্তির ওপর দাঁড়িয়ে, আপনি শিখবেন কীভাবে ScaNN অ্যালগরিদম দ্বারা সমর্থিত একটি ভেক্টর ইনডেক্স তৈরি করতে হয়, এবং আপনার সিমান্টিক ওয়ার্কলোড স্কেল করার প্রয়োজন হলে APPROX ডিসট্যান্স ফাংশনগুলো ব্যবহার করতে হয়।

আপনি যা তৈরি করবেন

As part of this lab, you will:

  • Create a Spanner instance
  • VertexAI-এর এমবেডিং এবং LLM মডেলের সাথে ইন্টিগ্রেট করার জন্য স্প্যানারের ডাটাবেস স্কিমা সেট আপ করুন।
  • Load a retail data set
  • ডেটাসেটের বিরুদ্ধে সাদৃশ্য অনুসন্ধান কোয়েরি চালান।
  • পণ্য-নির্দিষ্ট সুপারিশ প্রণয়নের জন্য এলএলএম মডেলের প্রেক্ষাপট প্রদান করুন।
  • Modify the schema and create a vector index.
  • নতুন তৈরি করা ভেক্টর ইনডেক্সটি ব্যবহার করার জন্য কোয়েরিগুলো পরিবর্তন করুন।

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

  • How to setup a Spanner instance
  • How to integrate with VertexAI
  • একটি রিটেইল ডেটাসেটে অনুরূপ আইটেম খুঁজে বের করার জন্য ভেক্টর সার্চ করতে স্প্যানার কীভাবে ব্যবহার করবেন
  • এএনএন সার্চ ব্যবহার করে ভেক্টর সার্চ ওয়ার্কলোড স্কেল করার জন্য আপনার ডাটাবেসকে কীভাবে প্রস্তুত করবেন।

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

  • একটি গুগল ক্লাউড প্রজেক্ট যা একটি বিলিং অ্যাকাউন্টের সাথে সংযুক্ত।
  • A web browser, such as Chrome or Firefox .

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

একটি প্রকল্প তৈরি করুন

আপনার যদি আগে থেকে কোনো গুগল অ্যাকাউন্ট (জিমেইল বা গুগল অ্যাপস) না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে। গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে ( console.cloud.google.com ) সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন।

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

6c9406d9b014760.png

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

949d83c8a4ee17d9.png

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

870a3cbd6541ee86.png

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

6a92c57d3250a4b3.png

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

এরপরে, যদি আপনি আগে থেকে তা না করে থাকেন, তাহলে Google Cloud রিসোর্স ব্যবহার করতে এবং Spanner API সক্রিয় করতে আপনাকে ডেভেলপার কনসোলে বিলিং চালু করতে হবে।

15d0ef27a8fbab27.png

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

গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা ৩০০ ডলারের একটি ফ্রি ট্রায়ালের জন্য যোগ্য, যার ফলে এই কোডল্যাবটি সম্পূর্ণ বিনামূল্যে পাওয়া যাবে।

গুগল ক্লাউড শেল সেটআপ

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

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

  1. ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল 'Activate Cloud Shell'-এ ক্লিক করুন। gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (পরিবেশের জন্য ব্যবস্থা করতে এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত)।

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSr Dc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRwScreen Shot 2017-06-14 at 10.13.43 PM.png

ক্লাউড শেলে সংযুক্ত হওয়ার পর আপনি দেখতে পাবেন যে, আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার 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 খুঁজছেন? সেটআপের ধাপগুলিতে আপনি কোন আইডি ব্যবহার করেছিলেন তা দেখে নিন অথবা ক্লাউড কনসোল ড্যাশবোর্ডে এটি খুঁজে দেখুন:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা ভবিষ্যতে কমান্ড চালানোর সময় কাজে লাগতে পারে।

echo $GOOGLE_CLOUD_PROJECT

কমান্ড আউটপুট

<PROJECT_ID>

Enable the Spanner API

gcloud services enable spanner.googleapis.com

সারসংক্ষেপ

এই ধাপে আপনি আপনার প্রজেক্ট সেট আপ করেছেন (যদি আগে থেকে না থাকে), ক্লাউড শেল সক্রিয় করেছেন এবং প্রয়োজনীয় API-গুলো চালু করেছেন।

এরপরে

এরপরে, আপনি স্প্যানার ইনস্ট্যান্স এবং ডেটাবেস সেট আপ করবেন।

3. Create a Spanner instance and database

Create the Spanner instance

এই ধাপে আমরা কোডল্যাবের জন্য আমাদের স্প্যানার ইনস্ট্যান্স সেট আপ করব। এটি করার জন্য, ক্লাউড শেল খুলুন এবং এই কমান্ডটি চালান:

export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
--edition=ENTERPRISE

Command output:

$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
--edition=ENTERPRISE
Creating instance...done.

Create the database

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

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

ডাটাবেস তৈরি করতে, আবার gcloud কমান্ড লাইন টুলটি ব্যবহার করুন:

export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

Command output:

$ gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID
Creating database...done.

সারসংক্ষেপ

এই ধাপে আপনি স্প্যানার ইনস্ট্যান্স এবং ডেটাবেস তৈরি করেছেন।

এরপরে

এরপরে, আপনি স্প্যানার স্কিমা এবং ডেটা সেট আপ করবেন।

4. Load Cymbal schema and data

Create the Cymbal schema

স্কিমা সেট আপ করতে, স্প্যানার স্টুডিওতে যান:

3e1a0fed928b33cf.png

স্কিমাটির দুটি অংশ রয়েছে। প্রথমে, আপনাকে 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 MODEL EmbeddingsModel INPUT(
content STRING(MAX),
) OUTPUT(
embeddings STRUCT<statistics STRUCT<truncated BOOL, token_count FLOAT32>, values ARRAY<FLOAT32>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-embedding-004'
);


CREATE 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-3.1-pro-preview',
default_batch_size = 1
);

এরপর, run বাটনে ক্লিক করুন এবং আপনার মডেলগুলো তৈরি হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করুন।

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

62455aa4b0e839d9.png

Load the data

এখন, আপনাকে আপনার ডাটাবেসে কিছু প্রোডাক্ট ইনসার্ট করতে হবে। স্প্যানার স্টুডিওতে একটি নতুন ট্যাব খুলুন, তারপর নিচের ইনসার্ট স্টেটমেন্টগুলো কপি করে পেস্ট করুন:

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);

Click the run button to insert the data.

সারসংক্ষেপ

এই ধাপে আপনি স্কিমাটি তৈরি করেছেন এবং cymbal-bikes ডেটাবেসে কিছু প্রাথমিক ডেটা লোড করেছেন।

এরপরে

এরপরে, আপনি পণ্যের বিবরণের জন্য এমবেডিং তৈরি করতে এমবেডিং মডেলের সাথে ইন্টিগ্রেট করবেন, এবং প্রাসঙ্গিক পণ্য খোঁজার জন্য একটি টেক্সচুয়াল সার্চ রিকোয়েস্টকে এমবেডিং-এ রূপান্তর করবেন।

5. Work with embeddings

পণ্যের বিবরণের জন্য ভেক্টর এমবেডিং তৈরি করুন

পণ্যগুলোর উপর সাদৃশ্য অনুসন্ধান কাজ করার জন্য, আপনাকে পণ্যের বিবরণগুলোর জন্য এমবেডিং তৈরি করতে হবে।

স্কিমাতে EmbeddingsModel তৈরি করা থাকলে, এটি একটি সাধারণ UPDATE DML স্টেটমেন্ট।

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;

পণ্যের বিবরণ আপডেট করতে run বাটনে ক্লিক করুন।

এই উদাহরণে, আপনি একটি 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 বাটনে ক্লিক করুন। ফলাফলগুলো দেখতে এইরকম হবে:

672e111753077fcf.png

লক্ষ্য করুন যে কোয়েরিতে অতিরিক্ত ফিল্টার ব্যবহার করা হয়েছে, যেমন শুধুমাত্র স্টকে থাকা পণ্যগুলিতেই আগ্রহী হওয়া ( inventoryCount > 0 )।

সারসংক্ষেপ

এই ধাপে, আপনি VertexAI-এর মডেলগুলির সাথে Spanner-এর ইন্টিগ্রেশনকে কাজে লাগিয়ে SQL ব্যবহার করে পণ্যের বিবরণের এমবেডিং এবং একটি সার্চ রিকোয়েস্ট এমবেডিং তৈরি করেছেন। এছাড়াও, সার্চ রিকোয়েস্টের সাথে মেলে এমন অনুরূপ পণ্য খুঁজে বের করার জন্য আপনি একটি ভেক্টর সার্চও করেছেন।

পরবর্তী পদক্ষেপ

এরপরে, প্রতিটি পণ্যের জন্য একটি কাস্টম প্রতিক্রিয়া তৈরি করতে সার্চের ফলাফলগুলো একটি LLM-এ ইনপুট হিসেবে ব্যবহার করা যাক।

6. Work with an 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"

Here is the query you can use:

-- 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
inventoryCount,
productName,
productDescription,
CONCAT(
"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 \n",
"Product Name: ", productName, "\n",
"Product Description:", productDescription) AS prompt,
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
),
STRUCT(256 AS maxOutputTokens)
);

কোয়েরিটি চালানোর জন্য run বাটনে ক্লিক করুন। ফলাফলটি দেখতে এইরকম হবে:

35878cd0f88f1470.png

পণ্যের বিবরণে বয়সের সীমা (২-৪ বছর) উল্লেখ থাকায় প্রথম পণ্যটি ৩ বছর বয়সী শিশুর জন্য উপযুক্ত। অন্য পণ্যগুলো তেমন মানানসই নয়।

সারসংক্ষেপ

এই ধাপে, আপনি একজন ব্যবহারকারীর দেওয়া নির্দেশনার প্রাথমিক উত্তর তৈরি করার জন্য একটি LLM ব্যবহার করেছেন।

পরবর্তী পদক্ষেপ

এরপর, ভেক্টর সার্চ স্কেলিং করার জন্য কীভাবে এএনএন (ANN) ব্যবহার করতে হয়, তা শিখে নেওয়া যাক।

7. Scaling vector search

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

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

স্প্যানারে তা করতে হলে আপনাকে দুটি কাজ করতে হবে:

  • Create a Vector Index
  • APPROX দূরত্ব ফাংশনগুলো ব্যবহার করার জন্য আপনার কোয়েরিটি পরিবর্তন করুন।

Create the Vector Index

এই ডেটাসেটে একটি ভেক্টর ইনডেক্স তৈরি করতে, আমাদের প্রথমে প্রতিটি ভেক্টরের দৈর্ঘ্য নির্ধারণ করার জন্য 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;

After the column is created, create the index:

CREATE VECTOR INDEX ProductDescriptionEmbeddingIndex
    ON products(productDescriptionEmbedding)
    WHERE productDescriptionEmbedding IS NOT NULL
OPTIONS (
 distance_type = 'COSINE'
);

Use the new index

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

Here's the original query:

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;

You will have to do the following changes:

  • নতুন ভেক্টর ইনডেক্সের জন্য একটি ইনডেক্স হিন্ট ব্যবহার করুন: @{force_index=ProductDescriptionEmbeddingIndex}
  • COSINE_DISTANCE ফাংশন কলটিকে APPROX_COSINE_DISTANCE এ পরিবর্তন করুন। উল্লেখ্য যে, নীচের চূড়ান্ত কোয়েরিতে থাকা JSON অপশনগুলোও আবশ্যক।
  • ML.PREDICT ফাংশন থেকে এমবেডিংগুলো আলাদাভাবে তৈরি করুন।
  • এমবেডিংগুলোর ফলাফল চূড়ান্ত কোয়েরিতে কপি করুন।

Generate the embeddings

-- 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)
  )
)

কোয়েরি থেকে প্রাপ্ত ফলাফলগুলো হাইলাইট করুন এবং সেগুলো কপি করুন।

1b43c5ae4ef9ab68.png

এরপর, আপনার কপি করা এমবেডিংগুলো পেস্ট করে নিচের কোয়েরিতে থাকা <VECTOR> স্থানটি প্রতিস্থাপন করুন।

-- Embedding query now using the vector index


SELECT productName, productDescription, inventoryCount,
  APPROX_COSINE_DISTANCE(productDescriptionEmbedding, array<float32>[@VECTOR], options => JSON '{\"num_leaves_to_search\": 10}')
FROM products @{force_index=ProductDescriptionEmbeddingIndex}
WHERE productDescriptionEmbedding IS NOT NULL AND inventoryCount > 0
ORDER BY distance
LIMIT 5;

It should look something like this:

12397107ec49c491.png

সারসংক্ষেপ

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

পরবর্তী পদক্ষেপ

Next, it is time to clean up!

8. Cleaning up (optional)

পরিষ্কার করার জন্য, ক্লাউড কনসোলের ক্লাউড স্প্যানার বিভাগে যান এবং কোডল্যাবে আমাদের তৈরি করা ' retail-demo ' ইনস্ট্যান্সটি ডিলিট করে দিন।

41cbc1a84b3588d5.png

৯. অভিনন্দন!

অভিনন্দন, আপনি স্প্যানারের বিল্ট-ইন ভেক্টর সার্চ ব্যবহার করে সফলভাবে একটি সাদৃশ্য অনুসন্ধান সম্পন্ন করেছেন। এছাড়াও, আপনি দেখেছেন যে সরাসরি 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