Это хаб-тред кластера по товарной вертикали Яндекса. Разбираю по исходному коде дерева ya/extsearch/goods - того самого бекенда, который ранжирует товары на yandex.ru/products и собирает товарный колдунщик в основной выдаче. Здесь даю общую карту: что такое вертикаль, как устроен конвейер от фида до выдачи, чем оффер отличается от карточки модели, какие есть места показа и какие группы сигналов реально живут в реестре факторов. Точечные разборы отдельных групп - в подтредах ниже.
Что такое товарная вертикаль и колдунщикСразу граница вывода. Это реконструкция по исходникам вертикали goods, а не официальная формула Маркета. Ранжирует тут CatBoost/MatrixNet - дерево решений, у факторов НЕТ фиксированных процентных весов. Любые цифры вида "фактор N процентов" из публичных гайдов - это маркетинговая оценка, а не то, что лежит в коде. Я говорю про сигналы качественно - сильный или слабый - и помечаю реконструкцию.
Товарная выдача живёт в двух местах. Первое - отдельная страница yandex.ru/products: пользователь вводит запрос, получает галерею карточек товаров с ценой, рейтингом, отзывами и кнопкой в магазин. Второе - товарный колдунщик (он же товарная галерея): блок карточек, который подмешивается прямо в основной веб-поиск, когда бегемот распознаёт коммерческий товарный интент по запросу.
Кто решает, что запрос товарный - это правила интента (market.cpp на стороне бегемота). Если интент сработал, apphost дёргает товарный report, тот ранжирует офферы и модели и отдаёт блок наверх. Если нет - товарного блока в выдаче не будет вообще, и никакая оптимизация карточки не поможет: сначала надо, чтобы запрос вообще классифицировался как товарный.
Конвейер: фид -> индекс Маркета -> report
Код: Выделить всё
1. МАГАЗИН отдаёт фид (YML / Yandex Market Language)
офферы: цена, наличие, доставка, картинки, параметры
|
v
2. ПРИЁМ ФИДА + МАТЧИНГ + КАТЕГОРИЗАЦИЯ <-- upstream, дерево market/
- валидация и парсинг YML
- матчинг оффера в карточку модели (model)
- раскладка по дереву категорий (hid/nid)
ЭТО НЕ В ДЕРЕВЕ goods. Тут офферы превращаются
в индекс. Ошибки фида ловятся ИМЕННО здесь.
|
v
3. ПОКОЛЕНИЕ ИНДЕКСА (ресурс MARKET_REPORT_DIST_META)
раскатывается шардами на бекенды report ~каждые 12 ч
|
v
4. ЗАПРОС: apphost -> бегемот (интент, market.cpp) -> report
report применяет факторы и CatBoost-формулу <-- дерево goods/
ЭТО ТО, ЧТО МЫ РАЗБИРАЕМ
Ещё одно следствие: индекс обновляется поколениями раз в ~12 часов. Поменяли цену или наличие в фиде - оно доедет до ранжирования не мгновенно, а со следующим поколением. Гнаться за минутной свежестью бессмысленно, конвейер пакетный.Ключевой момент, который путают почти все гайды по Маркету. Приём фида, валидация YML, матчинг оффера в модель и категоризация - это upstream, дерево market/, а НЕ goods/. В goods/ приезжает уже готовый индекс. Поэтому проблемы "товар не подтянулся в карточку", "слетела категория", "не приняли фид" решаются на уровне фида и матчинга, а не ранжирования. А вот "товар в индексе есть, но стоит низко" - это уже про факторы report, про которые тред.
Оффер против карточки модели
Это два разных объекта, и факторы у них разные.
Код: Выделить всё
ОФФЕР (offer) - конкретное предложение конкретного магазина:
"наушники X, магазин Y, 5990 р, в наличии, доставка завтра"
теги факторов: TG_OFFER
примеры: OFFER_PRICE, DELIVERY_FREE, DISCOUNT_IN_RUB
МОДЕЛЬ (model) - обобщённая карточка товара, к ней приматчены
много офферов от разных магазинов:
"наушники X" + агрегаты по всем офферам
теги факторов: TG_MODEL
примеры: MIN_MODEL_PRICE, AVG_MODEL_PRICE,
MAX_MODEL_PRICE, MODEL_RATING
Места показа (Tags)
В реестре факторов у каждого фактора есть теги, которые говорят, на каком месте выдачи он применим. Один фактор часто живёт сразу на нескольких местах.
Код: Выделить всё
TG_TEXT_PLACE текстовая товарная выдача (список/галерея товаров)
TG_MODEL_OFFER_PLACE карточка товара с офферами от магазинов
TG_BLENDER_PLACE подмешивание товарного блока в блендер общей выдачи
TG_OFFER / TG_MODEL уровень объекта (оффер или модель)
TG_BASE исходные/базовые сигналы
TG_DOCUMENT_QUERY_CTR поведение: связка документ-запрос (клики/CTR)
TG_DSSM / TG_DJ нейросетевые эмбеддинги и рекомендательные сигналы
TG_DEPRECATED мёртвый, НЕ рабочий - не подавать как сигнал
TG_UNUSED объявлен, но не используется
Каскад моделей CatBoostВажно про deprecated/unused. В реестре 3144 фактора (Index 0..3143), и заметная часть помечена TG_DEPRECATED или TG_UNUSED. Если где-то увидите красивое имя фактора - это ещё не значит, что он влияет на выдачу сегодня. Часть имён - это история и эксперименты.
Ранжирование - не одна формула, а каскад. В data/formulas лежат скомпилированные модели: meta_models (~90 версий), models и formulas в JSON (~500+). Грубо это работает так: дешёвые факторы отбирают кандидатов, затем более тяжёлые формулы (CatBoost-деревья) переранжируют топ, в товарной выдаче добавляются нейросетевые сигналы (DSSM/BERT) и поведенческие.
Код: Выделить всё
кандидаты (много) -> базовый отбор по дешёвым факторам
-> meta-модель CatBoost: переранжирование топа
-> досыпка DSSM/BERT + поведение
-> финальный порядок в блоке/галерее
Шесть групп сигналов
Сводная карта групп - детали в подтредах. Имена даны как в коде.
Код: Выделить всё
ГРУППА РЕАЛЬНЫЕ ФАКТОРЫ (из factors_meta_gen.in)
----------------- ------------------------------------------------
1 ТЕКСТ/РЕЛЕВ BM25_TITLE, BCLM_TITLE, семейство BM25_*_TITLE,
BMRKT_WM_TITLE_* - соответствие запрос<->название
2 ЦЕНА OFFER_PRICE, MIN/AVG/MAX_MODEL_PRICE,
DISCOUNT_IN_RUB, DJ_DOCUMENT_PRICE_GRADE_CATEGORY
(цена относительно типичной в категории)
3 НАЛИЧИЕ+ДОСТАВКА DELIVERY_FREE, DELIVERY_PRICE, DELIVERY_LOCAL,
DELIVERY_SELF, AVG_REL_WITH_DELIVERY
4 МАГАЗИН/ДОВЕРИЕ FIXED_SHOP_OPINION_COUNT_Q0..Q100 (отзывы о
магазине по квантилям), VENDOR-сигналы,
EQUAL_VENDOR_CODE
5 ОТЗЫВЫ/КАРТОЧКА MODEL_RATING, BG_DIVERSITY_CATEG_REVIEW
6 ПОВЕДЕНИЕ/CTR CPA, BERT_CLICK, DSSM_*_CPA_CLICK,
RAPID_CLICKS_* (клик->заказ),
BLUE_CATEGORY_ORDERS_DIV_MODEL_CLICKS
- Текст и релевантность. Огромное семейство BM25/BCLM по полю TITLE - это соответствие слов запроса названию товара. Название - главное текстовое поле в товарной карточке, и под него заточена куча факторов. Отсюда практика: писать название по-человечески, с типом товара и ключевыми параметрами, без мусора и спама.
- Цена. Не только абсолютная (OFFER_PRICE), но и относительная: DJ_DOCUMENT_PRICE_GRADE_CATEGORY оценивает, насколько цена выбивается из типичной по категории. То есть важна не дешевизна сама по себе, а адекватность цены для своего сегмента.
- Наличие и доставка. Целая группа DELIVERY_*: бесплатная, платная, локальная, самовывоз, плюс AVG_REL_WITH_DELIVERY. Нет в наличии или дорогая/медленная доставка - сигнал режется. Это то, что упирается в фид: наличие и условия доставки берутся именно оттуда.
- Магазин и доверие. FIXED_SHOP_OPINION_COUNT_Q0..Q100 - количество отзывов о магазине, разложенное по квантилям. Плюс вендорные сигналы. Доверие к продавцу - отдельный пласт от качества самого товара.
- Отзывы и карточка. MODEL_RATING - рейтинг карточки модели. Хорошо заполненная карточка с фото, параметрами и живыми отзывами тянет вверх.
- Поведение и CTR. Самая тяжёлая по объёму группа в коде. CPA и связки клик->д弛вел-тайм->заказ (RAPID_CLICKS_*), нейросетевые предсказания клика (BERT_CLICK, DSSM_*_CPA_CLICK), отношение заказов к показам (BLUE_CATEGORY_ORDERS_DIV_MODEL_CLICKS). Маркету важен не клик, а доведение до заказа - это видно по обилию CPA-факторов.
Дисклеймер ещё раз: всё выше - реконструкция по исходникам товарной вертикали goods, не официальная формула Маркета. Часть факторов из реестра помечена deprecated/unused; статических процентных весов у факторов нет, потому что ранжирует дерево решений.Практический вывод хаба. Сначала проверьте, что вы вообще в индексе и приматчены к нужной модели - это upstream, фид и матчинг (дерево market/). Потом работайте над тем, что видят факторы report: честное название под TITLE, адекватная для категории цена, наличие и нормальная доставка в фиде, отзывы и заполненная карточка, репутация магазина. А выше всего этого стоит поведение: CTR в галерее и доведение клика до заказа. Веса не статичны - решает CatBoost-каскад, и сигналы работают в комплексе, а не по отдельности.
Разборы по темам
- Архитектура: фид, индекс Маркета, report:
viewtopic.php?t=2053 - Текстовая релевантность (BM25/BOCM/BCLM/TOCM):
viewtopic.php?t=2054 - Цена и конкурентность:
viewtopic.php?t=2055 - Наличие и доставка:
viewtopic.php?t=2056 - Магазин и продавец (рейтинг, операционные метрики):
viewtopic.php?t=2057 - Карточка модели, отзывы и фото:
viewtopic.php?t=2058 - Поведенческие сигналы и CTR:
viewtopic.php?t=2059 - Категоризация товара:
viewtopic.php?t=2060 - Антиспам и фильтры качества:
viewtopic.php?t=2061 - Платное размещение против органики:
viewtopic.php?t=2062 - Сводный playbook для магазина:
viewtopic.php?t=2063
- Формула ранжирования Яндекса (веб): viewtopic.php?t=1828
- Робот Яндекса (индексация): viewtopic.php?t=1842
- Формирование выдачи Яндекса: viewtopic.php?t=1849
- Факторы ранжирования Google: viewtopic.php?t=1857