স্প্যানার এআই এবং গ্রাফের মাধ্যমে রিয়েল-টাইম খুচরা সুপারিশ

1. ভূমিকা

এই কোডল্যাবটি আপনাকে স্প্যানারের এআই এবং গ্রাফ ক্ষমতা ব্যবহার করে একটি বিদ্যমান খুচরা ডাটাবেস উন্নত করার বিষয়ে নির্দেশনা দেবে। আপনার গ্রাহকদের আরও ভাল পরিষেবা প্রদানের জন্য স্প্যানারের মধ্যে মেশিন লার্নিং ব্যবহারের ব্যবহারিক কৌশলগুলি আপনি শিখবেন। বিশেষ করে, আমরা গ্রাহকদের চাহিদার সাথে সামঞ্জস্যপূর্ণ নতুন পণ্য আবিষ্কার করার জন্য k-Nearest Neighbours (kNN) এবং Approximate Nearest Neighbours (ANN) বাস্তবায়ন করব। কেন একটি নির্দিষ্ট পণ্য সুপারিশ করা হয়েছিল তার স্পষ্ট, প্রাকৃতিক-ভাষা ব্যাখ্যা প্রদানের জন্য আপনি একটি LLMও সংহত করবেন।

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

দৃশ্যকল্প

আপনি একজন ইলেকট্রনিক্স সরঞ্জাম খুচরা বিক্রেতার জন্য কাজ করেন। আপনার ই-কমার্স সাইটে Products , Orders এবং OrderItems সহ একটি স্ট্যান্ডার্ড স্প্যানার ডাটাবেস রয়েছে।

একজন গ্রাহক আপনার সাইটে একটি নির্দিষ্ট প্রয়োজন নিয়ে আসেন: "আমি একটি উচ্চ-কার্যক্ষমতাসম্পন্ন কীবোর্ড কিনতে চাই। আমি মাঝে মাঝে সমুদ্র সৈকতে থাকাকালীন কোডিং করি যাতে এটি ভিজে যেতে পারে।"

আপনার লক্ষ্য হল স্প্যানারের উন্নত বৈশিষ্ট্যগুলি ব্যবহার করে এই অনুরোধের বুদ্ধিমত্তার সাথে উত্তর দেওয়া:

  1. খুঁজুন: সাধারণ কীওয়ার্ড অনুসন্ধানের বাইরে গিয়ে ভেক্টর অনুসন্ধান ব্যবহার করে এমন পণ্যগুলি খুঁজুন যার বর্ণনা ব্যবহারকারীর অনুরোধের সাথে অর্থপূর্ণভাবে মেলে।
  2. ব্যাখ্যা করুন: সেরা মিলগুলি বিশ্লেষণ করতে একটি LLM ব্যবহার করুন এবং কেন সুপারিশটি উপযুক্ত তা ব্যাখ্যা করুন, যা গ্রাহকদের আস্থা তৈরি করবে।
  3. সম্পর্কিত: গ্রাহকরা প্রায়শই যে পণ্যগুলি কিনে থাকেন এবং সেই সুপারিশের সাথে সম্পর্কিত অন্যান্য পণ্যগুলি খুঁজে পেতে গ্রাফ কোয়েরি ব্যবহার করুন।

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

  1. একটি প্রকল্প তৈরি করুন গুগল ক্লাউড কনসোলে, প্রকল্প নির্বাচক পৃষ্ঠায়, একটি গুগল ক্লাউড প্রকল্প নির্বাচন করুন বা তৈরি করুন।
  2. বিলিং সক্ষম করুন আপনার ক্লাউড প্রকল্পের জন্য বিলিং সক্ষম আছে কিনা তা নিশ্চিত করুন। কোনও প্রকল্পে বিলিং সক্ষম আছে কিনা তা কীভাবে পরীক্ষা করবেন তা শিখুন।
  3. ক্লাউড শেল সক্রিয় করুন কনসোলে "ক্লাউড শেল সক্রিয় করুন" বোতামে ক্লিক করে ক্লাউড শেল সক্রিয় করুন। আপনি ক্লাউড শেল টার্মিনাল এবং এডিটরের মধ্যে টগল করতে পারেন।

c3c8bfefc88138cc.png

  1. প্রকল্প অনুমোদন এবং সেট করুন ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, পরীক্ষা করুন যে আপনি প্রমাণীকরণ করেছেন এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে।
