Привет, Хабр! Меня зовут Илья Ненахов, я руковожу разработкой платформы для продвижения товаров на Яндекс Маркете. Про сам сервис, думаю, многие знают, поэтому не буду подробно о нём рассказывать. Предлагаю взглянуть на площадку немного с другой стороны, а именно — как на механизм, который пытается найти оптимальную точку в пространстве с тремя измерениями: интересы пользователя, интересы магазинов и интересы самого сервиса.

Интересы покупателей часто не совпадают с интересами продавцов. Магазины хотят получать больше прибыли: им выгодно, чтобы пользователи покупали по высоким ценам. При этом пользователи хотят, чтобы цены были самыми низкими на рынке, а срок доставки — как можно меньше. Принимая продуктовые решения, нужно всегда оценивать, как мы влияем на этот баланс. Неверное решение легко может всё сломать: например, если мы начнём требовать от магазинов доставлять товары на следующий день, мы, конечно, порадуем пользователей пару дней, но уже вскоре останемся без магазинов.

В этой статье я расскажу о том, как мы поддерживаем этот баланс с помощью технологий Яндекса, на примере платформы для продвижения товаров в поиске Маркета. Поговорим про метрики, ранжирование и устройство рантайма. Наш опыт может быть полезен тем разработчикам, которые работают над похожими задачами в других компаниях.

Какую задачу решает платформа для продвижения

Задачу платформы на Яндекс Маркете можно сформулировать просто: дать магазинам инструмент для роста заказов, но при этом не уронить качество сервиса, чтобы не расстроить пользователей. Звучит вроде бы понятно, но, как я говорил выше, баланс в этом механизме очень просто сломать.

Чтобы этого не допустить и успешно справиться с задачей, нужно всё оцифровать. Тогда можно пользоваться уже типичными для Яндекса инструментами: математической оптимизацией, машинным обучением, а также строить метрики и системы мониторинга. Понятно, что оцифровать рост продаж легко, а вот что делать с качеством сервиса? И что вообще такое качество в нашем понимании?

Под метрикой качества сервиса часто понимают GMV — это сумма цен проданных товаров. Все маркетплейсы измеряют свою долю на рынке, пользуясь этой метрикой. Но можно ли сказать, что GMV отражает счастье пользователя? В какой‑то степени да: если пользователям не нравится сервис, вряд ли они будут на нём что‑нибудь покупать. С другой стороны, можно чуть увеличить цены, и, скорее всего, мы увидим краткосрочный рост GMV на сервисе, но сделаем ли мы пользователям хорошо в этом случае? Нет.

Одна из метрик, по которой можно судить о счастье пользователей — это количество заказов. Ведь у каждого из них есть выбор: заказать у нас или в другом месте. И если пользователю что‑то не нравится в нашем сервисе, то, скорее всего, он уйдёт.

Итак, получается, считать заказы мы умеем, счастье пользователей — тоже. Осталось разобраться с инструментами продвижения для продавцов. У нас их много, но в этой статье я расскажу только про премиальную врезку на поиске.

Важно отметить, что все наши инструменты схожи со стороны B2B‑части. Магазин говорит, какой процент от цены продажи он готов потратить на продвижение (ставка), а мы обещаем ему привлечение дополнительных заказов. В терминах рекламных технологий это CPA‑инструмент: магазин платит за факт совершённого заказа, и тут уже наша задача — сделать так, чтобы этот заказ произошёл. Понятно, что эта задача для площадки несёт гораздо больше рисков, чем для магазина: мы не получим ни копейки, пока не принесём дополнительный заказ, в отличие, например, от CPM‑рекламы, где оплата производится просто за факт показа. Но, как показывает практика, CPA‑инструменты гораздо эффективнее для продавцов.

Ранжирование в премиальной врезке

Премиальная врезка — это горизонтальный блок на поисковой выдаче, в который попадают релевантные запросу товары со ставкой. Вот так этот блок выглядит на поиске:

Позиция блока может изменяться исходя из параметров запроса. На каких‑то запросах блок может отсутствовать или показываться ниже.

А это — упрощённая схема того, что происходит под капотом.

Под блоком Clients подразумеваются все возможные типы клиентских приложений: Android, iOS, веб. На каких‑то платформах запросы шлёт не сам клиент, а промежуточный BFF, но для этой статьи это не так принципиально.

Начиная с кубика Meta search, мы уже попадаем в главный бэкенд нашей платформы. В схеме он разбит на две части — мета и базовая. Мета на каждый входящий запрос опрашивает все базовые ноды, а каждый базовый нод при этом ищет по своему куску (шарду) индекса. Мотивация такого разбиения простая: на Маркете очень много данных, мы уже давно не можем держать весь поисковый индекс в памяти одной машины, поэтому вынуждены его дробить. На мете есть ещё пласт важной логики — расчёт запросных факторов для ранжирующих моделей машинного обучения. Часть таких факторов достаточно тяжёлые в плане производительности и в придачу рассчитываются на GPU, поэтому живут в отдельных микросервисах.

Давайте поговорим про факторы поподробнее. В задачах ранжирования поисковой выдачи нейросети появились и полюбились очень давно (статья о применении подхода DSSM в поиске Яндекса вышла на Хабре ещё в 2016 году). Я думаю, основная причина того, почему нейросети и поиск так давно вместе, — это возможность независимо получать векторные представления документа и запроса. Это очень важно для поиска, потому что построение поискового индекса — это по большей части офлайн‑процесс. Если мы можем рассчитать вектор документа в офлайне, а в рантайме оставить только вычисление скалярного произведения с запросной частью, то сильно ускорим всю систему. Это особенно актуально для современных архитектур на трансформерах: если DSSM‑модели мы могли считать на CPU, то BERT‑like‑модели уже требуют GPU в рантайме.

Если подытожить, то на этом этапе логики мы применяем множество нейросетевых DSSM‑ и sentence‑bert‑моделей, обученных на разные таргеты — как релевантностные, так и бизнесовые.

Теперь перейдём к базовому поиску. Всё происходящее на этой стадии поиска можно тоже разделить на несколько этапов: отбор кандидатов, фильтрация по релевантности, ранжирование с учётом ставки.

Отбор кандидатов

В отборе кандидатов мы используем инвертированный индекс. Подобную структуру данных можно встретить в любом открытом поисковом движке. Она позволяет достаточно быстро находить документы, в которых встречаются слова (term) из запроса, и заодно отбирать топ документов по какой‑нибудь простой функции релевантности, например TF‑IDF или BM25.

Выше я писал про векторные представления и про то, почему их здорово использовать в поиске. Но ещё лучше использовать их на этапе отбора кандидатов, чтобы сразу получать лучших. Вообще, развитие технологий по решению задачи поиска ближайших соседей заслуживает отдельной статьи. Сейчас появляется очень много специализированных баз данных для этой задачи, да и популярные базы данных обрастают подобной функциональностью. Пример — pgvector для PostgreSQL.

У себя мы используем кастомные kNN‑индексы, которые возвращают нам топ документов, близких к запросу. Отбор кандидатов заканчивается получением топа документов инвертированного индекса и kNN‑индекса.

Фильтрация по релевантности

Предложения товаров должны быть релевантными. Во‑первых, чтобы не раздражать пользователей, а во‑вторых, нерелевантные показы приносят мало пользы продавцам. Более того, премиальная врезка занимает место над поиском, на которое претендуют как другие врезки, так и сама поисковая выдача. Ошибочно показывая нерелевантную премиальную врезку, мы будем негативно влиять и на другие продуктовые метрики.

Хорошо, премиальная врезка должна быть релевантной запросу, но что это значит? Как это измерить? Тут на помощь приходит большой опыт Яндекса в построении поисковых систем. Упрощённо то, что у нас происходит, представлено на рисунке ниже.

У нас есть регулярный процесс разметки с помощью краудсорсинга, в котором люди определяют, релевантен документ запросу или нет. Мы используем эти оценки, чтобы определить релевантность всей врезки.

Но здесь всё не так просто: на восприятие релевантности врезки влияют не только документы внутри врезки, но и сама поисковая выдача. Если пользователь ищет что‑то конкретное, то нам не хочется показывать аналоги выше правильного товара в выдаче. Учитывая все эти факторы, мы обучили классификатор, который определяет, стоит ли дальше пропускать документ или нет.

Ранжирование с учётом ставки

На этом этапе мы включаем учёт ставки по полной. Формула ранжирования подобрана таким образом, чтобы документы, у которых ставка больше, поднимались выше.

Тут напрашивается вопрос: а почему бы здесь не проранжировать просто по ставке? Если бы у нас была CPM‑реклама (напомню, в CPM‑рекламе рекламодатель платит за показы), то ранжирование по ставке было бы лучшим решением. Но в нашем случае CPA‑рекламы нужно, чтобы с врезки было больше заказов. Ранжирование по ставке — не самое оптимальное с точки зрения заказов.

Чтобы учесть заказы в ранжировании, нам нужно предсказать вероятность заказа для каждого документа.

p_{purchase} = f(factors)

Функцию f мы можем найти при помощи ML. CatBoost хорошо справляется с этой задачей. Под factors подразумевается набор факторов, в который, в том числе, входят нейросетевые модели, которые я описывал выше. Знание p_purchase позволяет нам использовать математические ожидания GMV и рекламной выручки в итоговом скоре ранжирования.

E(GMV) = p_{purchase} × priceE(REVENUE) = p_{purchase}×price×fee

Price — цена предложения от магазина.

Fee — ставка, которую выставил магазин.


В AdTech происходит много всего интересного, особенно в еком‑сегменте. Надеюсь, мне удалось немного приоткрыть завесу тайны над тем, как работают подобные системы, и это будет полезно для комьюнити.

Комментарии (22)


  1. Sergey_Kovalenko
    18.04.2024 14:58
    +2


    Так все-таки

    Как найти баланс между интересами покупателей и продавцов?

    Можно поподробнее, начиная с перевода поставленного вопроса в экономические термины )))?


    1. zergood Автор
      18.04.2024 14:58
      +1

      Я думаю, что тут скорее не перевод в экономические термины важен. А важно, как вы эту задачу оцифруете. Про один из способов я рассказал в статье - следить за общим количеством заказов, за количеством заказов со ставкой, за релевантностью и за количеством выручки полученной за продвижение.


      1. Sergey_Kovalenko
        18.04.2024 14:58

        Подождите вы цифровать - это всего лишь способ решения задачи, которую еще нужно поставить. Чего именно вы хотите добиться в терминах участников экономической игры: покупатель, продавец, У меня по этому поводу есть некоторые соображения, но я хотел бы узнать сначала ваши. Можете говорить смело, здесь все достаточно несложно, чтобы представлять какой-то секрет.

        Господа экономисты и маркетологи, присоединяйтесь к обсуждению


        1. zergood Автор
          18.04.2024 14:58

          Свои мысли расписал в статье, как это переложить в терминах, которые вы хотите пока не пойму. Мы явно не используем подходы из теории игр для решения этой задачи, но с радостью бы подискутировал на эту тему. Можете, пожалуйста, расписать свои соображения?


          1. Sergey_Kovalenko
            18.04.2024 14:58

            Найду время и единомышленников - напишу маленькую статью. Это чертовски интересная тема, явление маркетплейсов, особенно сплетенной в стенах одной компании с технологиями поиска и таргетированной рекламы, делает несостоятельным большинство прежних подходов к микроэкономике.

            Счастье пользователя? ))))))))


            1. zergood Автор
              18.04.2024 14:58

              Тут я с вами согласен, используя только экономические знания, не построить современный поисковый или рекламный движок. Но при этом без них совсем не обойтись, вот тут мы писали про эластичность в ценообразовании https://habr.com/ru/articles/673740/ , у нас в рекламе есть различные позиционные аукционы, которые отдельной статьи заслуживают.


              А так буду ждать вашу статью, тема мне интересна.


              1. Sergey_Kovalenko
                18.04.2024 14:58

                Спасибо за ссылку, мне будет интересно познакомится с вашим подходом!


              1. Sergey_Kovalenko
                18.04.2024 14:58

                Но понимаете в чем нюанс - когда вы можете изучить поведение чуть ли не каждого потенциального покупателя, попытаться предсказать, какую полезность он получит от покупки того или иного товара, когда вы выбираете, какие товары ему рекламировать, а какие нет, когда по сути маркетплейс, а не магазины, делает предложение продажи (магазин, так рядышком постоял, поулыбался, завернул в коробочку и заплатил налоги) и таким образом является подлинным продавцом, тогда модель рынка с агрегированной эластичностью уже не работает.

                Возьмите 4 бутылочки воды, покрасьте их в зеленый, желтый, красный, черный цвет. Не испытывающему жажду бедняку предложите зеленую за доллар, жаждущему бедняку - желтую за 2, не жаждущему состоятельному человеку - красную за 10, состоятельному человеку с похмельным синдромом - черную за 20. Не показывайте им других вариантов - и это будет лучшей вашей стратегией.

                Аналогично с выбором, каким "магазинам" маркетплейс должен способствовать в продажах и росте, а каких вытеснять из игры.

                Нет, маркетплейсы - это очень интересное явление рынков с крайне неполной и несимметричной информацией у сторон. Что там было про кольца всевластия?)))

                На досуге посмотрю, быть может уже уже есть пионерские исследования этого вопроса.


  1. kalash_nick
    18.04.2024 14:58

    Спасибо за материал, как раз хотел понять, как работают рекламные движки. Особенно круто, что рассказали как модель ранжирования по CPA отличается от CPM


    1. zergood Автор
      18.04.2024 14:58

      Ура позитивный коммент!)

      На самом деле про устройство рекламных движков можно целую серию статей написать, и не так много литературы по этой теме в открытом доступе. На мой взгляд супер интересная тема. Если есть интерес со стороны аудитории, то я готов еще про что-нибудь написать.


  1. Akina
    18.04.2024 14:58
    +6

    Прочитал. Но так и не смог понять - как в топ выдачи поиска умудряются попадать товары, у которых ни в названии, ни в описании нет вообще ни одного "слова" из поискового запроса... Сколько раз уже убеждался, что найти по точному наименованию модели, к примеру, коммутатор - если не безнадёжное, то во всяком случае не самое простое дело. И поиск тебе будет подсовывать что угодно, но только не то, что ты попросил. А ещё - при любом переходе то, что ты искал, тут же и немедленно забывается. А потому лучше любые ссылки открывай в новой вкладке...

    Как покупатель, могу сказать - если и есть тот ползунок регулировки баланса, анонсированного в заголовке, то он установлен на 99% в сторону продавца.


    1. zergood Автор
      18.04.2024 14:58

      Мы точно не устанавливаем баланс на 99% в сторону продавца. И да бывают случаи, где поиск мог бы отработать лучше. Если есть конкретные примеры запросов, пришлите, пожалуйста, это поможет лучше понять проблему.


      1. Akina
        18.04.2024 14:58
        +2

        Ой, да элементарно... вот поисковый запрос: intel ftlx1471d3bcv-it. Это оптический SFP+ модуль. Впрочем, тут ещё более-менее, запрошенный товар в результатах есть, и он даже второй (хотя должен быть первым, по идее). Но что в выдаче делают сетевые карты, кулеры, материнские платы, антенны, и даже процессор для ноутбуков? Или токен Intel имеет куда как больший вес, и мы сыпем всё, что относится к брэнду? А бывало, что запросишь что-то с точным указанием модели - и на первой странице, в первой дюжине, нужного вообще нет.

        И очень огорчает невозможность указать точную подстроку, которую нужно искать - так, как это делается практически на любом поисковике, обрамив требуемое двойной кавычкой. Всё равно подавляющее большинство найденных товаров в принципе не содержит запрашиваемой подстроки.

        До маразма доходит - ищешь через Гугл, указывая поиск только в домене market.yandex.ru. Так и быстрее, и точнее.


      1. Dolios
        18.04.2024 14:58
        +2

        Если поиск ничего не нашёл, он должен сказать: "по вашему запросу ничего не найдено", - а не втюхивать пользователю абы что, заставляя его разгадывать шарады.

        Если есть конкретные примеры запросов

        Любой запрос любой модели любой техники, которой нет на маркете.


        1. zergood Автор
          18.04.2024 14:58

          На самом деле вопрос холиварный, может ли поиск показывать аналоги если товара, который искали нет. Я думаю если по запросу "iphone 5" показать более новые телефоны это ок. В вашем случае да, релевантностный фильтр справился хуже, чем хотелось бы.

          Но многие из наших пользователей приходят на Маркет, не зная конкретный товар, который им нужен, им греп-лайк поиск не поможет.


          1. Komrus
            18.04.2024 14:58
            +1

            Так может для пользователей, которые хотят найти "конкретный артикул, только его и ничего более" - предусмотреть какой-нибудь механизм для этого?
            Кавычки там например...

            С возможностью получить заветный ответ "такого не найдено".

            Ситуация, например, когда в рамках поставки в гос.тендер надо найти какую-то мелкую шелобушку с конкретным артикулом и ничего иного. В надежде, что она у кого-то ещё на складе завалялась.


            1. zergood Автор
              18.04.2024 14:58
              +2

              Проблему понял, спасибо, подумаем над решением.


          1. Dolios
            18.04.2024 14:58
            +1

            Вы совершенно определенно детектите, что запрашивается конкретная модель, например, телевизора и пытаетесь подсунуть не абы что, а похожие модели. Это, наверное, хорошо для продаж, но плохо для меня, как для пользователя, который пришел за конкретной моделью, почитать отзывы именно на нее.

            Но многие из наших пользователей приходят на Маркет, не зная конкретный товар

            Тогда они не будут вбивать в поиск буквенно-цифровой код модели. Вы прекрасно различаете пользователей и их запросы, зачем вы пытаетесь обманывать? Это вас вообще не красит ни разу.


    1. 0xC0CAC01A
      18.04.2024 14:58

      Вот да! Вопрос в тему - бывают ли какие-нибудь сторонние честные поисковики или браузерные плагины, чтобы сразу найти искомое в куче выдаваемого лживого мусора?


  1. kuPyxa
    18.04.2024 14:58
    +1

    Тут еще забыли упомянуть интересы самого маркета и накручивание цены, особенно тем у кого плюс есть :)


    1. Komrus
      18.04.2024 14:58

      Дык ходите по я.маркету (и любым другим маркетплейсам) не залогинившись - будет, IMHO, более спокойная картина вырисовываться. :)
      Да и плагин Cookie AutoDelete - вещь достаточно полезная...


  1. DanteLFC
    18.04.2024 14:58

    Как выше отмечали - у вас ужасно надоедливый поиск в плане выдачи "похожего". Например напишите имя_игры (с номером или подзаголовком) playstation 5 и получите её для пк, иксбокса, её предыдущую часть, просто другие игры для всех плоек и заодно футболку какую-нибудь. И только жёсткие уточнения в фильтрах про "игры для приставок", "плойка", "плойка 5" помогут, но скорее всего ещё придётся подвигать ползунок цен, чтобы отсечь нерелевантное и дешёвое. А я может и правда хотел какой-то конкретный тайтл, просто выбрать из самых выгодных предложений. У ваших конкурентов мне так среди корма для котов впарили корм для собак и потом ещё возврат не дали сделать)