Öneri sistemleri hayatımızın ayrılmaz ve vazgeçilmez bir parçası haline geldi. Bu akıllı algoritmalar, tükettiğimiz içeriği, satın aldığımız ürünleri ve araştırdığımız hizmetleri etkileyerek çevrimiçi deneyimlerimizi şekillendirmede çok önemlidir. Netflix gibi platformlarda içerik akışı yapıyor olsak da, Spotify'da yeni müzikler keşfediyor olsak da ya da çevrimiçi alışveriş yapıyor olsak da, öneri sistemleri etkileşimlerimizi kişiselleştirmek ve geliştirmek için perde arkasında sessizce çalışıyor.
Bu öneri sistemlerinin benzersiz unsuru, geçmiş davranış ve kullanıcı kalıplarına dayalı tercihlerimizi anlama ve tahmin etme yetenekleridir. Bu sistemler geçmiş tercihlerimizi analiz ederek kişiye özel öneriler hazırlayarak zamandan ve emekten tasarruf etmemizi sağlarken ilgi alanlarımıza uygun içerik/ürünlerle bizi tanıştırır. Bu, kullanıcı memnuniyetini artırır ve keşfi teşvik ederek bizi başka türlü karşılaşmayacağımız yeni ve ilgili tekliflerle tanıştırır.
Geliştiriciler yüksek düzeyde, bu algoritmaların makine öğrenimi ve derin öğrenme sistemleri (birbirinin yerine sinir ağları olarak adlandırılır) tarafından desteklendiğini anlıyorlar, ancak size sinir ağlarınızı dağıtma zahmetine girmeden bir öneri motoru oluşturmanın bir yolu olduğunu söylersem ne olur? net mi yoksa makine öğrenimi modeli mi?
Bu soru özellikle erken ve orta aşamadaki girişimler bağlamında önemlidir çünkü modellerini eğitmek için tonlarca yapılandırılmış veriye sahip değillerdir. Zaten bildiğimiz gibi çoğu makine öğrenimi modeli, uygun eğitim verileri olmadan doğru tahminler vermez.
Yakın zamanda bir temel öneri motoru geliştirdim ve uygulamaya koydum.
kapsamlı bir deneyimim vardı
Yüksek düzeyde, mühendislik açısından aşağıdaki gereksinimlere sahiptik:
Sistem, kullanıcının ilgi alanlarını anahtar kelimeler biçiminde yakalayabilmelidir. Sistem ayrıca belirli anahtar kelimelerle kullanıcının ilgi düzeyini de sınıflandırabilmelidir.
Sistem, bir kullanıcının diğer kullanıcılardaki ilgisini çekebilmelidir. Bir kullanıcının başka bir kullanıcı tarafından oluşturulan içeriğe olan ilgi düzeyini sınıflandırabilmelidir.
Sistem, kullanıcının ilgi alanlarına göre yüksek kaliteli öneriler üretebilmelidir.
Sistem, kullanıcı tarafından halihazırda görüntülenen/reddedilen önerilerin X gün boyunca tekrar görünmemesini sağlayabilmelidir.
Sistem, aynı yaratıcıların gönderilerinin aynı sayfada gruplanmamasını sağlayacak bir mantığa sahip olmalıdır . Sistem, bir kullanıcı on gönderi (bizim sayfa boyutumuz) tüketirse, bunların hepsinin farklı yaratıcılardan olmasını sağlamak için elinden geleni yapmalıdır.
Sistem hızlı olmalı. 150 milisaniyeden az P99 gecikmesi.
Yüksek kullanılabilirlik, ölçeklenebilirlik, güvenlik, güvenilirlik, sürdürülebilirlik vb. gibi diğer tüm işlevsel olmayan gereksinimler yerine getirilmelidir.
Yine, bu oldukça aşırı basitleştirilmiş bir sorun bildirimleri listesidir. Gerçekte belgeler 3000'den fazla kelime uzunluğundaydı, çünkü bu öneri motorunu mevcut sistemlerimize entegre ederken ortaya çıkabilecek birçok uç durumu ve köşe durumu da kapsıyordu. Çözüme geçelim.
Sorunun çözümlerini tek tek ele alıp ardından tüm sistemin genel işleyişini anlatacağım.
Bunun için adı verilen bir şey yarattık.
Yukarıdaki görüntüden de görebileceğiniz gibi, etkileşimlerin sayısı (beğeniler, yorumlar, paylaşımlar) ve bu etkileşimlerin güncelliği (en son ne zaman gerçekleştiği) gibi birçok bilgiyi iki kullanıcı arasındaki ilişki verileri olarak saklıyoruz. bir kullanıcı ve ilgi. İki farklı ilgi alanı anahtar kelimesi arasındaki ilişkiyi bile saklıyoruz. kullandım
Bu ilgi alanı anahtar kelimeleri ağırlıklı olarak isimlerdir. Bir gönderinin içeriğini bu anahtar kelimelere (isimlere) ayıran bir sistem mevcuttur. AWS tarafından desteklenmektedir; metni varlıklara, anahtar ifadelere vb. bölmek için makine öğrenimini kullanan bir doğal dil işleme (NLP) hizmetidir. Aynı işlemi gerçekleştirmek için yine herhangi bir yönetilen NLP hizmetini (birkaç tane mevcuttur) kullanabilirsiniz. Makine öğrenimi modellerinizi öğrenmenize veya dağıtmanıza gerek yok! Makine öğrenimini zaten anlıyorsanız kontrol edebilirsiniz
Aşağıdaki diyagram sistemin nasıl çalıştığının basitleştirilmiş üst düzey bir temsilidir.
Yukarıdakiler kolay gibi görünse de, her adımda gerçekleşen çok daha fazlası vardır ve sistemin en iyi şekilde performans göstermesini sağlamak için bunların dikkatlice düşünülmesi ve programlanması gerekir.
Adım adım anlatayım:
Bu önerileri oluşturmak için öncelikle bir gönderinin içeriğini şu şekilde bir şeye dönüştürmeliyiz:
Vektör yerleştirmelerini oluşturmak için, kullanım durumunuza bağlı olarak OpenAI yerleştirme modeli , Amazon titan veya herhangi bir açık kaynaklı metin yerleştirme modeli gibi öne çıkan herhangi bir yerleştirme modelini kullanabilirsiniz. Uygun fiyatı, performansı ve operasyonel kolaylığı nedeniyle Amazon Titan'ı tercih ettik.
İşte işlerin ilginçleştiği yer burası. Sorguları özel iş ihtiyaçlarınıza göre tasarlamak istersiniz. Örneğin, ilgi alanlarını sorgularken belirli bir anahtar kelime veya kullanıcıyla gerçekleşen etkileşimlerin sayısından ziyade etkileşimin güncelliğine daha fazla ağırlık veriyoruz. Ayrıca kullanıcının farklı ilgi türlerini (anahtar kelime veya diğer kullanıcı) bulmak için birden fazla paralel sorgu çalıştırırız. Tek bir kullanıcı için birden fazla yayın oluşturduğumuzdan, trende göre belirli bir konuyu tanıtan bazı sorgular da çalıştırıyoruz (örneğin, Noel'in yakınında Noel ile ilgili birçok gönderi veya deprem olmuşsa depremle ilgili gönderiler göreceksiniz). Söylemeye gerek yok, bu konu yalnızca kullanıcı yolculuğu sırasında bu konuya biraz ilgi duyduğunda sorgu sonuçlarında ortaya çıkacaktır.
Bu nedenle, iş kullanım durumunuza ve yönlendirmek istediğiniz davranışa uygun mantığı seçin ve tüm kullanıcının ilgi alanlarını içeren yeterince büyük bir liste elde etmek için birden fazla sorgu çalıştırın.
Vektör veritabanları ağırlıklı olarak belirli bir arama türünü gerçekleştirmek için kullanılır.
Veritabanını önbelleğe alın çünkü çözmemiz gereken sorunlardan biri hızdır. Belirli bir kullanıcıya ait gönderilerin benzersiz kimliklerini depolamak için redis sorted setlerini kullandık. Bir kullanıcının akışındaki gönderilerin sırası kritik olduğundan redis sıralı kümeler kullandık. Ayrıca çözmeniz gereken bir diğer sorun da " sistemin, aynı yaratıcıların gönderilerinin aynı sayfada gruplanmamasını sağlayacak bir mantığa sahip olması gerektiğidir ". Aynı yaratıcının içeriğinin tekrarlanmasını önlemek için, belirli bir yaratıcının gönderisinin belirli bir kullanıcının akışında (sıralanmış küme) herhangi bir konuma eklenmesi durumunda, aynı yaratıcıdan başka bir gönderi eklemememizi sağlayan basit bir algoritma yazdık. ardışık on konum için (feed'i son kullanıcıya sunarken sayfa boyutumuz 10'dur, bu nedenle karmaşıklığı önlemek için onu statik tuttuk).
Kullanıcının belirli bir tavsiyesinin sırasına karar vermek için aşağıdakileri dikkate aldık:
Bu kullanıcının belirli bir ilgi alanıyla (veya başka bir kullanıcıyla) ilişkisinin gücü : Sosyal grafikten çeşitli veri noktalarını alan aritmetik bir formülle belirlenir. Bunların hepsi, oluşturulan son beğenilerin zaman damgası, oluşturulan beğenilerin sayısı, son yorum vb. etkileşim verileridir. Kullanıcı etkileşim davranışı, onların bir şeye olan ilgisinin göstergesidir.
Gönderinin platformdaki popülerliği: Bunu belirlemek için etkileşim, etkileşim-gösterim oranları, etkileşime giren benzersiz kullanıcı sayısı vb. gibi çeşitli faktörleri alarak bunun etkileşim puanını oluşturan bir algoritma oluşturduk. platform düzeyinde yayınlayın.
Bazı yayınlarda popülerliğe öncelik veriyoruz; diğerlerinde sosyal grafiğe öncelik veriyoruz. Ancak çoğunlukla hepsi bu ikisinin sağlıklı bir karışımıdır.
Yukarıdaki diyagramdan da görebileceğiniz gibi sistem bilinçli olarak çok basit tutulmuştur. Sistemin nasıl çalıştığı aşağıda açıklanmıştır -
A kullanıcısı bir gönderi oluşturduğunda, gönderi hizmeti, bu gönderiyi kaydettikten sonra aday oluşturmaya yönelik bir arka plan hizmeti tarafından alınan sıraya yönelik bir pub/sub etkinliğini tetikler. Kullanırız
Bu arka plan hizmeti bunu eşzamansız olarak alır ve daha önce tartışılan işlevleri (Gizlilik kontrolleri, denetleme kontrolleri ve anahtar kelime oluşturma) gerçekleştirir ve ardından vektör yerleştirmelerini oluşturur ve bunları vektör veritabanında saklar. Kullanıyoruz
Bir kullanıcı ana NoSQL veritabanımızı güncelledikten sonra etkileşimde bulunduğunda (beğen/yorum yap/paylaş vb.), hizmet sonrası, öneri motoru hizmetine bir pub/sub olayı tetikler.
Bu öneri motoru hizmeti, grafik veritabanını günceller ve ardından YSA araması gerçekleştirip Redis veritabanını güncelleyerek kullanıcının önerilen akışını neredeyse gerçek zamanlı olarak günceller. Yani, kullanıcılar ne kadar çok etkileşimde bulunursa yayın da o kadar iyi hale gelir. Önerilerin belirli bir anahtar kelime listesine yönelik önyargılı olmadığından emin olmak için kontroller vardır . Bu kontroller Graph veritabanını sorgularken gerçekleştirilir. Bu hizmet aynı zamanda etkileşim puanını eşzamansız olarak günceller. Gönderiyi görüntüleyen kullanıcıların etkileşim puanları da yeniden hesaplanır.
Yukarıdaki adımların tümü perde arkasında eşzamansız olarak gerçekleştirildiğinden, bu hesaplamaların son kullanıcı deneyimi üzerinde hiçbir etkisi yoktur.
Özet akışı son olarak bir özet akışı hizmeti aracılığıyla son kullanıcıya sunulur. Bu hizmet yalnızca redis ve ana NoSQL veritabanımızda arama yaptığından (
Bazı hizmetler şu şekilde yazılmıştır:
Kullanıyoruz
Kullanırız
Tahmin edebileceğiniz gibi, aynı kurulum herhangi bir kullanım durumu için temel bir öneri motoru oluşturmak üzere değiştirilebilir. Ancak bizimki bir sosyal ağ olduğundan, bu sistemi daha verimli hale getirmek için bazı değişiklikler yapmamız gerekecek.
Kullanıcıyla en alakalı anahtar kelimeleri ve kullanıcıları tahmin etmek için sosyal grafik düzeyinde makine öğrenimi/Derin öğrenme algoritmalarına ihtiyaç duyulacaktır. Şu anda veri seti çok yeni bir ürün olduğu için herhangi bir şeyi doğru bir şekilde tahmin etmek için çok küçük. Ancak veriler büyüdükçe mevcut basit sorguları ve formülleri makine öğrenmesi algoritmalarının çıktılarıyla değiştirmemiz gerekecek.
Çeşitli anahtar kelimeler ve kullanıcılar arasındaki ilişkilere ince ayar yapılmalı ve daha ayrıntılı hale getirilmelidir. Şu anda çok yüksek bir seviyedeler. Ancak daha derin olmaları gerekecek. Önce önerileri hassaslaştırmak için grafiğimizdeki ikinci ve üçüncü derece ilişkileri keşfetmemiz gerekecek.
Şu anda gömme modellerimizde herhangi bir ince ayar yapmıyoruz. Yakın gelecekte bunu yapmamız gerekecek.
Umarım bu blogu faydalı bulmuşsunuzdur. Herhangi bir sorunuz, şüpheniz veya öneriniz varsa lütfen benimle iletişime geçmekten çekinmeyin.
Burada da yayınlandı.