gcloud auth list
gcloud config list project
  1. যদি আপনার প্রকল্পটি সেট না করা থাকে, তাহলে এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন, <PROJECT_ID> আপনার প্রকৃত প্রকল্প আইডি দিয়ে প্রতিস্থাপন করুন:
export PROJECT_ID=<PROJECT_ID>
gcloud config set project $PROJECT_ID
  1. প্রয়োজনীয় API গুলি সক্ষম করুন স্প্যানার, ভার্টেক্স এআই এবং কম্পিউট ইঞ্জিন API গুলি সক্ষম করুন। এতে কয়েক মিনিট সময় লাগতে পারে।
gcloud services enable \
    spanner.googleapis.com \
    aiplatform.googleapis.com \
    compute.googleapis.com
  1. কিছু পরিবেশ ভেরিয়েবল সেট করুন যা আপনি পুনরায় ব্যবহার করবেন।
export INSTANCE_ID=my-first-spanner
export INSTANCE_CONFIG=regional-us-central1
  1. যদি আপনার কাছে ইতিমধ্যেই Spanner ইনস্ট্যান্স না থাকে, তাহলে একটি বিনামূল্যে ট্রায়াল Spanner ইনস্ট্যান্স তৈরি করুন । আপনার ডাটাবেস হোস্ট করার জন্য আপনার একটি Spanner ইনস্ট্যান্সের প্রয়োজন হবে। আমরা কনফিগারেশন হিসেবে regional-us-central1 ব্যবহার করব। আপনি চাইলে এটি আপডেট করতে পারেন।
gcloud spanner instances create $INSTANCE_ID \
   --instance-type=free-instance --config=$INSTANCE_CONFIG \
   --description="Trial Instance" 

৩. স্থাপত্য সারসংক্ষেপ

স্প্যানারে ভার্টেক্স এআই-তে হোস্ট করা মডেলগুলি ছাড়া সমস্ত প্রয়োজনীয় কার্যকারিতা অন্তর্ভুক্ত রয়েছে।

৪. ধাপ ১: ডাটাবেস সেট আপ করুন এবং আপনার প্রথম প্রশ্ন জমা দিন।

প্রথমে, আমাদের ডাটাবেস তৈরি করতে হবে, আমাদের নমুনা খুচরা ডেটা লোড করতে হবে এবং স্প্যানারকে ভার্টেক্স এআই-এর সাথে কীভাবে যোগাযোগ করতে হবে তা বলতে হবে।

এই বিভাগের জন্য, আপনি নীচের SQL স্ক্রিপ্টগুলি ব্যবহার করবেন।

  1. স্প্যানারের পণ্য পৃষ্ঠায় যান।
  2. সঠিক উদাহরণটি নির্বাচন করুন।

a8792346efb017d5.png সম্পর্কে

  1. স্ক্রিনে, Explore Datasets নির্বাচন করুন। তারপর পপ-আপে "Retail" বিকল্পটি নির্বাচন করুন।

49800ad520771ecb.png সম্পর্কে

c2a7cd37d5c1c493.png সম্পর্কে

  1. স্প্যানার স্টুডিওতে যান। স্প্যানার স্টুডিওতে একটি এক্সপ্লোরার প্যান রয়েছে যা একটি কোয়েরি এডিটর এবং একটি SQL কোয়েরি ফলাফল টেবিলের সাথে একীভূত হয়। আপনি এই একটি ইন্টারফেস থেকে DDL, DML এবং SQL স্টেটমেন্ট চালাতে পারেন। আপনাকে পাশের মেনুটি প্রসারিত করতে হবে, ম্যাগনিফাইং গ্লাসটি খুঁজতে হবে।

b6a188814a821aba.png সম্পর্কে

  1. পণ্য সারণীটি পড়ুন। একটি নতুন ট্যাব তৈরি করুন অথবা ইতিমধ্যে তৈরি "শিরোনামহীন ক্যোয়ারী" ট্যাবটি ব্যবহার করুন।

cb65b9aa4e7138b1.png সম্পর্কে

SELECT *
FROM Products;

৫. ধাপ ২: এআই মডেল তৈরি করুন।

এবার, Spanner অবজেক্ট দিয়ে রিমোট মডেল তৈরি করা যাক। এই SQL স্টেটমেন্টগুলো Spanner অবজেক্ট তৈরি করে যা Vertex AI এন্ডপয়েন্টের সাথে লিঙ্ক করে।

  1. স্প্যানার স্টুডিওতে একটি নতুন ট্যাব খুলুন এবং আপনার দুটি মডেল তৈরি করুন। প্রথমটি হল EmbeddingsModel যা আপনাকে এম্বেডিং তৈরি করতে দেবে। দ্বিতীয়টি হল LLMModel যা আপনাকে একটি LLM এর সাথে ইন্টারঅ্যাক্ট করতে দেবে (আমাদের উদাহরণে, এটি gemini-2.5-flash)। নিশ্চিত করুন যে আপনি আপনার প্রোজেক্ট আইডি দিয়ে <PROJECT_ID> আপডেট করেছেন।
### Create the Embedding Model object in Spanner
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-005'
);

### Create the LLM Model object in Spanner
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-2.5-flash',
default_batch_size = 1
);
  1. দ্রষ্টব্য: PROJECT_ID আপনার প্রকৃত $PROJECT_ID দিয়ে প্রতিস্থাপন করতে ভুলবেন না।

67f60ff3a90e926c.png সম্পর্কে

এই ধাপটি পরীক্ষা করুন: SQL এডিটরে নিম্নলিখিতটি চালিয়ে আপনি মডেলগুলি তৈরি হয়েছে কিনা তা যাচাই করতে পারেন।

SELECT *
FROM information_schema.models;

9d2c9cab3733a964.png সম্পর্কে

৬. ধাপ ৩: ভেক্টর এম্বেডিং তৈরি এবং সংরক্ষণ করুন

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

  1. এম্বেডিং সমর্থন করার জন্য একটি নতুন টেবিল তৈরি করুন। প্রথমে এমন একটি টেবিল তৈরি করুন যা এম্বেডিং সমর্থন করতে পারে। আমরা পণ্য টেবিল নমুনা এম্বেডিং থেকে আলাদা একটি এম্বেডিং মডেল ব্যবহার করছি। ভেক্টর অনুসন্ধান সঠিকভাবে কাজ করার জন্য আপনাকে নিশ্চিত করতে হবে যে এম্বেডিংগুলি একই মডেল থেকে তৈরি করা হয়েছে।
CREATE TABLE products_with_embeddings (
   ProductID INT64,
   embedding_vector ARRAY<FLOAT32>(vector_length=>768),
   embedding_text STRING(MAX)
)
PRIMARY KEY (ProductID);
  1. মডেল থেকে তৈরি এম্বেডিং দিয়ে নতুন টেবিলটি পূরণ করুন। সরলীকরণের জন্য আমরা এখানে একটি insert into statement ব্যবহার করছি। এটি কোয়েরির ফলাফলগুলিকে আপনার তৈরি করা টেবিলে ঠেলে দেবে।

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

INSERT INTO products_with_embeddings (productId, embedding_text, embedding_vector)
SELECT
ProductID,
content as embedding_text,
embeddings.values as embedding_vector
FROM ML.PREDICT(
 MODEL EmbeddingsModel,
 (
   SELECT
   ProductID,
   embedding_text AS content
   FROM (
     SELECT
       ProductID,
       CONCAT(
         Category,
         " ",
         Description,
         " ",
         Name
       ) AS embedding_text
       FROM products)));
  1. আপনার নতুন এম্বেডিংগুলি পরীক্ষা করুন। এখন আপনি যে এম্বেডিংগুলি তৈরি করেছিলেন তা দেখতে পাবেন।
SELECT *
FROM products_with_embeddings
LIMIT 1;

d40975087736e604.png

৭. ধাপ ৪: ANN অনুসন্ধানের জন্য একটি ভেক্টর সূচক তৈরি করুন

লক্ষ লক্ষ ভেক্টর তাৎক্ষণিকভাবে অনুসন্ধান করার জন্য, আমাদের একটি সূচকের প্রয়োজন। এই সূচকটি A proximate N earest N eighbor (ANN) অনুসন্ধান সক্ষম করে, যা অবিশ্বাস্যভাবে দ্রুত এবং অনুভূমিকভাবে স্কেল করে।

  1. সূচক তৈরি করতে নিম্নলিখিত DDL কোয়েরিটি চালান। আমরা আমাদের দূরত্ব মেট্রিক হিসাবে COSINE নির্দিষ্ট করি, যা শব্দার্থিক পাঠ্য অনুসন্ধানের জন্য দুর্দান্ত। মনে রাখবেন, WHERE ক্লজটি আসলে প্রয়োজনীয় কারণ স্প্যানার এটিকে কোয়েরির জন্য একটি প্রয়োজনীয়তা করে তুলবে।
CREATE VECTOR INDEX DescriptionEmbeddingIndex
   ON products_with_embeddings(embedding_vector)
   WHERE embedding_vector IS NOT NULL
OPTIONS (
 distance_type = 'COSINE'
);
  1. অপারেশন ট্যাবে আপনার সূচক তৈরির অবস্থা পরীক্ষা করুন।

2ad9c88bc86b77f0.png সম্পর্কে

৮. ধাপ ৫: K-Nearest Neighbor (KNN) অনুসন্ধানের মাধ্যমে সুপারিশ খুঁজুন

এবার মজার অংশে! আসুন এমন পণ্য খুঁজে বের করি যা আমাদের গ্রাহকের প্রশ্নের সাথে মেলে: "আমি একটি উচ্চ কার্যকারিতার কীবোর্ড কিনতে চাই। আমি মাঝে মাঝে সমুদ্র সৈকতে থাকাকালীন কোডিং করি যাতে এটি ভিজে যেতে পারে।"

আমরা K - N earest N eighbor (KNN) অনুসন্ধান দিয়ে শুরু করব। এটি একটি সঠিক অনুসন্ধান যা আমাদের কোয়েরি ভেক্টরকে প্রতিটি পণ্য ভেক্টরের সাথে তুলনা করে। এটি সুনির্দিষ্ট কিন্তু খুব বড় ডেটাসেটে ধীর হতে পারে (যার কারণে আমরা ধাপ 5 এর জন্য একটি ANN সূচক তৈরি করেছি)।

এই কোয়েরি দুটি কাজ করে:

  1. একটি সাবকোয়েরি আমাদের গ্রাহকের প্রশ্নের জন্য এম্বেডিং ভেক্টর পেতে ML.PREDICT ব্যবহার করে।
  2. বাইরের কোয়েরিটি কোয়েরি ভেক্টর এবং প্রতিটি পণ্যের embedding_vector এর মধ্যে "দূরত্ব" গণনা করতে COSINE_DISTANCE ব্যবহার করে। কম দূরত্ব মানে আরও ভালো মিল।
SELECT
    productid,
    embedding_text,
    COSINE_DISTANCE(
      embedding_vector,
      (
        SELECT embeddings.values
        FROM ML.PREDICT(
          MODEL EmbeddingsModel,
          (SELECT "I'd like to buy a high performance keyboard. I sometimes code while I'm at the beach so it may get wet." AS content)
        )
      )
    ) AS distance
FROM products_with_embeddings
WHERE embedding_vector IS NOT NULL
ORDER BY distance
LIMIT 5;

আপনার পণ্যের একটি তালিকা দেখা উচিত, যার একেবারে উপরে জল প্রতিরোধী কীবোর্ড রয়েছে।

৯. ধাপ ৬: আনুমানিক (ANN) অনুসন্ধানের মাধ্যমে সুপারিশগুলি খুঁজুন

KNN দুর্দান্ত, কিন্তু লক্ষ লক্ষ পণ্য এবং প্রতি সেকেন্ডে হাজার হাজার প্রশ্নের একটি উৎপাদন ব্যবস্থার জন্য, আমাদের ANN সূচকের গতি প্রয়োজন।

সূচক ব্যবহার করার জন্য আপনাকে APPROX_COSINE_DISTANCE ফাংশনটি নির্দিষ্ট করতে হবে।

  1. উপরের মতো করে আপনার লেখার ভেক্টর এম্বেডিংটি পান। আমরা এর ফলাফলগুলিকে products_with_embeddings টেবিলের রেকর্ডগুলির সাথে ক্রস-জুন করেছি যাতে আপনি এটি আপনার APPROX_COSINE_DISTANCE ফাংশনে ব্যবহার করতে পারেন।
