تاريخ جديد

بناء نظام الذكاء الاصطناعي لتشجيعك على أكثر جزر الجاز (أو أي ملابس أخرى) على الكوكب

بواسطة Superlinked13m2025/04/25
Read on Terminal Reader

طويل جدا؛ ليقرأ

يقدم Superlinked مسارًا منتظمًا: توصيات مرنة، في الوقت الحقيقي التي يمكن أن تتكيف مع المستخدمين المبتدئين من خلال الجمع بين البيانات المعروضة مع السلوك الحي - كل ذلك دون إعادة تدريب نموذج ML.
featured image - بناء نظام الذكاء الاصطناعي لتشجيعك على أكثر جزر الجاز (أو أي ملابس أخرى) على الكوكب
Superlinked HackerNoon profile picture
0-item
1-item


ماذا لو كان متجرك على الإنترنت يعرف ما يريد العملاء قبل أن يفعلونه؟

ماذا لو كان متجرك على الإنترنت يعرف ما يريد العملاء قبل أن يفعلونه؟


Most recommendation engines are like helpful but slightly clueless assistants:ويقولون إنها "شائعة" أو "مماثلة" على أساس بيانات محدودة ومتجددة.struggleعندما يكون المستخدمون جديدين (مشكلة البدء البارد) ، فإنهم غالباً ما يتكيفون بسرعة كافية عندما تتغير ترجيحات المستخدم في الوقت الحقيقي.


ولكن ماذا لو كان نظامكفي الواقع تفكرمثل المورد – تجميع بيانات المنتج المستقيمة وممارسة المستخدم في الوقت الحقيقي إلى سطحالمواد الصحيحةفي الوقت المناسب؟

في الواقع تفكر


This guide walks you through building a modern recommendation engineاستخدامSuperlinked، الذي يغيب هذه الفجوات التقليدية عن طريق تحويل بياناتك إلى ملفات مستخدمية قابلة للتطوير باستخدام البنية التحتية الأصلية.


