Şöyle Şöyle Peki, e-ticaret mağazanız bir müşterinin ne istediğini yapmadan önce bilseydi ne olurdu? Peki, e-ticaret mağazanız bir müşterinin ne istediğini yapmadan önce bilseydi ne olurdu? sınırlı, eski veriler temelinde “popüler” veya “ benzer” öğeleri önerirler. Kullanı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. Most recommendation engines are like helpful but slightly clueless assistants: struggle Eğer sisteminizin yapabileceği bir merchandiser gibi – statik ürün verilerini ve gerçek zamanlı kullanıcı davranışlarını yüzeye birleştirmek Doğru zamanda mı? Gerçekten düşünüyorum Doğru öğeler Gerçekten düşünüyorum kullanmak , bu geleneksel eksiklikleri, verilerinizi vektor-native altyapısını kullanarak hareket edilebilir, gelişen kullanıcı profillerine dönüştürerek aşan biri. This guide walks you through building a modern recommendation engine Superlinked (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.) burda burda burda burda Ayrıca, bizimle birlikte tarayıcı içi öğretici takip edebilirsiniz Kolaylı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 Şöyle Şöyle Şöyle Kalite ve Uygunluk: Entegre üretim süreci, mimarisi ve verileri dikkatlice göz önünde bulundurulmalıdır. Küçük ve gürültülü veriler: Girişler eksik veya gürültülü girişleri olduğunda daha az etkilidir. Ölçülebilirlik: Büyük veri kümeleri için verimli yöntemler gereklidir; aksi takdirde, gecikme bir sorun olacaktır. 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 Şöyle Şöyle Şöyle Şöyle min_max sayısal alanlar: müşteri yorumlarını ve fiyat bilgileri anlamak için text-similarity Space: Ürün bilgilerinin semantik anlayışı için Vektörleri değiştirmek için olay şeması ve etkiler 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) 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. Bu 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. Hipertansiyon Let's get started! Superlinked ile bir e-ticaret önerme motoru oluşturun Gelişimin başlangıcında, aşağıdakiler var: : Hakkında product data Şöyle Şöyle Şöyle Şöyle Şöyle Şöyle İnceleme Sayısı Ürün Ratingleri Tekstiğin açıklaması Ürün adı (genellikle marka adı içerir) Kategoriler Aynı zamanda aşağıdaki : Hakkında data about users and products Şöyle Şöyle Şöyle Her kullanıcı, kayıt sırasında sunulan üç ürünten birini seçer (yani ürün tercih verileri) Kullanıcı Davranışı (kayıt olduktan sonra) ürünlerin metin özellikleri için tercihleri - ek olay verileri sağlar (bölüm, isim, kategori) Ayrıca, klasik ekonomi bize, ortalama olarak, tüm kullanıcılar ceteris paribus ürünleri tercih ediyor: Şöyle Şöyle Şöyle Şöyle Daha az maliyeti Çok sayıda yorum var Daha Yüksek Değerlendirmeler 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ız Not defterinde Hücre 3 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 Ürünlerimizin dağıtım verilerini de yakından inceleyebiliriz - bakınız Bu, 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. Hücre 5 Ü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. ve . Çekiliş 7-9 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. ve . burda Bu kütüphanenin inşaat bloklarını EComm RecSys'te kullanmaya koyalım. Sisteminize verileriniz hakkında bilgi vermek için. 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() 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. Soğuk Başlangıç Çözümümüz Olaylar olmadan neler yapabiliriz 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. Kullanıcı_1 için önerilen ürünler de mevcuttur. ç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. Ü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.) Genel olarak ve 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() Yeni bir kullanıcı aramasında, tavsiye sonuçlarımız için bir giriş olarak sorgu metni girer - bakınız ve . Hücre 20 Örnek örneğimizde, user_1 aradı "kız giyim ceketleri". biz vererek sonuçlarımızı optimize edebilirsiniz (Bölüm ), daha fazla “kadın giyim ceketleri” ürünleri tavsiye. 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() Ek kategori ağırlığımız daha fazla kadın kıyafet sonuçları üretir. Üst sınıf ürünler için önerilerimizi de öne çıkarabiliriz ( Sonuç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. ve . review_rating_weight=5 Hücresel 22 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. (Aşağıya bakınız) olaylar olarak temsil edilir: behavioral data Şöyle Şöyle Şöyle Sıradan ve eğlence ürünleri ile ilgilenen bir kullanıcı (user_2) dışarı çıkmak ve resmi iş fırsatları için zarif ürünlerle ilgilenen bir kullanıcı (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 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. veya İlk olarak, bu olaylar tarafından etkilenen alanları ağırlatmanın etkisi (baseline karşılaştırıldığında) görelim. sadece hafifçe Ağır # 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. 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"]] Tabii ki, tavsiyelerimizi belirli bir kullanıcı davranışına dayalı olarak kişiselleştirmek için ağırlıklar da kullanabiliriz (işlem verileri) ve Örneğin fiyatı (örneğin ) için Aynı anda diğer ürün özelliklerini önceliklendirin Hücresel 31 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! ve . Superlinked kütüphanesini kendi kullanarak uygulamaya çalışın Try It Yourself – Get the Code & Demo! Kendiniz deneyin - Kodu ve Demo'yu alın! Şöyle Şöyle Şöyle Kodu alın: GitHub repo'mızdaki tam uygulama buraya bakın.Fork, ayarlayın ve kendi yapın! 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. burda burda ve . Önerme motorları, içeriği keşfetmenin yolunu şekillendiriyor.Sadece popüler pantolonlar, müzikler veya diğer ürünler, - ve şimdi kendi inşa etmek için araçlarınız var. vector search is the future