{"id":71852,"date":"2020-02-28T20:59:58","date_gmt":"2020-02-28T17:59:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij"},"modified":"2020-03-03T16:14:08","modified_gmt":"2020-03-03T13:14:08","slug":"kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Kako radimo na kvaliteti i brzini pretra\u017eivanja preporuka","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Zovem se Pavel Parkhomenko, ja sam ML razvija\u010d. U ovom \u010dlanku \u017eelim govoriti o strukturi usluge Yandex.Zen i podijeliti tehni\u010dka pobolj\u0161anja koja su omogu\u0107ila pobolj\u0161anje kvalitete preporuka. Iz ovog posta saznat \u0107ete kako u samo nekoliko milisekundi prona\u0107i me\u0111u milijunima dokumenata one najrelevantnije za korisnika; kako izvr\u0161iti kontinuiranu dekompoziciju velike matrice (sastoje\u0107i se od milijuna kolona i desetaka milijuna redova), tako da novi dokumenti dobiju svoj vektor za desetke minuta; kako ponovo iskoristiti dekompoziciju matrice korisnik-artikl, kako bismo dobili dobro vektorsko predstavljanje za video.<\/p>\n<p><img decoding=\"async\" alt=\"Kako radimo na kvaliteti i brzini pretra\u017eivanja preporuka\" src=\"\/wp-content\/uploads\/2020\/02\/d63caf9162ca3533548fdef9cd740c24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nNa\u0161a preporu\u010dena baza sadr\u017ei milijune dokumenata razli\u010ditih formata: tekstualni \u010dlanci stvoreni na na\u0161oj platformi i uzeti s vanjskih sajtova, video, narativi i kratki postovi. Razvoj ovakve usluge povezan je s velikim brojem tehni\u010dkih izazova. Evo nekoliko od njih:<\/p>\n<ul>\n<li>Podijeliti ra\u010dunalne zadatke: sve te\u0161ke operacije obaviti izvan mre\u017ee, dok u stvarnom vremenu izvr\u0161avamo samo brzo primjenjivanje modela kako bismo odgovarali u 100-200 ms.<\/li>\n<li>Brzo uzimati u obzir postupke korisnika. Za to je potrebno da svi doga\u0111aji odmah budu isporu\u010deni u preporu\u010diva\u010d i utjecali na rezultat rada modela.<\/li>\n<li>U\u010dinite feed takvim da se brzo prilago\u0111ava pona\u0161anju novih korisnika. Ljudi koji su upravo stigli u sustav trebaju osje\u0107ati da njihov povratak utje\u010de na preporuke.<\/li>\n<li>Brzo razumjeti kome preporu\u010diti novi \u010dlanak.<\/li>\n<li>Odmah reagirati na stalni priljev novog sadr\u017eaja. Desetci tisu\u0107a \u010dlanaka izlaze svaki dan, a mnogi od njih imaju ograni\u010den rok trajanja (recimo, vijesti). To ih razlikuje od filmova, muzike i drugog dugotrajnog i skupog sadr\u017eaja za stvaranje.<\/li>\n<li>Prenijeti znanje s jedne domene na drugu. Ako u preporu\u010diva\u010dkom sustavu postoje obu\u010deni modeli za tekstualne \u010dlanke i dodajemo video, mo\u017eemo ponovo iskoristiti postoje\u0107e modele kako bi sadr\u017eaj novog tipa bio bolje rangiran.<\/li>\n<\/ul>\n<p>\nIspri\u010dat \u0107u vam kako smo rje\u0161avali ove zadatke.<\/p>\n<h2>Odabir kandidata<\/h2>\n<p>\n<b>Kako u nekoliko milisekundi smanjiti broj razmatranih dokumenata tisu\u0107u puta, gotovo ne pogor\u0161avaju\u0107i kvalitetu rangiranja?<\/b><\/p>\n<p>Pretpostavimo da smo obu\u010dili mnogo ML modela, generirali zna\u010dajke na temelju njih i obu\u010dili jo\u0161 jedan model koji rangira dokumente za korisnika. Sve bi bilo u redu, ali nije mogu\u0107e jednostavno izra\u010dunati sve zna\u010dajke za sve dokumente u stvarnom vremenu, ako je tih dokumenata milijun, a preporuke je potrebno izraditi za 100-200 ms. Zadatak je odabrati iz milijuna odre\u0111eni podskup koji \u0107e se rangirati za korisnika. Ovaj se korak obi\u010dno naziva odabir kandidata. Postavi se nekoliko zahtjeva. Prvo, odabir mora biti vrlo brz kako bi \u0161to vi\u0161e vremena ostalo za samo rangiranje. Drugo, uz drasti\u010dno smanjenje broja dokumenata za rangiranje, trebamo maksimalno sa\u010duvati one dokumente koji su relevantni za korisnika.<\/p>\n<p>Na\u0161 princip odabira kandidata evolucijski se razvijao, i do sada smo do\u0161li do vi\u0161estupanjske sheme:<\/p>\n<p><img decoding=\"async\" alt=\"Kako radimo na kvaliteti i brzini pretra\u017eivanja preporuka\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPrvo se svi dokumenti razdvajaju u grupe, a iz svake grupe se uzimaju najpopularniji dokumenti. Grupe mogu biti web stranice, teme, klasteri. Za svakog korisnika na temelju njegove povijesti odabiremo najbli\u017ee grupe i iz njih se uzimaju najbolji dokumenti. Tako\u0111er koristimo kNN indeks za odabir najbli\u017eih dokumenata u stvarnom vremenu. Postoji nekoliko metoda za izradu kNN indeksa, a kod nas se najbolje pokazao <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Hijerarhijski navigacijski mali svijetovi). Ovo je hijerarhijski model koji omogu\u0107ava pronala\u017eenje N najbli\u017eih vektora za korisnika iz baze od milijun dokumenata u nekoliko milisekundi. Unaprijed indeksiramo cijelu na\u0161u bazu dokumenata izvan mre\u017ee. Kako pretra\u017eivanje u indeksu radi prili\u010dno brzo, uz nekoliko jakih ugradnji, mo\u017eemo stvoriti nekoliko indeksa (po jedan indeks za svaku ugradnju) i obra\u0107ati se svakom od njih u stvarnom vremenu.<\/p>\n<p>Imamo desetke tisu\u0107a dokumenata za svakog korisnika. To je jo\u0161 uvijek mnogo za brojanje svih zna\u010dajki, pa u ovoj fazi primjenjujemo lagano rangiranje \u2014 pojednostavljeni model te\u0161kog rangiranja s manjim brojem zna\u010dajki. Cilj je predvidjeti koji \u0107e dokumenti biti na vrhu kod te\u0161kog modela. Dokumenti s najve\u0107im predikcijama \u0107e se koristiti u te\u0161kom modelu, tj. u posljednjoj fazi rangiranja. Ovaj pristup omogu\u0107uje smanjenje broja dokumenata koje korisnik razmatra s milijuna na tisu\u0107e u desetinama milisekundi.<\/p>\n<h2>ALS korak u stvarnom vremenu<\/h2>\n<p>\n<b>Kako uzeti u obzir povratne informacije korisnika odmah nakon klika?<\/b><\/p>\n<p>Va\u017ean faktor u preporukama je vrijeme reakcije na povratne informacije korisnika. To je posebno va\u017eno za nove korisnike: kada osoba prvi put po\u010dne koristiti preporu\u010deni sustav, dobiva nepersonalizirani tijek raznolikih dokumenata. \u010cim izvr\u0161i prvi klik, potrebno je odmah uzeti to u obzir i prilagoditi se njenim interesima. Ako se svi faktori ra\u010dunaju offline, brza reakcija sustava postaje nemogu\u0107a zbog ka\u0161njenja. Stoga je potrebno obraditi korisni\u010dke radnje u stvarnom vremenu. U tu svrhu koristimo ALS korak u stvarnom vremenu za izgradnju vektorskog prikaza korisnika.<\/p>\n<p>Pretpostavimo da imamo vektorski prikaz za sve dokumente. Na primjer, mo\u017eemo offline izgraditi embeddinge na temelju teksta \u010dlanka koriste\u0107i ELMo, BERT ili druge modele strojnog u\u010denja. Kako mo\u017eemo dobiti vektorski prikaz korisnika u istom prostoru na temelju njihovih interakcija u sustavu?<\/p>\n<p><b class=\"spoiler_title\">Op\u0107i princip formiranja i dekompozicije matrice korisnik-dokument<\/b>Pretpostavimo da imamo m korisnika i n dokumenata. Za neke korisnike poznat je njihov odnos prema nekim dokumentima. Tada se te informacije mogu predstaviti u obliku matrice m x n: redovi odgovaraju korisnicima, a stupci dokumentima. Budu\u0107i da ve\u0107ina dokumenata korisnik nije vidio, ve\u0107i dio polja matrice \u0107e ostati prazan, dok \u0107e neka druga biti ispunjena. Za svaki doga\u0111aj (lajk, dislajk, klik) u matrici predvi\u0111ena je neka vrijednost \u2014 no, razmotrimo pojednostavljeni model u kojem lajku odgovara 1, a dislajku \u20131.<\/p>\n<p>Razlo\u017eimo matricu na dvije: P (m x d) i Q (d x n), gdje je d dimenzija vektorskog prikaza (obi\u010dno je to malo broj). Tada \u0107e svakom objektu odgovarati d-dimenzionalni vektor (korisniku \u2014 red u matrici P, dokumentu \u2014 stupac u matrici Q). Ovi vektori bit \u0107e ugradnje odgovaraju\u0107ih objekata. Da bismo predvidjeli ho\u0107e li se korisniku svidjeti dokument, jednostavno mo\u017eemo pomno\u017eiti njihove ugradnje.<\/p>\n<p><img decoding=\"async\" alt=\"Kako radimo na kvaliteti i brzini pretra\u017eivanja preporuka\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJedan od mogu\u0107ih na\u010dina dekompozicije matrice je ALS (Alternating Least Squares). Optimizirat \u0107emo sljede\u0107u funkciju gubitka:<\/p>\n<p><img decoding=\"async\" alt=\"Kako radimo na kvaliteti i brzini pretra\u017eivanja preporuka\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nOvdje rui predstavlja interakciju korisnika u s dokumentom i, qi \u2014 vektor dokumenta i, pu \u2014 vektor korisnika u.<\/p>\n<p>Tada se optimalni vektor korisnika s obzirom na srednju kvadratnu pogre\u0161ku (pri fiksnim vektorima dokumenata) analiti\u010dki dobiva rje\u0161avanjem odgovaraju\u0107e linearne regresije.<\/p>\n<p>To se naziva \u201ekorak ALS\u201c. Sam algoritam ALS sastoji se u tome da naizmjence fiksiramo jednu od matrica (korisnika i dokumenata) i a\u017euriramo drugu, nalaze\u0107i optimalno rje\u0161enje.<\/p>\n<p>Sre\u0107om, pronala\u017eenje vektorskog prikaza korisnika \u2014 prili\u010dno je brza operacija koja se mo\u017ee izvoditi u runtime-u, koriste\u0107i vektorske instrukcije. Ova metoda omogu\u0107uje odmah uzimanje u obzir povratnih informacija korisnika u rangiranju. Ista ugradnja mo\u017ee se koristiti i u kNN indeksu za pobolj\u0161anje selekcije kandidata.<\/p>\n<h2>Distribuirana kolaborativna filtracija<\/h2>\n<p>\n<b>Kako provesti inkrementalnu distribuiranu faktorizaciju matrice i brzo prona\u0107i vektorski prikaz novih \u010dlanaka?<\/b><\/p>\n<p>Sadr\u017eaj nije jedini izvor signala za preporuke. Drugi va\u017ean izvor je kolaborativna informacija. Dobre indikacije u rangiranju tradicionalno se mogu dobiti iz raspodjele matrice korisnik-dokument. Me\u0111utim, prilikom poku\u0161aja razlaganja suo\u010dili smo se s problemima:<\/p>\n<p>1. Imamo milijune dokumenata i desetke milijuna korisnika. Matrica se ne mo\u017ee potpuno smjestiti na jednom stroju, i razlaganje \u0107e trajati dugo.<br \/>\n2. Ve\u0107ina sadr\u017eaja u sustavu ima kratak \u017eivotni vijek: dokumenti ostaju relevantni samo nekoliko sati. Stoga je potrebno \u0161to br\u017ee izgraditi njihovo vektorsko predstavljanje.<br \/>\n3. Ako radimo razlaganje odmah nakon objavljivanja dokumenta, dovoljan broj korisnika ga mo\u017eda ne\u0107e stignuti ocijeniti. Stoga \u0107e njegovo vektorsko predstavljanje vjerojatno biti neu\u010dinkovito.<br \/>\n4. Ako korisnik da lajk ili dislajk, ne\u0107emo mo\u0107i odmah uzeti to u obzir u razlaganju.<\/p>\n<p>Kako bismo rije\u0161ili navedene probleme, implementirali smo distribuirano razlaganje matrice korisnik-dokument s \u010destim inkrementalnim a\u017euriranjem. Kako to\u010dno to funkcionira?<\/p>\n<p>Pretpostavimo da imamo klaster od N strojeva (N se ra\u010duna u stotinama) i \u017eelimo izvr\u0161iti distribuirano razlaganje matrice koja se ne mo\u017ee smjestiti na jednom stroju. Pitanje je \u2014 kako izvr\u0161iti to razlaganje, tako da, s jedne strane, svaki stroj ima dovoljno podataka, a s druge strane, da su izra\u010duni neovisni? <\/p>\n<p><img decoding=\"async\" alt=\"Kako radimo na kvaliteti i brzini pretra\u017eivanja preporuka\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUpotrijebit \u0107emo gore opisani ALS algoritam razlaganja. Razmotrit \u0107emo kako distribuirano izvr\u0161iti jedan korak ALS-a \u2014 ostali koraci \u0107e biti sli\u010dni. Pretpostavimo da imamo fiksnu matricu dokumenata i \u017eelimo izgraditi matricu korisnika. Za to \u0107emo je podijeliti na N dijelova po redovima, pri \u010demu \u0107e svaki dio sadr\u017eavati otprilike jednake koli\u010dine redova. Poslat \u0107emo na svaki stroj neispunjene \u0107elije odgovaraju\u0107ih redova, kao i matricu ugra\u0111ivanja dokumenata (u cijelosti). Budu\u0107i da je njezina veli\u010dina relativno mala, a matrica korisnik-dokument obi\u010dno jako rijetka, ovi podaci stane na obi\u010dni stroj.<\/p>\n<p>Ovu tehniku mo\u017eemo ponavljati kroz nekoliko epoha do konvergencije modela, izmjenjuju\u0107i fiksnu matricu. No, \u010dak i tada, razlaganje matrice mo\u017ee trajati nekoliko sati. To ne rje\u0161ava problem brzog dobivanja ugradnji novih dokumenata i a\u017euriranja ugradnji onih koji su imali malo informacija prilikom izrade modela. <\/p>\n<p>Pomoglo nam je uvo\u0111enje brzih inkrementalnih a\u017euriranja modela. Pretpostavimo da imamo trenutni obu\u010deni model. Od vremena njegovog treniranja pojavili su se novi \u010dlanci s kojima su na\u0161i korisnici komunicirali, kao i \u010dlanci koji su imali malo interakcija tijekom obuke. Za brzo dobivanje ugradnji takvih \u010dlanaka koristimo ugradnje korisnika dobivene tijekom prvog velikog treniranja modela i radimo jedan korak ALS kako bismo izra\u010dunali matricu dokumenata uz fiksnu matricu korisnika. To omogu\u0107ava brzo dobivanje ugradnji \u2014 unutar nekoliko minuta nakon objave dokumenta \u2014 i \u010desto a\u017euriranje ugradnji svje\u017eih dokumenata.<\/p>\n<p>Kako bismo odmah uzeli u obzir ljudske akcije za preporuke, u runtime-u ne koristimo ugradnje korisnika dobivene offline. Umjesto toga, radimo korak ALS i dobivamo relevantni vektor korisnika.<\/p>\n<h2>Prijenos na drugu domenu<\/h2>\n<p>\n<b>Kako iskoristiti povratne informacije korisnika o tekstualnim \u010dlancima za izgradnju vektorskog prikaza video sadr\u017eaja?<\/b><\/p>\n<p>Isprva smo preporu\u010divali samo tekstualne \u010dlanke, stoga su mnogi na\u0161i algoritmi prilago\u0111eni ovom tipu sadr\u017eaja. Me\u0111utim, prilikom dodavanja sadr\u017eaja druge vrste suo\u010dili smo se s potrebom adaptacije modela. Kako smo rije\u0161ili ovaj problem na primjeru videa? Jedna od opcija je ponovno obu\u010davanje svih modela od nule. No, to traje dugo, a dio algoritama zahtijeva veliku koli\u010dinu podataka za obuku, koje jo\u0161 uvijek nemamo u potrebnoj koli\u010dini za novi tip sadr\u017eaja u prvim trenucima njegove prisutnosti na servisu.<\/p>\n<p>Odlu\u010dili smo se za druga\u010diji pristup i ponovo iskoristili modele tekstova za video. U stvaranju vektorskih prikaza videa pomogla nam je ista ona tehnika s ALS-om. Uzeli smo vektorski prikaz korisnika temeljen na tekstualnim \u010dlancima i napravili ALS korak koriste\u0107i podatke o pregledima videa. Tako smo lako dobili vektorski prikaz videa. Tijekom izvo\u0111enja jednostavno izra\u010dunavamo bliskost izme\u0111u vektora korisnika, dobivenog na temelju tekstualnih \u010dlanaka, i vektora videa.<\/p>\n<h2>Zaklju\u010dak<\/h2>\n<p>\nRazvoj jezgre sustava preporuka u stvarnom vremenu suo\u010den je s mnogim izazovima. Potrebno je brzo obraditi podatke i primijeniti metode strojnog u\u010denja za u\u010dinkovitu upotrebu tih podataka; graditi slo\u017eene distribuirane sustave sposobne obraditi korisni\u010dke signale i nove jedinice sadr\u017eaja u minimalnom vremenu; i mnoge druge zadatke.<\/p>\n<p>U trenutnom sustavu, \u010dija svojstva opisujem, kvaliteta preporuka za korisnika raste s njegovom aktivno\u0161\u0107u i du\u017einom boravka na usluzi. No, naravno, tu le\u017ei i najve\u0107i izazov: sustavu je te\u0161ko odmah razumjeti interese osobe koja je malo interagirala s sadr\u017eajem. Pobolj\u0161anje preporuka za nove korisnike na\u0161 je klju\u010dni zadatak. Nastavit \u0107emo optimizirati algoritme kako bi relevantan sadr\u017eaj br\u017ee do\u0161ao u njihov feed, a nerelevantan se ne prikazivao.<br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/490140\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439. \u0418\u0437 \u043f\u043e\u0441\u0442\u0430 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f; \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b (\u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71853,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71852","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-28T17:59:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Kako radimo na kvaliteti i brzini odabira preporuka | ProHoster","description":"Moje ime je Pavel Parkhomenko, ja sam ML-razvija\u010d. U ovom \u010dlanku bih \u017eelio ispri\u010dati o strukturi servisa Yandex.Zen i podijeliti tehni\u010dke pobolj\u0161anja, \u010dija je implementacija omogu\u0107ila pove\u0107anje kvalitete preporuka.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster","og:description":"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-28T17:59:58+00:00","article:modified_time":"2020-03-03T13:14:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71852","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:55:28","updated":"2022-10-09 15:47:56","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}