Вход на сайт

Просмотр новости

Найдите то, что Вас интересует

От ручных правил к модели: как автоматизировать субсидии, если нельзя просаживать метрики в АБ

Дата публикации: 12-08-2026 13:27:54

Привет! Я Арина Сокова, аналитик в Авито Подработке. Мы отвечаем за то, чтобы смены на платформе закрывались, исполнители и заказчики находили друг друга, а платформа не тратила на продвижение сервиса слишком много. В статье расскажу, что такое субсидии в Авито Подработке, и как мы перешли от ручного назначения субсидий по бизнес-правилам к автоматической системе.Текст будет полезен аналитикам и продакт-менеджерам, которые работают с ценообразованием, субсидиями, промомеханиками и любыми задачами оптимизации бюджета при ограничениях. Читать далее

Основное содержимое страницы с новостью.

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

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

c9aaa314af1369a6d8ec1fd5092c16a9.jpgЧто такое Авито Подработка и субсидии

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

Заказчик публикует смену, гиг–исполнитель (гигер) записывается на неё и выходит.

Несколько терминов, чтобы лучше понимать статью.

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

Ёмкость смены — сколько исполнителей нужно на смену. Один исполнитель — это единица. Если нужно два исполнителя, ёмкость равна 2.

Слот — конкретное место на смене. Например, в ёмкости 3 находятся три слота.

Базовая цена — ставка, которую назначил заказчик.

Ontop (онтоп) — оплата гигеру от платформы из своего бюджета. Гигер в поиске видит общую стоимость: базовая цена плюс ontop.

Fill Rate (FR) — доля закрытых смен от всех опубликованных. Ключевой показатель эффективности платформы.

Completed slots — успешно завершённые слоты. Это целевая метрика команды.

SubGMV — уровень субсидирования. Отношение суммы надбавки к GMV. Условно, сколько копеек субсидии тратится на каждый рубль оборота.

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

Важная оговорка

В контексте статьи слово «субсидии» мы используем не в его классическом значении. Под субсидиями подразумеваем оплату услуги гигеру от платформы из своего бюджета при выходе на «сложную» смену.

Исполнители охотнее соглашаются с более приятными условиями, смены закрываются, а мы добираем нужный Fill Rate.

Метод надёжный, но в начале 2026 года уровень субсидирования на платформе стал довольно высоким. Авито Подработка — молодой продукт, которому нужен высокий и стабильный Fill Rate, чтобы обеспечивать главное конкурентное преимущество. Если не держать высокую планку, можно потерять клиентов. 

С другой стороны хотелось бы снизить высокий уровень онтопа, что мы и сделали. Дальше подробности.

Тут еще больше контента

Тут еще больше контента

Ограничения ручного управления

Раньше субсидиями управляли вручную, но когда сервис сильно вырос, появились несколько ограничений.

На управление онтопами еженедельно уходило много времени.

Бюджет утекал в неэластичные сегменты.

Логика не масштабировалась, потому что сегменты — это бренд, помноженный на задание, локацию и время. Комбинаций тысячи, и чтобы проверить каждую, надо поставить отдельный АБ-тест. Но высокий MDE категории не даёт ставить их массово.

Аналитическую оптимизацию провести не получается. Чтобы улучшить правило, нужен тест, которому требуется большой объём, а его нет, и итерации фактически встают.

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

Именно в этот момент появилась конкретная задача — снизить SubGMV, то есть уменьшить общую сумму затрат на субсидии, и вырастить Fill Rate. Формулировалась она так: «Снизить уровень субсидирования без ухудшения бизнес-метрик».

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

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

Так мы пришли к задаче построить систему, которая автоматически назначает Ontop, минимизирует SubGMV и при этом не роняет Completed slots и Fill Rate.

Ограничения автоматического управления

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

Мы искали решение с учётом наших специфических условий:

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

Мы ограничены в экспериментах. Ontop поддерживает высокий Fill Rate, и мы не можем обнулить его в тестовой группе, чтобы измерить чистую кривую эластичности. Это обвалит бизнес-метрики и ударит по контрактным обязательствам перед клиентами. В итоге видим только узкий локальный участок кривой вокруг текущих значений.

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

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

Вот как с учётом этих ограничений выглядел шорт-лист подходов.

Подход

Как работает

Что даёт

Ограничения и требования

Бизнес-правила

Ручные пороги по исторической доле закрытых смен от всех опубликованных

Просто, прозрачно, контролируемо

Не масштабируется и не знает цену слота

Price-response модель

Оценка вероятности закрытия от цены

Отвечает «сколько», учится на истории, объяснима

Видит только узкий участок кривой

Бинарный uplift

Классификатор: кому предлагать субсидию

Отсекает заведомо лишние субсидии

Не отвечает «сколько»

MAB / Contextual Bandits

Онлайн-подбор действия

Адаптируется без АБ

Нужна высокая частотность и быстрый фидбэк

RL

Агент учится стратегии

Теоретически оптимум

Исследует неоптимальные зоны, бьёт по Fill Rate

Байес, GP и нейросети

Гибкие вероятностные модели

Высокая выразительность

Требуют много данных, хуже интерпретируются

Логика выбора получилась такой. Бизнес-правила мы уже переросли. Бинарный uplift не отвечает на вопрос «сколько». Бандиты, RL и прочие адаптивные методы теоретически мощнее, но им нужно активно исследовать пространство и быстро учиться на свежем фидбэке, а у нас нельзя ни исследовать, ведь уроним Fill Rate, ни быстро учиться из-за низкой частотности. Байес, гауссовы процессы и нейросети упираются в объём данных и интерпретируемость.

Price-response модель вписывается в эти ограничения: она учится на уже накопленной истории, масштабируется и остаётся объяснимой. Поверх неё мы ставим алгоритм распределения бюджета. Получается двухслойная архитектура:

1. Price-response модель оценивает, с какой вероятностью закроется слот при заданном уровне цены.

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

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

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

Что предсказывает новая модель по управлению субсидиями

Отвечает, с какой вероятностью слот закроется в конкретные сутки, с учётом цены из базовой ставки с Ontop и параметров смены.

Единица наблюдения — пара из свободной ёмкости и временно́го бакета. Признаки сгруппированы в слои по уровню принятия решения.

Цену — базовую ставку за час и онтоп. Это ключевой слой, ради которого всё затевалось. Онтоп входит в итоговую цену, чтобы использование субсидии как фичи напрямую не приводило к смещению.

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

Геолокацию и рынок: расстояние до точки, размер города, признак столицы, гео- и таск-скоры.

Историческую статистику платформы: метрики закрытия и субсидирования сегмента.

В качестве таргета взяли факт закрытия слота, потому что запись — промежуточное событие в воронке. Ontop влияет не только на саму запись, но и на то, дойдёт ли человек до смены. Если оптимизировать запись, мы поймаем только часть эффекта субсидии и получим смещённую оценку. А закрытый слот явно показывает 100% влияния онтопа.

Жми сюда!

Жми сюда!

Как мы боролись со смещением данных

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

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

- контакт в группе A — слот закрыл гигер из тестовой группы.

- контакт в группе B — слот закрыл гигер из контрольной группы.

- нет контакта — слот не закрыт.

Мы сохранили все экспериментальные данные и явно учли разницу в ценовых условиях между группами. Для нетестовых данных вероятность контакта в А и B одинаковая. В проде используется двухклассовая интерпретация: контакт против отсутствия контакта при одинаковой цене в обеих группах. Поэтому один из важных критериев приёмки — качество в ситуации A = B.

Зашили в модель ограничение, которое прямо борется со смещением. Наша модель не работает по принципу «больше субсидии = хуже результат», потому что мы наложили монотонное ограничение на ценовые признаки. Рост субсидии не может увеличивать вероятность незакрытия слота. Так модель учит эффект цены в правильном направлении даже на смещённых данных.

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

Что показали метрики

Ключевой критерий успеха в задаче — калибровка. Предсказанные вероятности уходят на вход алгоритму распределения бюджета, поэтому критично, чтобы они соответствовали реальным частотам. Если модель говорит «закроется с вероятностью 70%», такие слоты должны закрываться примерно в 70% случаев. Именно это, а не угадывание судьбы конкретного слота, определяет, правильно ли алгоритм раскидает бюджет.

Про двухклассовую постановку

Мы обучаем модель в трёх классах: контакт A, контакт B, нет контакта, чтобы не терять заложенную в АБ-тесты вариацию цены между группами. Но в продакшене обе ценовые группы получают одинаковый онтоп, поэтому A и B схлопываются в «контакт». В этой постановке метрики заметно лучше, чем в трёхклассовой постановке, что ожидаемо: при равной цене различать A и B модель не обязана.

Метрика на двухклассовой постановке

Значение (test)

LogLoss

0.44

Brier

0.29

Отклонение по Fill Rate

-0.6 п.п.

Symmetry gap (A против B при равной цене)

< 0.01

Метрика Symmetry gap показывает, что предсказание для A и B обязано совпадать. Модель не должна «подсматривать», какая из групп тестовая. Gap меньше 0.01 подтверждает, что симметрия соблюдается.

Главная строка — отклонение по Fill Rate: на агрегате предсказанный Fill Rate совпадает с реальным с точностью до 1 пп. Это значит, что калибровочная кривая ложится на диагональ: в каждой корзине вероятностей предсказание совпадает с фактической частотой закрытия. 

Кривая калибровки двухклассовой модели

Кривая калибровки двухклассовой модели

Кривая калибровки в идеальном случае совпадает с прямой (0,0), (1,1). Это означает, что в группе с предсказанием вероятности закрытия слота n% слоты действительно закрываются в n% случаев. Чем меньше отклонение реальной кривой от идеальной — тем лучше калибровка модели.

Как настроили жадный алгоритм поверх модели и что оказалось не так

Это простой, интерпретируемый и устойчивый к шуму метод. Логика такая:

1. Всем сегментам назначаем минимальный допустимый онтоп.

2. Для каждого сегмента считаем, сколько эффективности добавляется при росте онтопа на шаг. Оцениваем в пересчёте на количество смен, купленных за рубль субсидии.

3. Растим онтоп там, где рост на рубль выше трешхолда.

4. Повторяем, пока есть шаги, приносящие больше трешхолда. Трешхолд подбираем бинарным поиском исходя из таргетного бюджета.

Принцип интуитивный: даём бюджет в наиболее эффективные сегменты в первую очередь.

АБ-тест: двухнедельный тест на всех пользователях Авито Подработки в сплите 50/50 получился серый: ни одна ключевая метрика значимо не просела, а критерий успеха — быть не хуже бизнес-логики — мы выполнили. 

В результате мы раскатали аналитическую логику и получили систему, которая работает так же хорошо, как ручное управление, но ещё и существенно экономит наш ресурс. Теперь хотим распределить бюджет ещё эффективнее и снизить SubGMV без потери Completed slots. Критерий успеха — зелёный тест.

У жадного алгоритма три структурных слабости:

Пропускает шаги. Он оценивает эффективность каждого шага относительно предыдущего. Если шаг с 0% на 10% оказался неэффективным, алгоритм останавливается и не видит, что шаг с 10% на 20% мог дать хороший прирост.

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

Дискретность. Оптимальный онтоп может лежать между точками грубой сетки, но текущий алгоритм этого не использует и шагает с низкой дискретностью.

Поскольку нам требовался зелёный тест, мы пошли искать ещё более эффективное решение.

Что выбрали вместо жадного алгоритма

Если посмотреть на всё формально, это оказывается классической задачей о рюкзаке.

Задача о рюкзаке

Что у нас

Рюкзак ограниченного объёма

Бюджет субсидий (целевой SubGMV)

Предмет

Пара из сегмента и уровня онтопа

Ценность предмета

Инкрементальные Completed slots

Вес предмета

Вклад в SubGMV

Выбор предметов

Назначение онтопа каждому сегменту

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

Задача о рюкзаке NP трудна в общем случае, но в нашей постановке её решить можно. 

— жёсткое бюджетное ограничение сильно сужает пространство поиска. 

— онтоп выбирается из фиксированной дискретной сетки. Это позволяет применить метод Branch and Bound, который отсекает заведомо бесперспективные ветки перебора. Мы используем открытый решатель CBC, который находит точный глобальный оптимум на сетке за приемлемое время.

Отдельная техническая тонкость

SubGMV нелинейно зависит от онтопа. При высокой надбавке начинаешь оплачивать в том числе органические слоты, а классический LP предполагает линейность ограничений. Мы обходим это предподсчётом spend и GMV для каждой пары: нелинейность превращается в набор заранее посчитанных линейных коэффициентов, и оптимизатор оперирует готовыми числами.

Мы провели офлайн-симуляцию и выяснили, что LP стабильно обыгрывает жадный алгоритм во всех сегментах: при одинаковом целевом SubGMV даёт более высокий Fill Rate, либо при равном Fill Rate уходит ниже по SubGMV. Мелкая сетка с шагом онтопа в 2 пп добавляет прирост за счёт снижения ошибки дискретизации. 

LP на мелкой сетке работает ещё лучше, поскольку оптимум часто лежит между крупными шагами.

FR 1d — метрика, аналогичная Fill Rate, но рассчитанная за один день в период выставления Ontop, а не за весь период смены. Используем именно её для гибкости инструмента

FR 1d — метрика, аналогичная Fill Rate, но рассчитанная за один день в период выставления Ontop, а не за весь период смены. Используем именно её для гибкости инструмента

И отдельный бонус: LP попадает в любой заданный уровень SubGMV, без перескока бинарного поиска.

Важная оговорка к симуляции

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

Что получилось в итоге

Мы провели финальный тест и получили зелёные результаты.

Метрика

Эффект

Значимость

Completed Slots

+4.8%

не значимо 

GMV

+3.09%

не значимо

Revenue

+3.12%

не значимо

Sum ontops

−9.32%

значимо (α = 0.05)

SubGMV ontop

−12.04%

значимо (α = 0.0001)

👉 SubGMV ontop снизился на 12%, это значимый результат на уровне 99.99%. 

👉 Бизнес-метрики показывают незначимую положительную динамику.

👉 Нет негативного эффекта на операционные показатели.

👉 SubGMV снизился из-за уменьшения среднего онтопа на слот, а не перетока слотов в категорию «без онтопа»: Completed slots with Ontop не просели. 

👉 Решение раскатали в прод.

Как всё работает в проде

Назначение Ontop реализовано как batch-пайплайн. Значения считаются офлайн и загружаются в сервис, который применяет их при назначении выплат исполнителям. 

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

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

В результате система прошла валидацию двумя АБ-тестами и отлично работает. 

Вся статья кратко

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

 👉 Раньше субсидии выставлялись вручную по бизнес-правилам, и уровень субсидирования был высоким.

👉 Мы нашли решение, как автоматизировать и оптимизировать процесс назначения субсидий. Выбрали двухслойную архитектуру: price-response модель, плюс алгоритм распределения бюджета. Это позволило нам не только сократить ручное капасити на поддержание субсидий, но и значимо снизить траты, не снижая бизнес-метрики. 

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

👉 На этапе оптимизации формализовали всё, как задачу о рюкзаке и заменили жадный алгоритм на LP-оптимизатор с мелкой сеткой.

👉 На проде всё работает как еженедельный batch-пайплайн с мониторингом деградации.

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

Если хотите знать больше о работе со сложными продуктами, подписывайтесь на телеграм-канал «Коммуналка аналитиков». Там интересно!

Кликни здесь и узнаешь

Кликни здесь и узнаешь

Схожие новости

#Наименование новостиТональностьИнформативностьДата публикации
1Коммуникация это тоже часть стека. Почему проекты тонут не из-за кода07.5412-08-2026
2Рекомендации на онбординге Хабра стали обновляться чаще (и автоматически)3613-07-2026
3Управление проектами: 10 самых интересных публикаций за 2 недели010.8307-08-2026
4Какие отчеты и автоответчики нужны продавцам Ozon и WB? Создаем инструмент вместе - обсуждение0526-11-2025
5Токены в ИИ и оптимизация промптов: как я сэкономила 50% бюджета и перестала здороваться с ChatGPT09.1906-08-2026
6183 модуля, 2 разработчика и никакой подписки: как 15 лет живет система учета для бизнеса010.8412-08-2026
7«Авито Подработка»: названы высокооплачиваемые подработки для зумеров в первом полугодии 2026 года0515-07-2026
8Ад позадачного сопровождения0525-06-2026
97 месяцев вайбкодинга: как в одиночку делать то, что раньше требовало команду0901-08-2026
107 месяцев вайбкодинга: как в одиночку делать то, что раньше требовало команду0901-08-2026

Классификация: Мнения. Схожих патентов: 0. Схожих новостей: 10. Тональность: 0. Информативность: 8.4. Источник: habr.com.