(هل تريد أن تذهب مباشرة إلى الكود؟ شاهد الكود المفتوح على GitHub هنا.

هناهناهناهنا


يمكنك أيضًا اتباع الماجستير في المتصفح معكولاب


التالي : د.

يقدم Superlinked مسارًا منتظمًا: توصيات مرنة، في الوقت الحقيقي التي يمكن أن تتكيف مع المستخدمين المبتدئين من خلال الجمع بين البيانات المعروضة مع السلوك الحي - كل ذلك دون إعادة تدريب نموذج ML.

تحقيق الشخصية على الرغم من التحديات التي تعترضها RecSys

على الرغم من أن إدخالات المركبات يمكن أن تحسن بشكل كبير في أنظمة التوصية، إلا أن تطبيقها الفعلي يتطلب حل العديد من التحديات، بما في ذلك:


  • الجودة والمصلحة: يجب أن يتم النظر بعناية في عملية إنتاج التجميل، والإمكانيات، والبيانات.
  • بيانات ضعيفة ومتكررة: الأقراص غير فعالة عندما يكون لها إشارات غير كاملة أو ضعيفة.
  • التوسع: هناك حاجة إلى طرق فعالة لمجموعة كبيرة من البيانات، وإلا فإن التوقعات ستكون مشكلة.


يتيح Superlinked لك حل هذه التحديات من خلال الجمع بين جميع البيانات المتاحة حول المستخدمين والمنتجات إلى مركبات متعددة الأبعاد.في مثال RecSys التجارة الإلكترونية لدينا أدناه، ونحن نفعله باستخدام عناصر المكتبة Superlinked التالية:


  • min_max عدد الأجزاء: لمعرفة تقييمات العملاء ومعلومات الأسعار
  • التسمية - التسمية - التسمية - التسمية - التسمية - التسمية - التسمية - التسمية - التسمية
  • خطة الأحداث و تأثيرات لتعديل المركبات
  • تقييم مدة الاستفسارات - لتحديد كيف تريد أن يتم معالجة البيانات عند تشغيل الاستفسار، مما يسمح لك بتحسين وتطوير دون إعادة تثبيت مجموعات البيانات بأكملها (السقوط)


من خلال إدراج بيانات المستخدم المزدوجة في البداية (فضل المنتج الأولي للمستخدم) ، يمكننا التعامل مع مشكلة البدء البارد.hyperتخصيص التوصيات من خلال إدراج هذه البيانات الحدثية، وبناء سلسلة من التعليقات التي تسمح لك بتحديث المركبات مع ترجيحات المستخدم في الوقت الحقيقي.


Let's get started!

بناء محرك توصيات التجارة الإلكترونية مع Superlinked

في بداية التنمية، لدينا التفاصيل التالية:product data: :


  • عدد المراجعين
  • تقييم المنتجات
  • وصف النص
  • اسم المنتج (التي تحتوي عادة على اسم العلامة التجارية)
  • الفئة

لدينا أيضًا التاليdata about users and products: :


  1. يختار كل مستخدم واحد من ثلاثة المنتجات المتاحة عند التسجيل (أي بيانات ترغيب المنتجات)
  2. نشاط المستخدم (بعد التسجيل) يوفر بيانات تحدث إضافية - التفضلات للخصائص النصية للمنتجات (تفسير، اسم، فئة)

أيضا، يخبرنا الاقتصاد الكلاسيكي أن، في المتوسط، جميع المستخدمين ceteris paribus ترغب في المنتجات التي:


  • تكلفة أقل
  • لديك الكثير من التعليقات
  • الحصول على تقييمات أعلى

يمكننا تخصيص مساحاتنا للتعرف على هذه البيانات، بحيث تعمل RecSys في سياقات بدء الشتاء - ترشيد العناصر للمستخدمين الذين نعرفهم قليلاً.بعد أن يتم تشغيل RecSys، سيكون لدينا أيضًا بيانات السلوك: سوف تستخدم المستخدمين على منتجات معينة، شراء منتجات معينة، وما إلى ذلك، ويمكننا تخزين واستخدام هذه البيانات لحلول التعليقات، وتحديث شبكاتنا لتعكس ترغيب المستخدم وتحسين جودة التعليقات.

إعداد Superlinked

أولاً ، علينا تثبيت مكتبة Superlinked وتصدير الصفحات.


%pip install superlinked==6.0.0

import altair as alt
import os
import pandas as pd
import sys


from superlinked.framework.common.embedding.number_embedding import Mode
from superlinked.framework.common.schema.schema import schema
from superlinked.framework.common.schema.event_schema import event_schema
from superlinked.framework.common.schema.schema_object import String, Integer
from superlinked.framework.common.schema.schema_reference import SchemaReference
from superlinked.framework.common.schema.id_schema_object import IdField
from superlinked.framework.common.parser.dataframe_parser import DataFrameParser
from superlinked.framework.dsl.executor.in_memory.in_memory_executor import (
   InMemoryExecutor,
   InMemoryApp,
)
from superlinked.framework.dsl.index.index import Index
from superlinked.framework.dsl.index.effect import Effect
from superlinked.framework.dsl.query.param import Param
from superlinked.framework.dsl.query.query import Query
from superlinked.framework.dsl.source.in_memory_source import InMemorySource
from superlinked.framework.dsl.space.text_similarity_space import TextSimilaritySpace
from superlinked.framework.dsl.space.number_space import NumberSpace


alt.renderers.enable(get_altair_renderer())
pd.set_option("display.max_colwidth", 190)


نحن أيضًا نحدد مجموعات البيانات الخاصة بنا، ونخلق دائمًا لتخزين أعلى 10 العناصر - انظرالخلية 3في المجلد

الآن، بعد أن تم تثبيت المكتبة، وتصدير الصفحات، وتحديد مواقع مجموعة البيانات، يمكننا رؤية مجموعة البيانات لدينا للتعليق على كيفية تثبيت مساحاتنا.


# the user preferences come from the user being prompted to select a product out of 3 - those will be the initial preferences
# this is done in order to give somewhat personalised recommendations
user_df: pd.DataFrame = pd.read_json(USER_DATASET_URL)
user_df


User product pref at registration


يمكننا أيضًا إعداد مراجعة دقيقة لبيانات توزيع منتجاتنا - انظر:الخلية 5هذا يوفر لك صورة عن عدد المنتجات التي تقع في نقاط أسعار مختلفة، وتتراوح عدد التعليقات المختلفة، وتتراوح نسبة التعليقات المختلفة (بما في ذلك حيث تقع معظم المنتجات في هذه المناطق).


Number of products vs price, review count, and rating distributions


قد نرغب في تحديد سعر المنتجات تحت نقطة سعر 1000 دولار. قد نرغب في تحديد سعر الفوركس إلى 25-1000 لخلقها ممثلة، دون التغيير من قبل القيم الخلفية. يتم توزيع حسابات مراجعة المنتجات على نطاق متساوي، وتوزيع تقييمات مراجعة على نطاق متساوي، لذلك لا تحتاج إلى معالجة إضافية.الأقراص 7-9. .

إنشاء مؤشر للبحث عن المركبات

تحتوي مكتبة Superlinked على مجموعة من المكونات الأساسية التي نستخدمها لتصنيع المؤشر وإدارة البحث. يمكنك قراءة المزيد عن هذه المكونات الأساسيةهنا. .


دعونا نضع البطاقات البناء لهذا المكتبة لاستخدامها في EComm RecSys.define your Schemaإبلاغ النظام عن بياناتك.


# schema is the way to describe the input data flowing into our system - in a typed manner
@schema
class ProductSchema:
   description: String
   name: String
   category: String
   price: Integer
   review_count: Integer
   review_rating: Integer
   id: IdField

@schema
class UserSchema:
   preference_description: String
   preference_name: String
   preference_category: String
   id: IdField

@event_schema
class EventSchema:
   product: SchemaReference[ProductSchema]
   user: SchemaReference[UserSchema]
   event_type: String
   id: IdField

# we instantiate schemas as follows
product = ProductSchema()
user = UserSchema()
event = EventSchema()


بعد ذلك، يمكنك استخدام مساحات لمعرفة كيف تريد التعامل مع كل جزء من البيانات عند إدراجها.في تعريفات مساحات، نحن نحدد كيفية إدراج مساحات لتعكس العلاقات السامية في البيانات الخاصة بنا.كل مساحات تم تحسينها لتدخل البيانات حتى تتمكن من العودة إلى أعلى جودة ممكنة من النتائج البحثية.


# textual inputs are embedded in a text similarity space powered by a sentence_transformers model
description_space = TextSimilaritySpace(
   text=[user.preference_description, product.description],
   model="sentence-transformers/all-distilroberta-v1",
)
name_space = TextSimilaritySpace(
   text=[user.preference_name, product.name],
   model="sentence-transformers/all-distilroberta-v1",
)
category_space = TextSimilaritySpace(
   text=[user.preference_category, product.category],
   model="sentence-transformers/all-distilroberta-v1",
)

# NumberSpaces encode numeric input in special ways to reflect a relationship
# here we express relationships to price (lower the better), or ratings and review counts (more/higher the better)
price_space = NumberSpace(
   number=product.price, mode=Mode.MINIMUM, min_value=25, max_value=1000
)
review_count_space = NumberSpace(
   number=product.review_count, mode=Mode.MAXIMUM, min_value=0, max_value=100
)
review_rating_space = NumberSpace(
   number=product.review_rating, mode=Mode.MAXIMUM, min_value=0, max_value=4
)

# create the index using the defined spaces
product_index = Index(
   spaces=[
       description_space,
       name_space,
       category_space,
       price_space,
       review_count_space,
       review_rating_space,
   ]
)

# parse our data into the schemas - not matching column names can be conformed to schemas using the mapping parameter
product_df_parser = DataFrameParser(schema=product)
user_df_parser = DataFrameParser(
   schema=user, mapping={user.preference_description: "preference_desc"}
)

# setup our application
source_product: InMemorySource = InMemorySource(product, parser=product_df_parser)
source_user: InMemorySource = InMemorySource(user, parser=user_df_parser)
executor: InMemoryExecutor = InMemoryExecutor(
   sources=[source_product, source_user], indices=[product_index]
)
app: InMemoryApp = executor.run()

# load the actual data into our system
source_product.put([products_df])
source_user.put([user_df])


الآن بعد أن تم تحديد بياناتك في الأماكن، أنت جاهز للعب مع بياناتك وتحسين النتائج.ما يمكننا القيام به دون الأحداثحلول بدء الشتاء

حل مشكلة RecSys Cold-Start

هنا، نحن نحدد استفسار المستخدم الذي يبحث فقط مع النيكتر المفضلة للمستخدم.


user_query = (
   Query(
       product_index,
       weights={
           description_space: Param("description_weight"),
           name_space: Param("name_weight"),
           category_space: Param("category_weight"),
           price_space: Param("price_weight"),
           review_count_space: Param("review_count_weight"),
           review_rating_space: Param("review_rating_weight"),
       },
   )
   .find(product)
   .with_vector(user, Param("user_id"))
   .limit(Param("limit"))
)

# simple recommendations for our user_1
# these are based only on the initial product the user chose when first entering our site
simple_result = app.query(
   user_query,
   user_id="user_1",
   description_weight=1,
   name_weight=1,
   category_weight=1,
   price_weight=1,
   review_count_weight=1,
   review_rating_weight=1,
   limit=TOP_N,
)

simple_result.to_pandas()


إن النتائج من هذا الاستفسار تشير إلى حقيقة أن user_1 اختار كيسًا عند تسجيلها لأول مرة على موقع ecomm.


User 1 registration product choice-based recs


من الممكن أيضًا إعطاء منتجات للمستخدم_1 التيعمومامثير للجدل - وهذا يدل على أن سعرها منخفض ومزيد من التعليقات الجيدة.النتائج الخاصة بنا ستعكس الآن اختيار منتج user_1 عند التسجيلوشعبية المنتجات العامة. (نحن يمكننا أيضا أن نلعب مع هذه الأوراق لتركيز النتائج في اتجاه واحد الفضاء أو آخر.)


general_result = app.query(
   user_query,
   user_id="user_1",
   description_weight=0,
   name_weight=0,
   category_weight=0,
   price_weight=1,
   review_count_weight=1,
   review_rating_weight=1,
   limit=TOP_N,
)

general_result.to_pandas() 



General product features-based recs

يقدم البحث من مستخدم جديد نصًا طلبًا كدخول لنتائج التوصية - انظرالخلايا 20. .

في مثالنا ، بحث user_1 عن "الملابس الجميلة للنساء".additional weight to the category space( )category_weight = 10) لتوجيه المزيد من المنتجات "الملابس للنساء".


women_cat_result = app.query(
   search_query,
   user_id="user_1",
   query_text="women clothing jackets",
   description_weight=1,
   name_weight=1,
   category_weight=10,
   price_weight=1,
   review_count_weight=1,
   review_rating_weight=1,
   limit=TOP_N,
)

women_cat_result.to_pandas()


إن حجم الفئة الإضافية لدينا يؤدي إلى إنتاج المزيد من نتائج الملابس للنساء.


User 1 query for "women clothing jackets" recs.png


يمكننا أيضًا أن نقوم بتصحيح التوصيات الخاصة بنا على المنتجات المحدودة (review_rating_weight=5إن النتائج تشير الآن إلى ترجيح المستخدم_1 في البضائع والأشياء التي هي شعبية بشكل عام، في حين يتم إزالة المنتجات التي تحتوي على تقييمات منخفضة تماما.الخلايا 22. .

استخدام بيانات الأحداث لإنشاء تجربة شخصية

أسرع خلال شهر. يستخدم المستخدمون لدينا التفاعل مع منصةنا - user_1 أكثر، user_2 أقل.behavioral data(انظر أدناه) ، والتي تمثلت في الأحداث:

  • مستخدمين يهتمون بالمنتجات العادية والترفيهية (user_2)
  • المستخدم الذي يهتم بالمنتجات الجميلة للذهاب إلى الفنادق والفعاليات العملية الرسمية (user_1)
events_df = (
   pd.read_json(EVENT_DATASET_URL)
   .reset_index()
   .rename(columns={"index": "id"})
   .head(NROWS)
)
events_df = events_df.merge(
   products_df[["id"]], left_on="product", right_on="id", suffixes=("", "r")
).drop("idr", axis=1)
events_df = events_df.assign(created_at=1715439600)

events_df


user events

دعونا نضع خطوات محددة لتسجيل مستويات الاهتمام للمستخدم في منتج معين، وإعداد الإعداد للتعرف على الأحداث عند إجراء البحث.

event_weights = {
   "clicked_on": 0.2,
   "buy": 1,
   "put_to_cart": 0.5,
   "removed_from_cart": -0.5,
}

# adjust the setup to events
product_index_with_events = Index(
    spaces=[
        description_space,
        category_space,
        name_space,
        price_space,
        review_count_space,
        review_rating_space,
    ],
    effects=[
        Effect(
            description_space,
            event.user,
            event_weight * event.product,
            event.event_type == event_type,
        )
        for event_type, event_weight in event_weights.items()
    ]
    + [
        Effect(
            category_space,
            event.user,
            event_weight * event.product,
            event.event_type == event_type,
        )
        for event_type, event_weight in event_weights.items()
    ]
    + [
        Effect(
            name_space,
            event.user,
            event_weight * event.product,
            event.event_type == event_type,
        )
        for event_type, event_weight in event_weights.items()
    ],
)
event_df_parser: DataFrameParser = DataFrameParser(schema=event)
source_event: InMemorySource = InMemorySource(schema=event, parser=event_df_parser)
executor_with_events: InMemoryExecutor = InMemoryExecutor(
    sources=[source_product, source_user, source_event],
    indices=[product_index_with_events],
)
app_with_events: InMemoryApp = executor_with_events.run()


الآن نقوم بإنشاء مؤشر جديد للتعرف على الأحداث المستخدمة، ثم تخصيص توصيات لكل مستخدم بموجبها. حتى الأسئلة التي تعتمد فقط على المركبات المستخدمة الآن أكثر شخصية مما كانت عليه سابقا.

# for a new index, all data has to be put into the source again
source_product.put([products_df])
source_user.put([user_df])
source_event.put([events_df])

# a query only searching with the user's vector the preferences are now much more personalised thanks to the events
personalised_query = (
   Query(
       product_index_with_events,
       weights={
           description_space: Param("description_weight"),
           category_space: Param("category_weight"),
           name_space: Param("name_weight"),
           price_space: Param("price_weight"),
           review_count_space: Param("review_count_weight"),
           review_rating_space: Param("review_rating_weight"),
       },
   )
   .find(product)
   .with_vector(user, Param("user_id"))
   .limit(Param("limit"))
)


يمكننا مشاهدة تأثير التركيز على الأحداث في RecSys من خلال تقييم التخصيصفقط قليلاًأوبشدةأولاً، دعونا نلقي نظرة على تأثير (في المقام الأول) في تقييم الفجوات التي تؤثر على هذه الأحداث (البيانات السلوكية).

# with small weight on event-affected spaces, we mainly just alter the results below position 4
general_event_result = app_with_events.query(
   personalised_query,
   user_id="user_1",
   description_weight=1,
   category_weight=1,
   name_weight=1,
   price_weight=1,
   review_count_weight=1,
   review_rating_weight=1,
   limit=TOP_N,
)

general_event_result.to_pandas().join(
   simple_result.to_pandas(), lsuffix="", rsuffix="_base"
)[["description", "id", "description_base", "id_base"]]


مع القلق القليل جداً على المراحل التي تؤثر على الأحداث، نرى تغيرات، ولكن بشكل رئيسي فقط في النصف الأخير من أعلى 10، مقارنة مع النتائج السابقة ("id_base"، في اليمين).


Slightly weighted events-affected spaces vs baseline


ولكن إذا قمت بقياس الأجزاء التي تؤثر على الأحداث بشكل أكبر ، فإننا نضيف عناصر جديدة تماماً في قائمتنا الموصى بها.


# with larger weight on the the event-affected spaces, more totally new items appear in the TOP10
event_weighted_result = app_with_events.query(
   personalised_query,
   user_id="user_1",
   query_text="",
   description_weight=5,
   category_weight=1,
   name_weight=1,
   price_weight=1,
   review_count_weight=1,
   review_rating_weight=1,
   limit=TOP_N,
)

event_weighted_result.to_pandas().join(
   simple_result.to_pandas(), lsuffix="", rsuffix="_base"
)[["description", "id", "description_base", "id_base"]]


More heavily weighted events-affected spaces vs baseline


يمكننا أيضًا، بطبيعة الحال، استخدام الجرعات لتخصيص توصياتنا بناءً على سلوك مستخدم معين (بيانات الأحداث) وفي الوقت نفسه تركز على خصائص المنتج الأخرى- على سبيل المثال، سعر (انظرالخلايا 31)

النتيجة

يظهر تطبيق eComm RecSys من مكتبة Superlinked (في أعلاه) لك كيفية تحقيق قوة إدخالات المركبات عن طريق دمج المعنى السينمائي للمتطلبات المستخدمة والبيانات السلوكية. باستخدام ميزة min_max من الأرقام والبيانات المماثلة للبساطة، والتقارير والتأثيرات، والتأثيرات الزمنية للمتطلبات، يمكنك التعامل مع التحديات التي تواجه RecSys في بداية الشتاء، والجودة والتوسع، وتقديم توصيات مفيدة للغاية للمستخدم في الإنتاج.

الآن هو دورك!حاول تطوير المكتبة Superlinked بنفسك باستخدام محفظتنا. .

Try It Yourself – Get the Code & Demo!

تجربة نفسك - احصل على الكود & الديموقراطية!
  • تحميل الكود: اقرأ التطبيق الكامل في repo GitHub لدينا هنا.Fork، تعديلها، وخلقها الخاصة بك!
  • See It in Action: هل تريد أن ترى هذا العمل في إعداد العالم الحقيقي؟ حجز عرض سريع، واستكشاف كيف يمكن Superlinked أن تتحمل التوصيات الخاصة بك.
هناهنا. .

محركات التوصية تشكل طريقة اكتشاف المحتوى، سواء كان ذلك على شاحنات شعبية أو الموسيقى أو منتجات أخرى.vector search is the futureالآن لديك أدوات لإنشاء نفسك.

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks