Yeni tarih

Sizlere gezegendeki en iyi jazzi pantolonları (veya başka herhangi bir elbise) tavsiye etmek için bir AI sistemi oluşturun

ile Superlinked13m2025/04/25
Read on Terminal Reader

Çok uzun; Okumak

Çoğu e-ticaret önericisi ya çok statik (kural tabanlı) ya da çok kara kutu (gözsüz ML modelleridir). Superlinked bir orta yol sunar: soğuk başlangıç kullanıcılarına, metadata canlı davranışla birleştirerek uyum sağlayabilecek esnek, gerçek zamanlı öneriler - tüm bunlar ML modellerini yeniden eğitmeden.
featured image - Sizlere gezegendeki en iyi jazzi pantolonları (veya başka herhangi bir elbise) tavsiye etmek için bir AI sistemi oluşturun
Superlinked HackerNoon profile picture
0-item
1-item


Şöyle

Peki, e-ticaret mağazanız bir müşterinin ne istediğini yapmadan önce bilseydi ne olurdu?

Şöyle

Peki, e-ticaret mağazanız bir müşterinin ne istediğini yapmadan önce bilseydi ne olurdu?


Most recommendation engines are like helpful but slightly clueless assistants:sınırlı, eski veriler temelinde “popüler” veya “ benzer” öğeleri önerirler.struggleKullanıcılar yeni olduğunda (soğuk başlangıç sorunu) ve kullanıcıların tercihleri gerçek zamanlı olarak değiştiğinde nadiren yeterince hızlı adapte olurlar.


Eğer sisteminizin yapabileceğiGerçekten düşünüyorumbir merchandiser gibi – statik ürün verilerini ve gerçek zamanlı kullanıcı davranışlarını yüzeye birleştirmekDoğru öğelerDoğru zamanda mı?

Gerçekten düşünüyorum


This guide walks you through building a modern recommendation enginekullanmakSuperlinked, bu geleneksel eksiklikleri, verilerinizi vektor-native altyapısını kullanarak hareket edilebilir, gelişen kullanıcı profillerine dönüştürerek aşan biri.


(Kodu doğrudan atlamak ister misiniz? GitHub'daki açık kaynak kodunu buradan inceleyin. Kendi kullanım durumunuz için önerme sistemlerini denemeye hazır mısınız? Burada bir demo alın.)

burdaburdaburdaburda


Ayrıca, bizimle birlikte tarayıcı içi öğretici takip edebilirsinizKolaylık


Dr ; Dr :

Çoğu e-ticaret önericisi ya çok statik (kural tabanlı) ya da çok kara kutu (gözsüz ML modelleridir). Superlinked bir orta yol sunar: soğuk başlangıç kullanıcılarına, metadata canlı davranışla birleştirerek uyum sağlayabilecek esnek, gerçek zamanlı öneriler - tüm bunlar ML modellerini yeniden eğitmeden.

RecSys vector embedding zorluklarına rağmen kişiselleştirme

Vektör eklentileri tavsiye sistemlerini büyük ölçüde iyileştirebilirken, bunların etkili bir şekilde uygulanması, şunları içerir:


    Şöyle
  • Kalite ve Uygunluk: Entegre üretim süreci, mimarisi ve verileri dikkatlice göz önünde bulundurulmalıdır.
  • Şöyle
  • Küçük ve gürültülü veriler: Girişler eksik veya gürültülü girişleri olduğunda daha az etkilidir.
  • Şöyle
  • Ölçülebilirlik: Büyük veri kümeleri için verimli yöntemler gereklidir; aksi takdirde, gecikme bir sorun olacaktır.
  • Şöyle


Superlinked, kullanıcılar ve ürünler hakkında mevcut tüm verileri zengin multimodal vektörlere birleştirerek bu zorluklarla başa çıkmanızı sağlar.Aşağıdaki e-ticaret RecSys örneğimizde, aşağıdaki Superlinked kitaplık elementlerini kullanarak bunu yapıyoruz:


    Şöyle
  • min_max sayısal alanlar: müşteri yorumlarını ve fiyat bilgileri anlamak için
  • Şöyle
  • text-similarity Space: Ürün bilgilerinin semantik anlayışı için
  • Şöyle
  • Vektörleri değiştirmek için olay şeması ve etkiler
  • Şöyle
  • sorgulama zaman ağırlıkları - sorguyu çalıştırdığınızda verilerin nasıl işlenmesini istediğinizi belirlemek, tüm veritabanını yeniden entegre etmeden optimize etmenizi ve ölçeklenmenizi sağlar (latans)
  • Şöyle


Başlangıçta az sayıda kullanıcı özel verilerimizi (kullanıcının başlangıç ürün tercihi) içerirken, soğuk başlangıç sorunu ile başa çıkabiliriz.HipertansiyonBu olay verilerini yerleştirerek önerileri kişiselleştirmek, gerçek zamanlı olarak kullanıcı tercihleri ile vektorları güncelleştirmenize olanak tanıyan bir geri bildirim döngüsü oluşturmak. ek olarak, Superlinked'in sorgu zaman ağırlığı, arama sonuçlarınızı düzeltmenize ve bunları belirli kullanıcı tercihleri ile uyumlu hale getirmeyi sağlar.


Let's get started!

Superlinked ile bir e-ticaret önerme motoru oluşturun

Gelişimin başlangıcında, aşağıdakiler var:product data: Hakkında


    Şöyle
  • İnceleme Sayısı
  • Şöyle
  • Ürün Ratingleri
  • Şöyle
  • Tekstiğin açıklaması
  • Şöyle
  • Ürün adı (genellikle marka adı içerir)
  • Şöyle
  • Kategoriler
  • Şöyle

Aynı zamanda aşağıdakidata about users and products: Hakkında


    Şöyle
  1. Her kullanıcı, kayıt sırasında sunulan üç ürünten birini seçer (yani ürün tercih verileri)
  2. Şöyle
  3. Kullanıcı Davranışı (kayıt olduktan sonra) ürünlerin metin özellikleri için tercihleri - ek olay verileri sağlar (bölüm, isim, kategori)
  4. Şöyle

Ayrıca, klasik ekonomi bize, ortalama olarak, tüm kullanıcılar ceteris paribus ürünleri tercih ediyor:


    Şöyle
  • Daha az maliyeti
  • Şöyle
  • Çok sayıda yorum var
  • Şöyle
  • Daha Yüksek Değerlendirmeler
  • Şöyle

Bu verileri dikkate almak için alanlarımızı ayarlayabiliriz, böylece RecSys'lerimiz soğuk başlangıç senaryolarında çalışır - çok az bildiğimiz kullanıcılar için öğeleri tavsiye ederiz. RecSys'lerimiz çalıştırıldığında, davranış verilerimiz de olacak: kullanıcılar belirli ürünlere tıklayacak, belirli ürünleri satın alacak, vb. Bu olay verilerini geri bildirim döngüleri oluşturmak, vektorlarımızı kullanıcı tercihlerini yansıtmak ve önerilerin kalitesini geliştirmek için kullanabilir ve kullanabiliriz.

Superlink oluşturmak

İlk olarak, Superlinked kütüphanesini yüklemek ve sınıfları ithal etmek zorundayız.


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


Ayrıca veri setlerimizi tanımlıyoruz ve en iyi 10 öğeyi depolamak için bir sabit oluşturuyoruz - bakınızHücre 3Not defterinde

Kütüphanenin yüklü, ithal edilen sınıfları ve veritabanı konumlarını belirledikten sonra, alanlarımızı nasıl ayarladığımızı öğrenmek için veritabanımıza bir göz atabiliriz. Başlangıçta, kullanıcı kayıtlarından elde ettiğimiz veriler var - yani kullanıcı_1 ve kullanıcı_2'nin seçtiği üç ürün.


# 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


Ürünlerimizin dağıtım verilerini de yakından inceleyebiliriz - bakınızHücre 5Bu, size farklı fiyat noktalarında kaç ürün olduğunu, farklı inceleme sayısına sahip olduğunu ve farklı derecelendirmelere sahip olduğunu (bu ürünlerin çoğunluğunun bu aralıklarda bulunduğunun da dahil olmak üzere) gösterir.


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


Ürünlerin fiyatları çoğunlukla $1000 fiyat noktasından daha düşüktür. Ürünlerin değerlendirme sayısı eşit olarak dağıtılır ve değerlendirme puanları nispeten eşit olarak dağıtılır, böylece herhangi bir ek tedavi gerekmez.Çekiliş 7-9ve .

Vektor arama için index oluşturma

Superlinked'in kütüphanesi, indeksleri oluşturmak ve arama işlemini yönetmek için kullandığımız bir dizi çekirdek inşaat blokunu içerir.burdave .


Bu kütüphanenin inşaat bloklarını EComm RecSys'te kullanmaya koyalım.define your SchemaSisteminize verileriniz hakkında bilgi vermek için.


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


Ardından, yerleştirme sırasında verilerin her bir bölümünü nasıl ele almak istediğinizi belirtmek için alanları kullanırsınız. Yerleştirme tanımlarında, girdilerin verilerimizin semantik ilişkileri yansıtması için nasıl yerleştirileceğini açıklıyoruz. Her alan, elde edilen sonuçların mümkün olan en yüksek kalitesini iade etmek için verileri yerleştirmek için optimize edilmiştir. Hangi alanlar kullanılır, veri türüne bağlıdır.


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


Şimdi verilerinizi Spaces'ta tanımladığınızda, verilerinizle oynamaya ve sonuçları optimize etmeye hazırsınız.Olaylar olmadan neler yapabilirizSoğuk Başlangıç Çözümümüz

RecSys Soğuk Başlangıç Sorunu

Burada, yalnızca kullanıcının tercih vektörü ile arama yapan bir kullanıcı sorgusunu tanımlıyoruz. her giriş türünün önemi (yer) üzerinde konfigürasyon kontrolümüz var.


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


Bu sorgunun sonuçları, user_1'in ecomm sitemize ilk kaydolduğunda bir çanta seçtiği gerçeğini yansıtıyor.


User 1 registration product choice-based recs


Kullanıcı_1 için önerilen ürünler de mevcuttur.Genel olarakçekici - yani fiyatlarının düşük olduğu ve çok sayıda iyi incelemeye sahip olduğu temelinde. sonuçlarımız artık kullanıcı_1'in kayıt sırasında seçtiği ürünleri yansıtacaktır.veÜrünlerin genel popülerliği. (Bu ağırlıklarla da bir uzay ya da başka bir uzay yönünde sonuçları ters çevirebiliriz.)


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

Yeni bir kullanıcı aramasında, tavsiye sonuçlarımız için bir giriş olarak sorgu metni girer - bakınızHücre 20ve .

Örnek örneğimizde, user_1 aradı "kız giyim ceketleri". biz vererek sonuçlarımızı optimize edebilirsinizadditional weight to the category space(Bölümcategory_weight = 10), daha fazla “kadın giyim ceketleri” ürünleri tavsiye.


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


Ek kategori ağırlığımız daha fazla kadın kıyafet sonuçları üretir.


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


Üst sınıf ürünler için önerilerimizi de öne çıkarabiliriz (review_rating_weight=5Sonuçlar artık kullanıcı_1'in genel olarak popüler olan çantalar ve öğeler için ilk tercihini yansıtırken, düşük derecelendirilmiş ürünler tamamen kaldırılır.Hücresel 22ve .

Kişiselleştirilmiş deneyimler oluşturmak için olay verilerini kullanın

Hızlı bir ay. kullanıcılarımız platformumuzla etkileşimde bulundu - user_1 daha fazla, user_2 daha az.behavioral data(Aşağıya bakınız) olaylar olarak temsil edilir:

    Şöyle
  • Sıradan ve eğlence ürünleri ile ilgilenen bir kullanıcı (user_2)
  • Şöyle
  • dışarı çıkmak ve resmi iş fırsatları için zarif ürünlerle ilgilenen bir kullanıcı (user_1)
  • Şöyle
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

Kullanıcının belirli bir ürüne olan ilgi seviyesini kaydetmek için belirli eylemleri ağırlayalım ve arama yaparken olayları dikkate almak için ayarlamayı ayarlayalım.

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


Artık kullanıcı olaylarını dikkate almak için yeni bir indeksleme oluşturuyoruz ve daha sonra her kullanıcının önerilerini buna göre kişiselleştiriyoruz.

# 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'lerimize olayların entegre edilmesinin etkilerini kişiselleştirme ağırlığıyla gözlemleyebiliriz.sadece hafifçeveyaAğırİlk olarak, bu olaylar tarafından etkilenen alanları ağırlatmanın etkisi (baseline karşılaştırıldığında) görelim.

# 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"]]


Olaylardan etkilenen alanlara çok az ağırlık verildiği takdirde, önceki sonuçlarla karşılaştırıldığında ("id_base", sağda) ilk 10'umuzun ikinci yarısında ancak bir değişiklik gözlemliyoruz.


Slightly weighted events-affected spaces vs baseline


Ancak, olay etkilenen alanları daha ağır ağırlıklandırırsak, öneriler listemizde tamamen yeni öğeler ortaya çıkarırız.


# 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


Tabii ki, tavsiyelerimizi belirli bir kullanıcı davranışına dayalı olarak kişiselleştirmek için ağırlıklar da kullanabiliriz (işlem verileri) veAynı anda diğer ürün özelliklerini önceliklendirinÖrneğin fiyatı (örneğinHücresel 31) için

Sonuç

Superlinked kütüphanesinin eComm RecSys uygulaması (yukarıda), kullanıcı sorgularının ve davranış verilerinin semantik anlamını entegre ederek vektor entegre gücünü nasıl gerçekleştirebileceğinizi gösterir. min_max sayısı ve metin benzerliği alanları, olay şemaları ve efektleri ve sorguların zaman ağırlıklarını kullanarak, RecSys'in soğuk başlangıç, kalite ve alakalılık ve ölçeklenebilirlik sorunlarını ele alabilir ve üretimde yüksek hassasiyetle kişiselleştirilmiş öneriler sağlayabilirsiniz.

Artık senin sıra!Superlinked kütüphanesini kendi kullanarak uygulamaya çalışınve .

Try It Yourself – Get the Code & Demo!

Kendiniz deneyin - Kodu ve Demo'yu alın!
    Şöyle
  • Kodu alın: GitHub repo'mızdaki tam uygulama buraya bakın.Fork, ayarlayın ve kendi yapın!
  • Şöyle
  • See It in Action: Gerçek dünyadaki bir kurulumda bunu görmek ister misiniz? Hızlı bir demo rezervasyonu yapın ve Superlinked'in önerilerinizi nasıl aşırı yükleyebileceğini keşfedin.
  • Şöyle
burdaburdave .

Önerme motorları, içeriği keşfetmenin yolunu şekillendiriyor.Sadece popüler pantolonlar, müzikler veya diğer ürünler,vector search is the future- ve şimdi kendi inşa etmek için araçlarınız var.

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks