Vývoj

Napiš mi 5 slov a já ti najdu spoustu překvapivých výsledků

Marek Kužel

Vývoj

V našem Search týmu se, jak už jméno napovídá, věnujeme především vyhledávání na Heurece. Asi před rokem jsme přemýšleli, jak našim uživatelům ještě více zpříjemnit vyhledávání. Co kdybychom jim rovnou dokázali zobrazit konkrétní kategorii, produkt nebo e-shop a ne jen rozcestník? A navíc předvyplnit filtry? Podle našich uživatelských testů jsou pak spokojenější a každý ušetřený klik ocení. V tomto článku vám tedy zjednodušeně popíšu, jak přistupujeme k pochopení vyhledávaného dotazu (tzv. “Query Understanding”) na české a slovenské Heurece.

Vyhledáváme na Heurece – a skončíme ve fulltextu

Podívejme se tedy nejprve na to, jak funguje základní vyhledávání na Heurece. Zjednodušeně napsáno, uživatelé na Heurece vyhledávají Produkty, například iPhone 12 Pro. Všechny ostatní prvky jako Kategorie (Mobilní telefony), Výrobci/Značky (Apple) nebo E-shopy (vymysleny-obchod.cz) slouží, z hlediska vyhledávání, hlavně jako kontext pro zobrazení relevantnějších Produktů ve výsledcích… Teď jsem si sice trochu hodně zapřeháněl, ale mnohem podrobnější informace obsahuje už článek kolegy Vládi.


Jak vypadá typické vyhledávání na Heurece? 

  1. Uživatel napíše maximálně 5 slov (v 93 % případů) do vyhledávacího pole na webu (= Query), v polovině případů unikátních.
  2. Náš systém vyhledá odpovídající Produkty a zobrazíme je nejspíše v tzv. fulltextových výsledcích. Prostě mix všech nalezených Produktů napříč různými Kategoriemi, bez možnosti dalšího filtrování.

Raději chceme skončit v Kategorii!

Pokud jsme si ale dostatečně jistí, že zadaná Query (nebo drtivá většina Produktů vyhledaných dle této Query) patří do jedné konkrétní Kategorie, rovnou do ní uživatele přesměrujeme. Čímž mu mimo jiné umožníme využít Filtry (barva, výrobce, cena, energetická třída, atp.) nebo strom kategorií (Elektronika – Mobilní telefony – Pro seniory) a tedy lépe specifikovat zobrazené Produkty. Win-win-win situace. Uživatel je spokojenější (máme změřeno), tedy zůstává na Heurece déle, prohlédne si více Produktů a zvyšuje se šance, že některý z nich i koupí. Profituje uživatel, Heureka i e‑shop. Prostě velká šťastná e‑commerce rodinka.



Obdobně můžeme rozhodnout, že daná Query s vysokou pravděpodobností (nejlépe hraničící s jistotou) odkazuje na konkrétní Značku nebo E-shop. Postup pak zůstává stejný, opět dojde k přesměrování uživatele na profil dané Značky či E-shopu.


Budeme přesměrovávat?

Původní způsob přesměrování byl založen primárně na tzv. „přesné shodě“ (Exact Match). Pokud uživatel zadal do vyhledávacího pole naprosto přesně název Kategorie, Značky nebo E-shopu, bez chyb a překlepů, byl přesměrován. Byl to neprůstřelný způsob – přesměrování byla sice naprosto správná a očekávaná, ale bylo jich málo.

Proto jsme rozšířili možnost přesměrování o ručně definovaná pravidla. Nicméně ta nakonec sloužila spíše k pokrytí častých překlepů (např. setobox – Set-Top box) protože detekce, plnění a údržba takovýchto pravidel byla časově náročná. A nudná.

Nemohlo by se přesměrovávat více automaticky?

Proto jsme se začali věnovat „porozumění“ Query (Query Understanding):

  • rozpoznat v Query slova, která určují Kategorii, Produkt, Značku nebo E-shop (a to nejen přesnou shodou, ale i významem)
  • rozpoznat Filtry (barva, výrobce, cena, atd.)
  • zachovat vysokou „přesnost“ (být si jistí, že rozpoznání je správné)
  • a udržet dostatečnou „úplnost“ (dohledáme všechny očekávané výsledky a nesklouzneme jen zpět k přesné shodě, byť jinou a více cool technologií)
  • a pokud možno maximálně automatizovaně

Ukažme si na příkladu pro Query zadanou uživatelem: „Levný dotykový Samsung s NFC a Dual SIM“

    • Kategorie = Mobilní telefony (ač se vlastně její jméno ani popis v Query neobjevuje, ale kombinace slov „dotykový“, „NFC“ a „Dual SIM“ na ni jasně ukazuje)
    • Výrobce = Samsung (názvy společností jsou celkem snadno odhalitelné přesnou shodou)
  • Cena = levná (využijme cenové filtry Heureky, kdy pro každou Kategorii existuje 5 cenových rozpětí, levná jsou jednoduše dvě nejnižší)
  • Filtry = NFC, dotykový, Dual SIM (opět, jakmile máme detekovanou Kategorii, můžeme ji využít jako kontext a omezit se v rozpoznávání na malý počet k ní existujících Filtrů)

V ideálním případě tedy z vyhledávané Query nezbyl žádný text a byla přeměněna na konkrétní Kategorii s aplikovanými Filtry.


Správná detekce Kategorie je nejdůležitější

Rozpoznání Kategorie = získání (dalšího) kontextu = zpřesnění detekce (nejen) Filtrů.Filtry jsou celkem 😊 důležité, představme si, že bychom předchozí cvičnou Query („Levný dotykový Samsung s NFC a Dual SIM“) detekovali jen jako Kategorii Mobilní telefony a s Filtry se už neobtěžovali… Na prvních místech bychom uživateli vypsali drahé iPhony, což není úplně jím očekávaný výsledek.

Ve zkratce řečeno – bez přesné (a dostatečně úplné) detekce Kategorií nelze příliš pokročit. Výhodou je, že strom Kategorií není příliš obsáhlý (máme jich tři tisíce), moc se nemění (desítky změn měsíčně) a je výtečně pokrytý SEO (synonyma, klíčová slova, atp.). Taktéž máme k dispozici miliony záznamů o dřívějších vyhledáváních… Dohromady slibná výchozí pozice pro trénování modelu strojového učení (ML modelu). 

Pro účely tohoto článku berme ML model jako zázračnou černou skříňku. Jednou se k jeho vývoji vrátíme (slibem nezarmoutíš) v dalším článku o Vyhledávání na Heurece. Důležité teď je, že do této skříňky vložíme Query zadanou uživatelem a ona nám vrátí, do které Kategorie patří (a s jakou jistotou).

Jak na rozpoznání Filtrů

Filtry lze rozdělit do dvou skupin:

  • obecné, opakující se v téměř každé Kategorii (např. barva, cena, výrobce)
  • unikátní pro několik málo Kategorií (úhlopříčka displeje, typ motoru, nosnost, atp.)

Podívali jsme se do statistik a zjistili, že obecné filtry jsou násobně používanější než unikátní – a zároveň mají přesah do mnohem více Kategorií. Proto jsme se rozhodli, že pro začátek se zaměříme na obecnou barvu, cenu a výrobce, vyhodnotíme je a unikátní Filtry prozatím necháme uležet. Za málo peněz hodně detekcí.

  • Barva – detekce pomocí shody se seznamem možných barev (např. modrá, žlutá), jejich kombinací (např. černobílá) a stupňování (např. světle, tmavá)
  • Cena – detekce pomocí shody s klíčovými slovy (např. levná, nejlevnější, drahá)
  • Výrobce, E‑shopy, Produkty – v těchto případech se úplně nedalo pracovat s fixním seznamem možností, data průběžně přibývají (i ubývají) a bylo potřeba detekci vyřešit dynamicky.


Rozpoznání konkrétních Značek, Produktů a E‑shopů

Značky, Produkty ani E-shopy nejsou (obecně) závislé na kontextu nalezené Kategorie. Mohou existovat samy o sobě, jako např. stránka recenzí E‑shopu nebo Produktový detail.

Přemýšleli jsme, zda máme vytvořit další strojový model, který by byl schopen rozpoznat například Produkty. Proto jsme si nejprve porovnali, jaký je vlastně mezi KategoriemiProdukty rozdíl:


Kategorie

Produkty

Počet

cca. 3000

cca. 30 000 000

Podobnost názvů

malá, např. Mobilní telefony vs. Knihy

velká ve shlucích: iPhone 8, 9, 10, 11, 12, mini, PRO, 64 GB, 128 GB, …

Počet změn

jednotky denně

stovky za sekundu

Možné způsoby detekce

Název, synonymum, klíčová slova, výčet produktů, popis, existující filtry, …

Název, popis

Z porovnání vidíme, že v existujícím modelu bereme v potaz Kategorie, kterých není mnoho. Jsou od sebe rozlišitelné jen dle názvu (a případně synonym) a prakticky se nemění. I tak je náš ML model schopen s vysokou přesností i úplností detekovat zhruba 1000 z nich. To nám nevadí, ostatní už nejsou tolik navštěvované – aneb pravidlo 90/10

Proto jsme neměli úplně optimistické představy, jak bychom dopadli s kvalitou modelu u Produktů (nemáme neomezený rozpočet a zdroje, zatím 😀). Je mimochodem potřeba zmínit, že detekujeme Kategorii či Produkt v reálném čase jen za pomoci Query (většinou o max. pěti slovech). Což je rozdíl například oproti párování produktů, které probíhá dávkově a má k dispozici další metadata (obrázky, popisky, cenu, výrobce, prodejce, atd.)

A je vlastně vůbec ML model potřeba? Vždyť u Produktů máme k dispozici (zjednodušeně) jen název a popis. Takže můžeme využít stávající a ověřený způsob pomocí real-time vyhledávání v Elasticu. A tady opět připomínám Vláďův článek.

Není těch variant už příliš?

Dobře, nyní jsme schopni detekovat Kategorii, Značku, E‑shop, Produkt a obecné Filtry. Jenže každou z těchto entit několika způsoby (přesná shoda, Elasticsearch query, ML model, číselník hodnot a ještě další, které jsem pro jednoduchost vynechal), a to vše navíc v několika kontextech:

  • Je rozpoznaná Značka jen součást Filtru (Výrobce) v Kategorii
  • Nebo má dojít k přesměrování na detail Značky
    • Je například Apple jen filtr pro Mobilní telefony? 
    • Nebo přesměrování na hodnocení značky Apple? 
  • A co Query „Kolo“ – jedná se o Kategorii, Značku nebo E-Shop (všechny tyto varianty skutečně na Heurece existují).
  • A když se liší výstup detekce ML modelu s např. Přesnou shodou? 
    • Nebo jsou chybné oba?

Spousta otázek. 

Inspirace Walmartem

Walmart sice řeší trochu jinou oblast (zařazování Produktů do Kategorie), ale narazil na obdobné otázky. Nicméně jejich řešení bylo rámcově aplikovatelné na náš problém. Skládá se ze tří základních přístupů – Strojového učení, odborníky psaných analytických pravidel a ověřování kvality davem (CrowdSourcing). Při využití jejich předností a potlačení nevýhod:

  • Manuálně psaná analytická pravidla – výborná pro pokrytí okrajových případů, ale drahá, protože jsou psaná analytiky, kterých obecně nebývá mnoho a mají limitovaný čas (zvládnou řádově tisíce pravidel ročně). Typicky definované jako whitelist i blacklist pravidla
    • Whitelist pravidla – přidávají možná přesměrování, na které ML model sám nepřišel (Query „Boby“ přesměrovat do Kategorie Luštěniny)
    • Blacklist pravidla – zakazují přesměrování, které určil ML model, ale jsou dle zpětné kontroly chybná (Query „Boby“ nepřesměrovávat v létě do Kategorie Zimní vybavení)
  • ML modely – výborné pro obecné (ve Walmartu 92 %) případy, lze kombinovat výstupy z více typů modelů
  • Crowdsourcing – levný, škálovatelný (počet lidí hodnotících kvalitu, lze v čase snadno zvýšit nebo snížit dle aktuální potřeby, narozdíl třeba od zaměstnanců). Zadávat lze ovšem jen mikroúkoly, nic komplikovaného, nejlépe v podobě Ano/Ne otázek (například: Je správné přesměrování Query „Apple iPhone SE“ do Kategorie Mobilní telefony? Ano – Ne).
    • V Heurece dokážeme řešit přímo s konkrétním uživatelem. Po přesměrování mu nabídneme možnost vrátit se zpět na Fulltextové výsledky a pokud tuto možnost využije, víme, že bylo přesměrování chybné a daný případ analyzujeme (tzv. Negative Feedback).


A stále dokola

Iterovat, iterovat, iterovat a z iterací se učit a zdokonalovat. Nově zadaná manuální pravidla i negativní zpětná vazba od uživatelů generují nové vstupy pro další trénování ML modelu (a ML model naopak generuje nové vstupy pro opravná pravidla 😅). Každá další iterace ale musí zachovat požadovanou přesnost (95 %) a zvyšovat úplnost

Jak takové real-time vyhledávání funguje?

  • V prvním kroku jsou paralelně vyvolány všechny Detektory (ML modely, Exact match, Elasticsearch, atd.), které na základě vstupní Query vygenerují seznam Kandidátů na přesměrování (Produkty, Kantegorie, Značky, atd.)


  • Tzv. “Voting Master”, hlasovací mechanismus, který kombinuje obdržené Kandidáty ze všech Detektorů a rozhoduje o finálním přesměrování. 
  • Veto mechanismus – ne vždy ale takový systém funguje bez chyby a občas je potřeba (pro určitou Query) zakázat jakékoliv přesměrování – jako rychlá oprava, než dojde k analýze příčiny chyby. K tomu slouží speciální sada blacklist pravidel, které mají absolutní platnost a nemohou být nikdy přehlasovány Voting Masterem (např. Zákaz přesměrování pro Query „Boby“ do Kategorie Zimní vybavení během Sezóny sázení luštěnin). 


Ukažme si na příkladu detekce Kategorie

Mějme několik detektorů Kategorie a jejich změřenou přesnost:

  • ML model (95 %)
  • Exact Match Detektor (100 %)
  • Elasticsearch fulltext Query Detektor (96 %)
  • Heuristický Detektor (zvolíme nejčastější Kategorii u Top 20 Produktů dohledaných dle dané Query) – překvapivě, takový detektor má 96% přesnost a 62% úplnost

Voting Master má rozhodnout, který z nich je správný:

  1. Získat Kandidáty všech detektorů
  2. Spočítat celkové skóre pro jednotlivé Kandidáty
  3. Rozhodnout zda:
    1. přesměrovat do Kategorie
    2. nebo přidat Kategorii do výsledků Fulltextu
    3. nebo nic nepřidávat a jen zůstat ve Fulltextu

Počítání celkového skóre

  • Každý detektor vrací nejen možného Kandidáta, ale míru s jistoty, s jakou si je jeho detekcí jistý.
    • Například „MyProduct GOLD“ – Gold může být barva (80 %) nebo příznak luxusní edice (20 %)
  • Každý detektor má ovšem také svou obecnou změřenou váhu (přesnost).
    • Například Exact match detektor má 100 %, protože, jak jméno napovídá, vrací jen přesnou shodu, ML model 95 %, protože je to jeho změřená přesnost
  • Celkové skóre je pak spočteno kombinací těchto dvou vstupů:
    • 85–100 znamená přesměrování do Kategorie
    • 50–84 znamená přidání odkazu na Kategorii do Fulltext výsledků
    • 0–49 je ignorováno

Mimochodem, přesný vzorec stále vylepšujeme na základě zpětné vazby našich uživatelů. Pokud tedy  narazíte na nerelevantní výsledky vyhledávání, budeme rádi, když nám o nich dáte vědět.

A jak to bude dál?

Dnes tedy máme většinu přesměrovávacích pravidel vymyšlenou, z velké části implementovanou a leckteré části i nasazené. Alespoň v Česku a na Slovensku. Pomalu se tak dostáváme k učení se cizích jazyků v rámci všech zemí v Heureka Group.

Snad vám tedy tento článek přiblížil, co a jakým způsobem lze zjistit z těch několika málo slov, která zadáváte do vyhledávacího pole na Heurece.

Autor článku

Marek je součástí "růžového týmu", který vymazluje vyhledávání na našem webu.

Podobné články

Ikony bez kompromisů

Ikony bez kompromisů

I přes svou malou velikost představují ikony na webu zajímavý problém. Jeden přístup střídá další –…

Vánoční resuscitace serverů

Vánoční resuscitace serverů

O sysadminech v Heurece se dá říci leccos, nedostatek paranoie to ale není. Máme zdvojené téměř…

Potkejme se na WebExpu!

Potkejme se na WebExpu!

Letošní ročník konference WebExpo 2018, točící se kolem webových technologií, obohatíme i naším…

Zaber si svou židli!

<Nejsme asociálové/>

<Témata/>

Zajímá tě naše práce, technologie, tým nebo cokoliv jiného?
Napiš šéfovi vývoje Lukášovi Putnovi.

lukas.putna@heureka.cz