WITH vector_query as
(
 SELECT embeddings.values as vector
 FROM ML.PREDICT(
 MODEL EmbeddingsModel,
  (SELECT "I'd like to buy a high performance keyboard. I sometimes code while I'm at the beach so it may get wet." as content)
 )
)
SELECT
ProductID,
embedding_text,
APPROX_COSINE_DISTANCE(embedding_vector, vector, options => JSON '{\"num_leaves_to_search\": 10}') distance
FROM products_with_embeddings @{force_index=DescriptionEmbeddingIndex},
vector_query
WHERE embedding_vector IS NOT NULL
ORDER BY distance
LIMIT 5;

প্রত্যাশিত আউটপুট: ফলাফলগুলি KNN কোয়েরির সাথে অভিন্ন বা খুব মিল হওয়া উচিত, তবে সূচক ব্যবহার করে এটি অনেক বেশি দক্ষতার সাথে কার্যকর করা হয়েছে। আপনি উদাহরণে এটি লক্ষ্য নাও করতে পারেন।

১০. ধাপ ৭: সুপারিশ ব্যাখ্যা করার জন্য একটি LLM ব্যবহার করুন

শুধুমাত্র পণ্যের তালিকা দেখানো ভালো, কিন্তু কেন বা কেন এটি ভালো বা খারাপ নয় তা ব্যাখ্যা করা ভালো। আমরা এটি করার জন্য আমাদের LLMModel (Gemini) ব্যবহার করতে পারি।

এই কোয়েরিটি আমাদের ধাপ ৪ থেকে KNN কোয়েরিটিকে একটি ML.PREDICT কলের ভিতরে রাখে। আমরা LLM এর জন্য একটি প্রম্পট তৈরি করতে CONCAT ব্যবহার করি, যা দেয়:

  1. একটি স্পষ্ট নির্দেশনা ("'হ্যাঁ' অথবা 'না' দিয়ে উত্তর দিন এবং কেন তা ব্যাখ্যা করুন...")।
  2. গ্রাহকের মূল প্রশ্ন।
  3. প্রতিটি সেরা ম্যাচিং পণ্যের নাম এবং বর্ণনা।

এরপর LLM প্রতিটি পণ্যকে প্রশ্নের বিপরীতে মূল্যায়ন করে এবং একটি স্বাভাবিক ভাষাগত প্রতিক্রিয়া প্রদান করে।

SELECT
   ProductID,
   embedding_text,
   content AS LLMResponse
FROM ML.PREDICT(
   MODEL LLMModel,
   (
     SELECT
       ProductID,
       embedding_text,
       CONCAT(
         "Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me?",
         "I'd like to buy a high performance keyboard. I sometimes code while I'm at the beach so it may get wet. \n",
         "Product Description:", embedding_text
       ) AS prompt,
     FROM products_with_embeddings
     WHERE embedding_vector IS NOT NULL
     ORDER BY COSINE_DISTANCE(
       embedding_vector,
       (
         SELECT embeddings.values
         FROM ML.PREDICT(
           MODEL EmbeddingsModel,
           (SELECT "I'd like to buy a high performance keyboard. I sometimes code while I'm at the beach so it may get wet." AS content)
         )
       )
     )
     LIMIT 5
   ),
   STRUCT(1056 AS maxOutputTokens)
);

প্রত্যাশিত ফলাফল: আপনি একটি নতুন LLMResponse কলাম সহ একটি টেবিল পাবেন। উত্তরটি এরকম হওয়া উচিত: " না । কারণ এখানে: * "জল-প্রতিরোধী" "জল-প্রতিরোধী" নয়। একটি "জল-প্রতিরোধী" কীবোর্ড স্প্ল্যাশ, হালকা বৃষ্টি বা ছিটকে পড়া সহ্য করতে পারে"

১১. ধাপ ৮: একটি সম্পত্তি গ্রাফ তৈরি করুন

এবার ভিন্ন ধরণের সুপারিশের জন্য: "যারা এটি কিনেছেন তারাও কিনেছেন..."

এটি একটি সম্পর্ক-ভিত্তিক কোয়েরি। এর জন্য নিখুঁত টুল হল একটি প্রপার্টি গ্রাফ । স্প্যানার আপনাকে ডেটা ডুপ্লিকেট না করেই আপনার বিদ্যমান টেবিলের উপরে একটি গ্রাফ তৈরি করতে দেয়।

