ساخت برنامه‌های توصیه مشتری ۳۶۰ درجه با BigQuery Graph

۱. مقدمه

در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه از BigQuery Graph برای ساخت یک نمای مشتری ۳۶۰ درجه و یک موتور پیشنهاد برای Cymbal Pets، یک شرکت خرده فروشی خیالی، استفاده کنید. شما از قدرت SQL برای ایجاد، پرس و جو و تجزیه و تحلیل داده‌های نموداری مستقیماً در BigQuery استفاده خواهید کرد و آن را با جستجوی برداری برای توصیه‌های پیشرفته محصول ترکیب خواهید کرد.

BigQuery Graph به شما امکان می‌دهد روابط بین موجودیت‌های داده‌ای خود (مانند مشتریان، محصولات و سفارشات) را به صورت یک نمودار مدل‌سازی کنید و پاسخ به سوالات پیچیده در مورد رفتار مشتری و شباهت‌های محصول را آسان کنید.

نمودار مورد استفاده

کاری که انجام خواهید داد

  • ایجاد یک مجموعه داده و طرحواره BigQuery برای گراف Cymbal Pets
  • بارگذاری داده‌های نمونه (مشتریان، محصولات، سفارشات، فروشگاه‌ها) از فضای ذخیره‌سازی ابری
  • یک نمودار ویژگی در BigQuery ایجاد کنید که این موجودیت‌ها را به هم متصل می‌کند.
  • نمایش تاریخچه خرید مشتری با استفاده از نمودارهای کوئری
  • ساخت سیستم پیشنهاد محصول با استفاده از جستجوی برداری
  • بهبود توصیه‌ها با استفاده از روابط نموداری «خریداری شده با هم»

آنچه نیاز دارید

  • یک مرورگر وب مانند کروم
  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب

این آزمایشگاه کد برای توسعه‌دهندگان در تمام سطوح، از جمله مبتدیان، مناسب است.

۲. قبل از شروع

ایجاد یک پروژه ابری گوگل

  1. در کنسول گوگل کلود ، یک پروژه گوگل کلود انتخاب یا ایجاد کنید .
  2. مطمئن شوید که پرداخت برای پروژه ابری شما فعال است.

شروع پوسته ابری

  1. روی فعال کردن پوسته ابری (Cloud Shell) در بالای کنسول گوگل کلود (Google Cloud) کلیک کنید.
  2. تأیید اعتبار:
gcloud auth list
  1. پروژه خود را تایید کنید:
gcloud config get project
  1. در صورت نیاز آن را تنظیم کنید:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

فعال کردن APIها

برای فعال کردن API مورد نیاز BigQuery، این دستور را اجرا کنید:

gcloud services enable bigquery.googleapis.com

۳. طرحواره را تعریف کنید

ابتدا، باید یک مجموعه داده برای ذخیره جداول مربوط به نمودار خود ایجاد کنید و طرحواره گره‌ها و لبه‌های خود را تعریف کنید.

  1. برای این آزمایشگاه کد، ما دستورات SQL را اجرا خواهیم کرد. می‌توانید این دستورات را در BigQuery Studio > SQL Editor اجرا کنید، یا از دستور bq query در Cloud Shell استفاده کنید. کوئری جدید SQL ما فرض می‌کنیم که شما برای تجربه بهتر با دستورات create چندخطی، از ویرایشگر BigQuery SQL استفاده می‌کنید.
  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
);

اکنون ساختار داده‌های نمودار خود را تعریف کرده‌اید.

۴. بارگذاری داده‌ها

اکنون، جداول را با داده‌های نمونه از Cloud Storage پر کنید.

دستورات LOAD DATA زیر را در ویرایشگر BigQuery SQL اجرا کنید:

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 می‌گوید که کدام جداول نشان‌دهنده گره‌ها (موجودیت‌هایی مانند مشتریان، محصولات) و کدام جداول نشان‌دهنده لبه‌ها (روابطی مانند "بازدید شده"، "قرار داده شده"، "دارای") هستند.

