Przejdź do treści
Wróć do bloga
7 min czytania

Cleora: rekomendacje bez modelu językowego

Rekomendacje „podobne produkty” i „klienci kupili też” da się policzyć bez modelu językowego. Wystarczy historia zakupów zamieniona w graf, czyli sieć powiązań, i algorytm, który zamienia ten graf w liczby. Cleora, otwarty projekt zespołu z Polski, robi to na zwykłym procesorze. Poniżej liczby, które opublikowali jej autorzy, i miejsca, w których ta metoda zawodzi.

MLGrafyOpen source
Sieć niebieskich węzłów z jednym pomarańczowym, duża strzałka i lista poziomych pasków, z których jeden jest pomarańczowy.

Zachowanie Twoich klientów układa się w graf samo z siebie. Klient łączy się z produktem, który kupił, produkt z kategorią, koszyk z innym koszykiem. Nikt tego nie projektuje, to po prostu zapis tego, co wydarzyło się w sklepie. Embedding to zamiana takiego obiektu na wiersz liczb, zwykle kilkuset, ułożony tak, żeby obiekty o podobnej historii miały podobne wiersze. Kiedy masz już te wiersze, pytanie „co jest podobne do tego produktu” przestaje być problemem badawczym i staje się zwykłym wyszukiwaniem najbliższych sąsiadów w bazie danych.

Po lewej graf powiązań między użytkownikami i produktami, po prawej te same obiekty zamienione na wiersze liczb.
Zachowanie klientów jako graf i te same obiekty po zamianie na wektory.Źródło: Schemat własny na podstawie dokumentacji CleoryOtwórz w pełnym rozmiarze

Czym jest Cleora i kto ją zbudował

Cleorę opisali w lutym 2021 roku Barbara Rychalska, Piotr Bąbel, Konrad Gołuchowski, Andrzej Michałowski i Jacek Dąbrowski, pracujący w polskiej firmie Synerise, częściowo także na Politechnice Warszawskiej. Kod od początku jest otwarty, na licencji MIT, która pozwala na użycie komercyjne. Dziś repozytorium prowadzi BaseModelAI, a bibliotekę instaluje się jednym poleceniem jako pycleora. Najnowsze wydanie w serwisie PyPI ma datę 2 kwietnia 2026 roku, więc projekt nie jest porzucony.

Sam pomysł jest zaskakująco prosty. Każdy węzeł grafu dostaje na starcie wiersz liczb, a potem w kółko zastępuje go uśrednionym wierszem swoich sąsiadów i normalizuje wynik. Nie ma funkcji celu, nie ma losowania przykładów pozytywnych i negatywnych, nie ma karty graficznej. Autorzy piszą, że algorytm ma tylko dwa parametry do ustawienia, liczbę powtórzeń i długość wiersza, podczas gdy konkurencyjny PyTorch BigGraph ma ich co najmniej osiemnaście. Ta prostota jest powodem, dla którego liczby poniżej wyglądają tak, jak wyglądają.

Trzy warianty: ta sama tabela użytkowników i produktów zamieniona na graf z wagami na krawędziach, dla różnych ustawień kolumn.
Ta sama tabela zamówień, trzy sposoby zbudowania z niej grafu. Liczby na krawędziach to wagi powiązań.Źródło: rys. 1 z pracy Rychalska i in., arXiv 2102.02302, CC BY 4.0Otwórz w pełnym rozmiarze

Liczby, które opublikowali autorzy

W pracy z 2021 roku autorzy zmierzyli czas na pięciu publicznych grafach. Weźmy graf YouTube: 1 134 890 węzłów i 2 987 624 krawędzi. Policzenie embeddingów zajęło Cleorze 12 minut i 7 sekund. PyTorch BigGraph, skalowalny silnik z laboratorium Facebooka, potrzebował 54 minut i 35 sekund. DeepWalk, klasyczna metoda grafowa, liczył 28 godzin i 33 minuty. Wszystko na jednej maszynie w chmurze Azure, typ Standard E32s v3, 32 wirtualne rdzenie i 256 GB pamięci.

Wykres słupkowy czasu liczenia na grafie YouTube: Cleora 12,1 minuty, PyTorch BigGraph 54,6 minuty, DeepWalk 1713,9 minuty.
Ten sam graf, ta sama maszyna, trzy metody. Słupek Cleory jest ledwo widoczny i to jest cała teza tej pracy.Źródło: dane: tabela II z pracy o Cleorze, arXiv 2102.02302Otwórz w pełnym rozmiarze

Na większych grafach różnica rośnie. LiveJournal, 4 847 571 węzłów i niecałe 69 milionów krawędzi: Cleora 1 godzina 36 minut, PyTorch BigGraph 10 godzin 38 minut, DeepWalk nie skończył wcale. Na grafie Twittera, 41,65 miliona węzłów i 1,47 miliarda krawędzi, jedyną metodą, która dobiegła do końca, była Cleora, w 25 godzin i 34 minuty. Pozostałe przerwały pracę na zużyciu pamięci. Autorzy dodają, że w ich własnym środowisku produkcyjnym największe zbiory e-commerce liczyły się poniżej dwóch godzin na tej samej maszynie.

Jakość to inna historia i warto ją przeczytać dokładnie. W zadaniu przypisywania węzłów do kategorii na grafie Facebooka, 22 470 węzłów, Cleora dostała micro‑F1, czyli miarę trafności, na poziomie 0,9165. To czwarty wynik z pięciu. Lepsze były LINE (0,9442), DeepWalk (0,9349) i PyTorch BigGraph (0,9258). Tyle że dwie pierwsze metody autorzy sami zaliczyli do nieskalowalnych: na większych grafach po prostu nie kończą pracy. Gorzej od niej wypadł tylko GOSH, metoda liczona na karcie graficznej. Cleora nie wygrywa jakością. Wygrywa tym, że dowozi wynik wtedy, gdy inni się poddają.

Wykres słupkowy trafności micro‑F1 na grafie Facebooka: LINE 0,9442, DeepWalk 0,9349, PyTorch BigGraph 0,9258, Cleora 0,9165, GOSH 0,8312.
Cleora jest czwarta z pięciu, a dwie metody przed nią autorzy opisali jako nieskalowalne. Wszystkie wyniki poza GOSH mieszczą się w trzech punktach procentowych.Źródło: dane: tabela IV z pracy o Cleorze, arXiv 2102.02302Otwórz w pełnym rozmiarze

Gdzie to bije model językowy

Model językowy nie ma tu przewagi, bo nie ma czego czytać. Informacja, że dwa produkty pasują do siebie, nie siedzi w ich opisach, tylko w tym, że tysiąc osób kupiło je razem. Do tego dochodzi rachunek. Załóżmy, że pokazujesz sekcję „podobne produkty” przy 100 tysiącach odsłon dziennie i że jedno zapytanie do modelu to 2000 tokenów wejściowych, czyli kawałków tekstu. To założenie, nie pomiar. Wychodzi 200 milionów tokenów dziennie. W publicznym cenniku Anthropic najtańszy model, Claude Haiku 4.5, kosztuje 1 dolara za milion tokenów wejściowych, więc same wejścia to 200 dolarów dziennie, około 6 tysięcy dolarów miesięcznie, zanim policzymy odpowiedzi.

Po stronie embeddingów opłata za pojedyncze zapytanie nie istnieje. Wiersze liczb są policzone wcześniej, a odpowiedź to wyszukanie w bazie danych, więc opóźnienie jest takie samo jak przy każdym innym zapytaniu do niej. Dla skali: w benchmarku na stronie projektu graf sieci drogowej Kalifornii, 1 965 206 węzłów, policzył się w 31,5 sekundy na jednym współdzielonym rdzeniu.

Gdzie ta metoda zawodzi

Największa dziura jest tam, gdzie nie ma historii. Cleora czyta wyłącznie strukturę grafu, więc produkt wstawiony dziś do katalogu nie ma z czego dostać wiersza liczb. Zespół Zomato, platformy do zamawiania jedzenia, opisał to wprost w kwietniu 2022 roku: w odróżnieniu od GraphSAGE, czyli sieci neuronowej na grafach, do Cleory nie dało się wtedy podać cech produktu, a wagi krawędzi nie były zaimplementowane. Ta sama publikacja jest zresztą najczęściej powtarzanym argumentem za Cleorą: embeddingi dla jednego regionu w Indiach liczyły się poniżej 5 minut zamiast około 20 godzin, których potrzebował GraphSAGE.

  • Zimny start. Nowy produkt bez ani jednego zakupu nie istnieje w grafie, więc nie ma dla niego wektora.
  • Encje dominujące. Dokumentacja projektu ostrzega, że obiekt obecny w prawie każdym koszyku, na przykład reklamówka, psuje wyniki i lepiej go usunąć z danych wejściowych.
  • Dokładanie węzłów po fakcie. Autorzy sprawdzili to w osobnym eksperymencie, w którym uczą wprost tylko 30 procent węzłów, a punktem odniesienia jest 0,9190: gdy pozostałe 70 procent dolicza się po policzeniu reszty, trafność na grafie Facebooka spada do 0,8718, a przy drugim poziomie odtwarzania do 0,7856. Na grafie YouTube spadki wynoszą 18 i 40 procent.
  • Mieszanie typów. Dokumentacja mówi wprost, że porównywanie wektora klienta z wektorem produktu jest metodologicznie błędne. Najpierw liczy się produkty, potem składa z nich klientów.

Jak to łączyć z modelem językowym

Te dwa światy się nie wykluczają. Dokumentacja Cleory opisuje wprost, że startowe wiersze liczb można wziąć z modelu czytającego tekst albo obrazek i dopiero potem puścić uśrednianie po grafie. To jest gotowa odpowiedź na zimny start: nowy produkt wchodzi do systemu z wektorem ze swojego opisu i zdjęcia, a historia zakupów poprawia ten wektor później. Sami autorzy poszli dalej i w 2020 roku opublikowali EMDE, nadbudowę, która z wektorów produktów i listy zakupów klienta robi jedną zwięzłą reprezentację klienta. Zomato zbudowało na parze Cleora plus EMDE swoje rekomendacje i podaje Recall@Top10, czyli trafienia w pierwszej dziesiątce, na poziomie 35 procent, zaznaczając od razu, że sama ta liczba niewiele mówi bez miar różnorodności. W takim układzie graf odpowiada na pytanie „co pokazać”, a model językowy co najwyżej na „jak o tym napisać”.

Czego te liczby nie obiecują

Pomiary z pracy pochodzą z lutego 2021 roku i porównują Cleorę z tym, co wtedy uchodziło za skalowalne: PyTorch BigGraph, GOSH, DeepWalk i LINE. Od tamtej pory zmienił się i sprzęt, i konkurencja. Nowszy benchmark na stronie projektu pokazuje Cleorę na pierwszym miejscu we wszystkich pięciu zbiorach, ale warto doczytać metodologię. Wszystko puszczono na jednym współdzielonym rdzeniu z około 3 GB pamięci i limitem 90 sekund na wynik, konkurenci dostali ustawienia domyślne bez strojenia, a autorzy strony sami przyznają, że na większej maszynie część z nich by dokończyła obliczenia. To benchmark dostawcy, nie niezależny test.

Jest jeszcze jedna rzecz, którą łatwo przeoczyć, a która w sklepie zmienia wszystko: liczba powtórzeń zmienia znaczenie wyniku. Przy jednym powtórzeniu najbliżsi sąsiedzi produktu to rzeczy kupowane razem z nim, przy czterech to rzeczy, którymi można go zastąpić. Autorzy pokazali to na danych Dunnhumby z 2500 gospodarstw domowych zbieranych przez dwa lata. To jeden parametr, a odpowiada na dwa zupełnie różne pytania biznesowe i łatwo ustawić go odwrotnie, niż się chciało.

Jeśli masz katalog i historię transakcji, ten test jest tani: jeden plik z parami klient i produkt, jedno przeliczenie, porównanie wyników z tym, co pokazujesz dziś. Jeśli chcesz to sprawdzić na swoich danych, napisz do nas.

Źródła

  1. 01Rychalska et al., Cleora: A Simple, Strong and Scalable Graph Embedding Scheme, arXiv 2102.02302
  2. 02BaseModelAI/cleora, GitHub repository
  3. 03Cleora, Benchmark Results and Methodology
  4. 04Zomato Data Science Team, Connecting the Dots: strengthening recommendations for our customers (Part Two), April 2022
  5. 05Dabrowski et al., An efficient manifold density estimator for all recommendation systems, arXiv 2006.01894
  6. 06Anthropic, Claude API pricing

Więcej z bloga

Opisz proces, który zabiera najwięcej czasu

Wystarczy kilka zdań. Odpowiemy, czy da się go usprawnić, ile to mniej więcej kosztuje i czy w ogóle potrzebujesz do tego AI.