এই DDL বিবৃতিটি আমাদের গ্রাফকে সংজ্ঞায়িত করে:

  • নোড: Product এবং User টেবিল। নোড হল সেই সত্তা যাদের থেকে আপনি একটি সম্পর্ক তৈরি করতে চান, আপনি জানতে চান যে আপনার পণ্য কেনা গ্রাহকরা 'XYZ' পণ্যও কিনেছেন।
  • এজ: Orders টেবিল, যা একজন User (উৎস) কে "ক্রয়কৃত" লেবেল সহ একটি Product (গন্তব্য) এর সাথে সংযুক্ত করে। এজগুলি একজন ব্যবহারকারী এবং তিনি যা কিনেছেন তার মধ্যে সম্পর্ক প্রদান করে।
CREATE PROPERTY GRAPH RetailGraph
 NODE TABLES (
   products_with_embeddings,
   Orders
 )
 EDGE TABLES (
   OrderItems
     SOURCE KEY (OrderID) REFERENCES Orders
     DESTINATION KEY (ProductID) REFERENCES products_with_embeddings
     LABEL Purchased
 );

১২. ধাপ ৯: ভেক্টর অনুসন্ধান এবং গ্রাফ কোয়েরি একত্রিত করুন

এটি সবচেয়ে শক্তিশালী পদক্ষেপ। আমরা সম্পর্কিত পণ্যগুলি খুঁজে পেতে একটি একক বিবৃতিতে AI ভেক্টর অনুসন্ধান এবং গ্রাফ কোয়েরিগুলিকে একত্রিত করব।

এই কোয়েরিটি তিনটি ভাগে পড়া হয়েছে, NEXT statement দ্বারা পৃথক করা হয়েছে, আসুন এটিকে ভাগে ভাগ করা যাক।

  1. প্রথমে আমরা ভেক্টর অনুসন্ধান ব্যবহার করে সেরা মিলটি খুঁজে পাই।
  2. ML.PREDICT EmbeddingsModel ব্যবহার করে ব্যবহারকারীর টেক্সট কোয়েরি থেকে একটি ভেক্টর এম্বেডিং তৈরি করে।
  3. এই কোয়েরিটি সমস্ত পণ্যের জন্য এই নতুন এম্বেডিং এবং সংরক্ষিত p.embedding_vector এর মধ্যে COSINE_DISTANCE গণনা করে।
  4. এটি সর্বনিম্ন দূরত্ব (সর্বোচ্চ শব্দার্থিক মিল) সহ একক bestMatch পণ্য নির্বাচন করে এবং ফেরত দেয়।
  5. এরপর আমরা সম্পর্কগুলির সন্ধানে গ্রাফটি অতিক্রম করব।

NEXT MATCH (bestMatch)<-[:Purchased]-(user:Orders)-[:Purchased]->(purchasedWith:products_with_embeddings)

  1. কোয়েরিটি bestMatch থেকে সাধারণ অর্ডার নোড (ব্যবহারকারী) পর্যন্ত ট্রেস করে এবং তারপর অন্যান্য purchasedWith পণ্যগুলিতে ফরোয়ার্ড করে।
  2. এটি মূল পণ্যটি ফিল্টার করে এবং GROUP BY এবং COUNT(1) ব্যবহার করে কত ঘন ঘন আইটেম একসাথে কেনা হয় তা একত্রিত করে।
  3. এটি সহ-ঘটনার ফ্রিকোয়েন্সি অনুসারে শীর্ষ 3টি সহ-ক্রয়কৃত পণ্য (purchasedWith) ফেরত দেয়।

অতিরিক্তভাবে, আমরা ব্যবহারকারীর ক্রম সম্পর্ক খুঁজে পাই।

NEXT MATCH (bestMatch)<-[:Purchased]-(user:Orders)-[purchased:Purchased]->(purchasedWith)

  1. এই মধ্যবর্তী ধাপটি মূল সত্তাগুলিকে আবদ্ধ করার জন্য ট্র্যাভার্সাল প্যাটার্নটি কার্যকর করে: bestMatch, সংযোগকারী ব্যবহারকারী:অর্ডার নোড এবং purchasedWith আইটেম।
  2. এটি পরবর্তী ধাপে ডেটা নিষ্কাশনের জন্য ক্রয় করা সম্পর্কটিকে বিশেষভাবে আবদ্ধ করে।
  3. এই প্যাটার্নটি নিশ্চিত করে যে অর্ডার-নির্দিষ্ট এবং পণ্য-নির্দিষ্ট বিবরণ আনার জন্য প্রেক্ষাপট প্রতিষ্ঠিত হয়েছে।
  4. অবশেষে, আমরা ফলাফলগুলি আউটপুট করি যা গ্রাফ নোড হিসাবে ফেরত পাঠানো হবে, SQL ফলাফল হিসাবে ফেরত দেওয়ার আগে ফর্ম্যাট করতে হবে।
GRAPH RetailGraph
MATCH (p:products_with_embeddings)
WHERE p.embedding_vector IS NOT NULL
RETURN p AS bestMatch
ORDER BY COSINE_DISTANCE(
 p.embedding_vector,
 (
   SELECT embeddings.values
   FROM ML.PREDICT(
     MODEL EmbeddingsModel,
     (SELECT "I'd like to buy a high performance keyboard. I sometimes code while I'm at the beach so it may get wet." AS content)
   )
 )
)
LIMIT 1

NEXT
MATCH (bestMatch)<-[:Purchased]-(user:Orders)-[:Purchased]->(purchasedWith:products_with_embeddings)
FILTER bestMatch.productId <> purchasedWith.productId
RETURN bestMatch, purchasedWith
GROUP BY bestMatch, purchasedWith
ORDER BY COUNT(1) DESC
LIMIT 3

NEXT
MATCH (bestMatch)<-[:Purchased]-(user:Orders)-[purchased:Purchased]->(purchasedWith)
RETURN
 TO_JSON(Purchased) AS purchased,
 TO_JSON(user.OrderID) AS user,
 TO_JSON(purchasedWith.productId) AS purchasedWith;

প্রত্যাশিত আউটপুট: আপনি JSON অবজেক্টগুলি দেখতে পাবেন যা শীর্ষ 3টি সহ-ক্রয়কৃত আইটেমের প্রতিনিধিত্ব করে, ক্রস-সেল সুপারিশ প্রদান করে।

১৩. পরিষ্কার করা

চার্জ এড়াতে, আপনি আপনার তৈরি করা রিসোর্সগুলি মুছে ফেলতে পারেন।

  1. স্প্যানার ইনস্ট্যান্স মুছে ফেলুন: ইনস্ট্যান্স মুছে ফেললে ডাটাবেসও মুছে যাবে।
gcloud spanner instances delete my-first-spanner --quiet
  1. গুগল ক্লাউড প্রজেক্ট মুছে ফেলুন: যদি আপনি এই প্রজেক্টটি শুধুমাত্র কোডল্যাবের জন্য তৈরি করে থাকেন, তাহলে এটি মুছে ফেলাই পরিষ্কার করার সবচেয়ে সহজ উপায়।
  • গুগল ক্লাউড কনসোলের "রিসোর্স পরিচালনা করুন" পৃষ্ঠায় যান।
  • আপনার প্রকল্প নির্বাচন করুন এবং মুছুন ক্লিক করুন।

🎉 অভিনন্দন!

আপনি স্প্যানার এআই এবং গ্রাফ ব্যবহার করে একটি অত্যাধুনিক, রিয়েল-টাইম সুপারিশ সিস্টেম সফলভাবে তৈরি করেছেন!

আপনি শিখেছেন কিভাবে এম্বেডিং এবং LLM জেনারেশনের জন্য Spanner কে Vertex AI এর সাথে একীভূত করতে হয়, শব্দার্থগতভাবে প্রাসঙ্গিক পণ্য খুঁজে পেতে উচ্চ-গতির ভেক্টর অনুসন্ধান (KNN এবং ANN) কীভাবে করতে হয় এবং পণ্য সম্পর্ক আবিষ্কার করতে গ্রাফ কোয়েরি কীভাবে ব্যবহার করতে হয়। আপনি এমন একটি সিস্টেম তৈরি করেছেন যা কেবল পণ্য খুঁজে পেতেই পারে না বরং সুপারিশগুলি ব্যাখ্যা করতে পারে এবং সম্পর্কিত আইটেমগুলিও পরামর্শ দিতে পারে , সবই একটি একক, স্কেলেবল ডাটাবেস থেকে।