BigQuery Graph ব্যবহার করে কাস্টমার ৩৬০ রিকমেন্ডেশন অ্যাপ্লিকেশন তৈরি করুন

১. ভূমিকা

এই কোডল্যাবে, আপনি শিখবেন কীভাবে BigQuery Graph ব্যবহার করে Cymbal Pets নামক একটি কাল্পনিক খুচরা কোম্পানির জন্য একটি কাস্টমার ৩৬০ ভিউ এবং একটি রিকমেন্ডেশন ইঞ্জিন তৈরি করতে হয়। আপনি সরাসরি BigQuery-এর মধ্যেই গ্রাফ ডেটা তৈরি, কোয়েরি এবং বিশ্লেষণ করার জন্য SQL-এর শক্তিকে কাজে লাগাবেন এবং উন্নত প্রোডাক্ট রিকমেন্ডেশনের জন্য এটিকে ভেক্টর সার্চের সাথে একত্রিত করবেন।

BigQuery Graph আপনাকে আপনার ডেটা এনটিটিগুলোর (যেমন গ্রাহক, পণ্য এবং অর্ডার) মধ্যকার সম্পর্ককে একটি গ্রাফ হিসেবে মডেল করতে দেয়, যার ফলে গ্রাহকের আচরণ এবং পণ্যের প্রতি তাদের আকর্ষণ সম্পর্কিত জটিল প্রশ্নের উত্তর দেওয়া সহজ হয়।

ব্যবহারের ক্ষেত্রে ডায়াগ্রাম

আপনি যা করবেন

  • Cymbal Pets গ্রাফের জন্য একটি BigQuery ডেটাসেট এবং স্কিমা তৈরি করুন।
  • ক্লাউড স্টোরেজ থেকে নমুনা ডেটা (গ্রাহক, পণ্য, অর্ডার, স্টোর) লোড করুন।
  • BigQuery-তে এই সত্তাগুলোকে সংযুক্ত করে একটি প্রপার্টি গ্রাফ তৈরি করুন।
  • গ্রাফ কোয়েরি ব্যবহার করে গ্রাহকের ক্রয়ের ইতিহাস দৃশ্যমান করুন
  • ভেক্টর সার্চ ব্যবহার করে একটি পণ্য সুপারিশ সিস্টেম তৈরি করুন
  • 'একসাথে কেনা' গ্রাফ সম্পর্ক ব্যবহার করে সুপারিশ উন্নত করুন

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

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

এই কোডল্যাবটি নতুনদের সহ সকল স্তরের ডেভেলপারদের জন্য।

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

একটি গুগল ক্লাউড প্রজেক্ট তৈরি করুন

  1. গুগল ক্লাউড কনসোলে , একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন
  2. আপনার ক্লাউড প্রজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন।

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

  1. Google Cloud কনসোলের শীর্ষে থাকা Activate Cloud Shell-এ ক্লিক করুন।
  2. প্রমাণীকরণ যাচাই করুন:
gcloud auth list
  1. আপনার প্রকল্পটি নিশ্চিত করুন:
gcloud config get project
  1. প্রয়োজনে সেট করুন:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

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

প্রয়োজনীয় BigQuery API সক্রিয় করতে এই কমান্ডটি চালান:

gcloud services enable bigquery.googleapis.com

৩. স্কিমাটি সংজ্ঞায়িত করুন

প্রথমে, আপনার গ্রাফ-সম্পর্কিত টেবিলগুলো সংরক্ষণের জন্য একটি ডেটাসেট তৈরি করতে হবে এবং আপনার নোড ও এজগুলোর জন্য স্কিমা নির্ধারণ করতে হবে।

  1. এই কোডল্যাবে আমরা SQL কমান্ড চালাবো। আপনি এই কমান্ডগুলো BigQuery Studio > SQL Editor- এ চালাতে পারেন, অথবা Cloud Shell-এ bq query কমান্ডটি ব্যবহার করতে পারেন। নতুন SQL কোয়েরি আমরা ধরে নিচ্ছি যে আপনি মাল্টি-লাইন ক্রিয়েট স্টেটমেন্টের সাথে আরও ভালো অভিজ্ঞতার জন্য BigQuery SQL Editor ব্যবহার করছেন।
  2. cymbal_pets_demo ডেটাসেটটি তৈরি করুন:
CREATE SCHEMA IF NOT EXISTS cymbal_pets_demo;
  1. order_items , products , orders , stores , customers , এবং co_related_products_for_angelica এর জন্য টেবিলগুলো তৈরি করুন। এই টেবিলগুলো আমাদের গ্রাফের উৎস ডেটা হিসেবে কাজ করবে।
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.order_items
(
  order_id INT64,
  product_id INT64,
  order_item_id INT64,
  quantity INT64,
  price FLOAT64,
  PRIMARY KEY (order_id, product_id, order_item_id) NOT ENFORCED
)
CLUSTER BY order_item_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.products
(
  product_id INT64,
  product_name STRING,
  brand STRING,
  category STRING,
  subcategory INT64,
  animal_type INT64,
  search_keywords INT64,
  price FLOAT64,
  description STRING,
  inventory_level INT64,
  supplier_id INT64,
  average_rating FLOAT64,
  uri STRING,
  embedding ARRAY<FLOAT64>,
  PRIMARY KEY (product_id) NOT ENFORCED
)
CLUSTER BY product_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.orders
(
  customer_id INT64,
  order_id INT64,
  shipping_address_city STRING,
  store_id INT64,
  order_date DATE,
  order_type STRING,
  payment_method STRING,
  PRIMARY KEY (order_id) NOT ENFORCED
)
PARTITION BY order_date
CLUSTER BY order_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.stores
(
  store_id INT64,
  store_name STRING,
  address_state STRING,
  address_city STRING,
  latitude FLOAT64,
  longitude FLOAT64,
  opening_hours STRUCT<Monday STRING, Tuesday STRING, Wednesday STRING, Thursday STRING, Friday STRING, Saturday STRING, Sunday STRING>,
  manager_id INT64,
  PRIMARY KEY (store_id) NOT ENFORCED
)
CLUSTER BY store_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.customers
(
  customer_id INT64,
  first_name STRING,
  last_name STRING,
  email STRING,
  gender STRING,
  address_city STRING,
  address_state STRING,
  loyalty_member BOOL,
  PRIMARY KEY (customer_id) NOT ENFORCED
)
CLUSTER BY customer_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.co_related_products_for_angelica
(
  angelica_product_id INT64,
  other_product_id INT64,
  co_purchase_count INT64
);

আপনি এখন আপনার গ্রাফ ডেটার কাঠামো নির্ধারণ করেছেন।

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

এখন, ক্লাউড স্টোরেজ থেকে নমুনা ডেটা দিয়ে টেবিলগুলো পূরণ করুন।

BigQuery SQL এডিটরে নিম্নলিখিত LOAD DATA স্টেটমেন্টগুলো চালান:

LOAD DATA INTO `cymbal_pets_demo.customers`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/customers/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.order_items`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/order_items/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.orders`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/orders/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.products`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/products/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.stores`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/stores/*.avro']
);

প্রতিটি টেবিলে সারিগুলো লোড হয়ে গেছে, তার একটি নিশ্চিতকরণ বার্তা আপনি দেখতে পাবেন।

৫. প্রপার্টি গ্রাফ তৈরি করুন

ডেটা লোড হয়ে গেলে, আপনি এখন প্রপার্টি গ্রাফটি সংজ্ঞায়িত করতে পারেন। এটি BigQuery-কে বলে দেয় কোন টেবিলগুলো নোড (যেমন Customers, Products-এর মতো এনটিটি) এবং কোন টেবিলগুলো এজ (যেমন 'Visited', 'Placed', 'Has'-এর মতো সম্পর্ক) উপস্থাপন করে।

গ্রাফ স্কিমা

নিম্নলিখিত DDL স্টেটমেন্টটি চালান:

CREATE OR REPLACE PROPERTY GRAPH cymbal_pets_demo.PetsOrderGraph
NODE TABLES (
  cymbal_pets_demo.customers KEY(customer_id) LABEL Customer,
  cymbal_pets_demo.products KEY(product_id) LABEL Products,
  cymbal_pets_demo.stores KEY(store_id) LABEL Stores,
  cymbal_pets_demo.orders KEY(order_id) LABEL Orders
)
EDGE TABLES (
  cymbal_pets_demo.orders as customer_to_store_edge
    KEY (order_id)
    SOURCE KEY (customer_id) references customers(customer_id)
    DESTINATION KEY (store_id) references stores(store_id)
    LABEL Visited
    PROPERTIES ALL COLUMNS,

  cymbal_pets_demo.order_items
    KEY (order_item_id)
    SOURCE KEY (order_id) references orders(order_id)
    DESTINATION KEY (product_id) references products(product_id)
    LABEL Has
    PROPERTIES ALL COLUMNS,

  cymbal_pets_demo.orders as customer_to_orders_edge
    KEY (order_id)
    SOURCE KEY (customer_id) references customers(customer_id)
    DESTINATION KEY (order_id) references orders(order_id)
    LABEL Placed
    PROPERTIES ALL COLUMNS,

  cymbal_pets_demo.co_related_products_for_angelica
    KEY (angelica_product_id)
    SOURCE KEY (angelica_product_id) references products(product_id)
    DESTINATION KEY (other_product_id) references products(product_id)
    LABEL BoughtTogether
    PROPERTIES ALL COLUMNS
);

এটি PetsOrderGraph নামক গ্রাফটি তৈরি করে, যা আমাদের GRAPH_TABLE অপারেটর ব্যবহার করে গ্রাফ ট্রাভার্সাল করার সুযোগ দেয়।

৬. সকল গ্রাহকের ক্রয়ের ইতিহাস দৃশ্যমান করুন

BigQuery Studio-তে একটি নতুন নোটবুক খুলুন।

নতুন নোটবুক তৈরি করুন

এই কোডল্যাবের ভিজ্যুয়ালাইজেশন এবং রিকমেন্ডেশন অংশের জন্য, আমরা BigQuery Studio-তে একটি Google Colab নোটবুক ব্যবহার করব। এর মাধ্যমে আমরা গ্রাফের ফলাফলগুলো সহজেই ভিজ্যুয়ালাইজ করতে পারব।

BigQuery Graph Notebook একটি IPython Magics হিসেবে বাস্তবায়িত হয়েছে। TO_JSON ফাংশনের সাথে %%bigquery ম্যাজিক কমান্ডটি যোগ করে, আপনি নিম্নলিখিত বিভাগগুলিতে দেখানো উপায়ে ফলাফলগুলি ভিজ্যুয়ালাইজ করতে পারেন।

ধরা যাক, সিম্বাল পেট্‌স একটি নির্দিষ্ট সময়সীমার মধ্যে সমস্ত গ্রাহক এবং তাদের করা কেনাকাটার একটি ৩৬০-ডিগ্রি ভিজ্যুয়ালাইজেশন পেতে চায়।

একটি নতুন সেলে নিম্নলিখিতটি চালান:

%%bigquery --graph

GRAPH cymbal_pets_demo.PetsOrderGraph
  # finds the customer node and then finds all
  # the Orders nodes that are connected to that customer through the
  # Placed relationship
  MATCH (customer:Customer)-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
  # filters the Orders nodes to only include those where the
  # order_date is within the last 3 months.
  WHERE ordr.order_date >= date('2024-11-27')
  # # This line finds all the Products nodes that are connected to the
  # # filtered Orders nodes through the Has relationship.
  MATCH p=(customer:Customer)-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
  LIMIT 40
  RETURN 
    TO_JSON(p) as paths

আপনি গ্রাফ ফলাফলের একটি দৃশ্যমান উপস্থাপনা দেখতে পাবেন।

সকল গ্রাহকের ক্রয়ের ইতিহাস

৭. অ্যাঞ্জেলিকার ক্রয়ের ইতিহাস কল্পনা করুন

ধরা যাক, সিম্বাল পেট্‌স অ্যাঞ্জেলিকা রাসেল নামের একজন গ্রাহকের বিষয়ে গভীরভাবে জানতে চায়। তারা গত ৩ মাসের মধ্যে অ্যাঞ্জেলিকা যে পণ্যগুলো কিনেছেন এবং তিনি যে দোকানগুলোতে গিয়েছিলেন, সেগুলো বিশ্লেষণ করতে চায়।

%%bigquery --graph

GRAPH cymbal_pets_demo.PetsOrderGraph
  # finds the customer node with the name "Angelica Russell" and then finds all
  # the Orders nodes that are connected to that customer through the
  # Placed relationship and all the Products nodes that are connected to the
  # filtered Orders nodes through the Has relationship.
   MATCH p=(customer:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
  # filters the Orders nodes to only include those where the
  # order_date is within the last 3 months.
  WHERE ordr.order_date >= date('2024-11-27')
  # finds the Stores nodes where Angelica placed order from
  MATCH p2=(customer)-[visited:Visited]->(store:Stores)
  RETURN
    TO_JSON(p) as path, TO_JSON(p2) as path2

অ্যাঞ্জেলিকার ক্রয়ের ইতিহাস

৮. ভেক্টর সার্চ ব্যবহার করে পণ্যের সুপারিশ

সিম্বাল পেট্‌স অ্যাঞ্জেলিকাকে তার সাম্প্রতিক কেনাকাটার উপর ভিত্তি করে কিছু পণ্যের সুপারিশ করতে চায়। আমরা ভেক্টর সার্চ ব্যবহার করে তার পূর্ববর্তী কেনাকাটার মতো এমবেডিংযুক্ত পণ্য খুঁজে বের করতে পারি।

একটি নতুন কোলাব সেলে নিম্নলিখিত SQL স্ক্রিপ্টটি চালান। এই স্ক্রিপ্টটি:

  1. অ্যাঞ্জেলিকা সম্প্রতি যে পণ্যগুলো কিনেছে তা শনাক্ত করে।
  2. products টেবিল থেকে শীর্ষ ৪টি অনুরূপ প্রোডাক্ট খুঁজে বের করতে VECTOR_SEARCH ব্যবহার করা হয়।

দ্রষ্টব্য: এই ধাপে ধরে নেওয়া হচ্ছে যে আপনি products টেবিলে একটি এমবেডিংস কলাম তৈরি করার জন্য ইতিমধ্যেই AI.GENERATE_EMBEDDINGS চালিয়েছেন।

%%bigquery
DECLARE products_bought_by_angelica ARRAY<INT64>;

-- 1. Get IDs of products bought by Angelica
SET products_bought_by_angelica = (
  SELECT ARRAY_AGG(product_id) FROM
   GRAPH_TABLE(
    cymbal_pets_demo.PetsOrderGraph
      MATCH (c:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(o:Orders)
      WHERE o.order_date >= date('2024-11-27')
      MATCH (o)-[has_edge:Has]->(p:Products)
      RETURN DISTINCT p.product_id as product_id
  ));

-- 2. Find similar products using vector search
SELECT 
  query.product_name as AngelicaBought, 
  base.product_name as RecommendedProducts, 
  base.category
FROM
  VECTOR_SEARCH(
    TABLE cymbal_pets_demo.products,
    'embedding',
    (SELECT * FROM cymbal_pets_demo.products
     WHERE product_id IN UNNEST(products_bought_by_angelica)),
    'embedding',
    top_k => 4)
WHERE query.product_name <> base.product_name;

আপনি এমন কিছু প্রস্তাবিত পণ্যের তালিকা দেখতে পাবেন, যেগুলো অ্যাঞ্জেলিকা যা কিনেছে তার সাথে অর্থগতভাবে সাদৃশ্যপূর্ণ।

ভেক্টর অনুসন্ধানের ফলাফল

৯. 'একসাথে কেনা' সম্পর্ক ব্যবহার করে সুপারিশ

আরেকটি শক্তিশালী সুপারিশ কৌশল হলো 'কোলাবোরেটিভ ফিল্টারিং' — এমন সব পণ্যের সুপারিশ করা যা অন্য ব্যবহারকারীরা প্রায়শই একসাথে কেনেন। আমরা আমাদের গ্রাফে এটিকে একটি BoughtTogether এজ হিসেবে মডেল করেছি।

একসাথে কেনা পণ্যগুলোর সুপারিশ করার জন্য, অ্যাঞ্জেলিকার কেনা প্রতিটি পণ্যের জন্য সেরা পণ্যগুলো খুঁজে বের করতে সিম্বাল পেটস একটি বিশ্লেষণাত্মক অফলাইন গ্রাফ কোয়েরি পরিচালনা করেছে।

%%bigquery
CREATE OR REPLACE TABLE cymbal_pets_demo.co_related_products_for_angelica AS
SELECT
    angelica_product_id,
    other_product_id,
    co_purchase_count
FROM (
    SELECT
        angelicaProduct.product_id AS angelica_product_id,
        otherProduct.product_id AS other_product_id,
        count(otherProduct) AS co_purchase_count,
        # ensures that the row numbering is done separately for each angelica_product_id
        ROW_NUMBER() OVER (PARTITION BY angelicaProduct.product_id ORDER BY count(otherProduct) DESC) AS rn
    FROM
        GRAPH_TABLE (cymbal_pets_demo.PetsOrderGraph
          MATCH (angelica:Customer {first_name: 'Angelica', last_name: 'Russell'})-[:Placed]->(o:Orders)-[:Has]->(angelicaProduct:Products)
          WHERE o.order_date >= date('2024-11-27')
          WITH angelica, angelicaProduct
          MATCH (otherCustomer:Customer)-[:Placed]->(otherOrder:Orders)-[:Has]->(angelicaProduct) # Find orders where Angelica's products were bought
          WHERE otherCustomer <> angelica # Exclude Angelica's own orders
          WITH angelicaProduct, otherOrder
          MATCH (otherOrder)-[:HAS]->(otherProduct:Products) # Find other products in those orders
          WHERE angelicaProduct <> otherProduct # Exclude the original product.
          RETURN angelicaProduct, otherProduct, otherOrder
        )
    GROUP BY
        angelicaProduct.product_id, otherProduct.product_id
)
WHERE rn <= 3; # only keep top 3 co-related products

সুপারিশ যুক্তি

BoughtTogether এজ-এর মাধ্যমে অ্যাঞ্জেলিকার কেনাকাটার সাথে সরাসরি সংযুক্ত পণ্যগুলো সুপারিশ করার জন্য এই কোয়েরিটি চালান:

%%bigquery
SELECT * FROM GRAPH_TABLE(
  cymbal_pets_demo.PetsOrderGraph
  MATCH (customer:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(ordr:Orders)
  WHERE ordr.order_date >= date('2024-11-27')
  MATCH (ordr)-[has:Has]->(product:Products)
  MATCH (product)-[bought_together:BoughtTogether]->(recommended_product:Products)
  RETURN 
    product.product_name AS OriginalProduct,
    recommended_product.product_name AS Recommended,
    bought_together.co_purchase_count AS Strength
);

এই কোয়েরিটি Customer -> Order -> Product -> (BoughtTogether) -> Recommended Product এই পর্যায়ক্রম অনুসরণ করে এবং সম্মিলিত ক্রয় আচরণের উপর ভিত্তি করে আপনাকে সুপারিশ দেখায়।

একসাথে কেনা

১০. পরিষ্কার করুন

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

ডেটাসেট এবং সমস্ত টেবিল মুছে ফেলুন:

DROP SCHEMA IF EXISTS cymbal_pets_demo CASCADE;

আপনি যদি এই কোডল্যাবের জন্য একটি নতুন প্রজেক্ট তৈরি করে থাকেন, তাহলে আপনি প্রজেক্টটি মুছেও ফেলতে পারেন:

gcloud projects delete $PROJECT_ID

১১. অভিনন্দন

অভিনন্দন! আপনি BigQuery Graph ব্যবহার করে সফলভাবে একটি কাস্টমার ৩৬০ ভিউ এবং রিকমেন্ডেশন ইঞ্জিন তৈরি করেছেন।

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

  • BigQuery-তে কীভাবে একটি প্রপার্টি গ্রাফ তৈরি করবেন
  • গ্রাফের নোড এবং এজ-এ কীভাবে ডেটা লোড করতে হয়।
  • GRAPH_TABLE এবং MATCH ব্যবহার করে কীভাবে গ্রাফ প্যাটার্ন কোয়েরি করতে হয়।
  • হাইব্রিড সুপারিশের জন্য কীভাবে গ্রাফ কোয়েরির সাথে ভেক্টর সার্চকে একত্রিত করা যায়।

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