طرحواره گراف

دستور 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 باز کنید.

ایجاد دفترچه یادداشت جدید

برای بخش‌های تجسم و توصیه این آزمایشگاه کد، از یک دفترچه یادداشت Google Colab در BigQuery Studio استفاده خواهیم کرد. این به ما امکان می‌دهد تا به راحتی نتایج نمودار را تجسم کنیم.

دفترچه یادداشت نمودار BigQuery به عنوان یک IPython Magics پیاده‌سازی شده است. با اضافه کردن دستور جادویی %%bigquery به همراه تابع TO_JSON ، می‌توانید نتایج را همانطور که در بخش‌های بعدی نشان داده شده است، تجسم کنید.

فرض کنید که Cymbal Pets می‌خواهد یک تصویر ۳۶۰ درجه از تمام مشتریان و خریدهایی که در یک بازه زمانی خاص انجام داده‌اند، داشته باشد.

دستور زیر را در یک سلول جدید اجرا کنید:

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

شما باید نمایش بصری از نتیجه نمودار را ببینید.

سابقه خرید همه مشتریان

۷. تاریخچه خرید آنجلیکا را تجسم کنید

فرض کنید شرکت Cymbal Pets می‌خواهد عمیقاً به سراغ مشتری‌ای به نام Angelica Russell برود. آن‌ها می‌خواهند محصولاتی را که Angelica در ۳ ماه گذشته خریداری کرده و فروشگاه‌هایی را که مشتری از آن‌ها بازدید کرده است، تجزیه و تحلیل کنند.

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

تاریخچه خرید آنجلیکا

۸. پیشنهاد محصول با استفاده از جستجوی برداری

Cymbal Pets می‌خواهد بر اساس خریدهای اخیر آنجلیکا، محصولاتی را به او پیشنهاد دهد. ما می‌توانیم از جستجوی برداری برای یافتن محصولاتی با جاسازی‌های مشابه خریدهای قبلی او استفاده کنیم.

اسکریپت SQL زیر را در یک سلول جدید Colab اجرا کنید. این اسکریپت:

  1. محصولاتی را که آنجلیکا اخیراً خریداری کرده است، شناسایی می‌کند.
  2. از 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 در نمودار خود مدل‌سازی کرده‌ایم.

برای توصیه محصولات خریداری شده، Cymbal pets یک کوئری نموداری آفلاین تحلیلی اجرا کرد تا محصولات برتر را برای توصیه به ازای هر محصولی که Angelica خریداری کرده است، پیدا کند.

%%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 به خریدهای Angelica مرتبط هستند:

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

این پرس‌وجو از مسیر مشتری -> سفارش -> محصول -> (BoughtTogether) -> محصول پیشنهادی عبور می‌کند و توصیه‌هایی را بر اساس رفتار خرید جمعی به شما نشان می‌دهد.

با هم خریداری شد

۱۰. تمیز کردن

برای جلوگیری از هزینه‌های مداوم برای حساب Google Cloud خود، منابع ایجاد شده در طول این codelab را حذف کنید.

مجموعه داده‌ها و تمام جداول را حذف کنید:

DROP SCHEMA IF EXISTS cymbal_pets_demo CASCADE;

اگر برای این codelab یک پروژه جدید ایجاد کرده‌اید، می‌توانید پروژه را نیز حذف کنید:

gcloud projects delete $PROJECT_ID

۱۱. تبریک

تبریک! شما با موفقیت یک موتور نمایش و پیشنهاد مشتری ۳۶۰ درجه با استفاده از BigQuery Graph ساختید.

آنچه آموخته‌اید

  • نحوه ایجاد نمودار ویژگی در BigQuery.
  • نحوه بارگذاری داده‌ها در گره‌ها و لبه‌های گراف.
  • نحوه پرس و جو از الگوهای نمودار با استفاده از GRAPH_TABLE و MATCH
  • چگونه می‌توان پرس‌وجوهای گراف را با جستجوی برداری برای توصیه‌های ترکیبی ترکیب کرد؟

مراحل بعدی