Клиент
Розничная сеть, включающая около 90 супермаркетов различной величины.
Задача
Количество посетителей в супермаркетах сети зависит от множества факторов: день недели, время года, приближающиеся или прошедшие праздники, размер населённого пункта и др.
Для администрации каждого магазина очень важно заранее спланировать количество сотрудников, которые выйдут на работу в соответствующие дни. Если выйдет больше сотрудников, чем нужно, то компания недополучит прибыль из-за избыточных выплат сотрудникам, а если меньше — из-за упущенных продаж и недовольства посетителей.
Кроме того, до сих пор график работы сотрудников составлялся вручную менеджерами магазинов, и согласования занимали много времени: для каждого дополнительного назначения приходилось обзванивать сотрудников по телефону. Руководство компании решило автоматизировать планирование рабочих графиков сотрудников, а для прогнозирования спроса использовать ИИ.
Существенной проблемой является то, что обычно прогностические системы могут качественно прогнозировать на 1-4 недели вперёд, а законодательство требует от работодателей сообщать сотрудникам их график не менее, чем за 4 недели. Это значит, что прогноз спроса нужно сделать на 8 недель вперёд, но с тем же качеством, что и 1-4-недельные прогнозы, т.е. с 90% точностью.
Кроме того, была поставлена задача автоматизации развёртывания новых версий программных компонентов с использованием кластера Kubernetes.
Решение
Прогнозирование количества посетителей с помощью ИИ
Мы пробовали использовать обычные модели временных рядов (time series models), такие как ARIMA и Prophet. Они продемонстрировали хорошую обобщающую способность*, но всё-таки не давали нужную точность при прогнозе на 8 недель.
Тогда мы перешли на модели, использующие метод бустинга — создания ансамбля слабых (плохо предсказывающих) моделей для построения сильной итоговой модели. К преимуществам метода относят устойчивость к шуму и некорректным данным и эффективность при работе с небольшими объёмами данных. Бустинговые модели широко распространены в различных областях, где важна высокая точность прогнозирования.
Наилучшим выбором в нашем случае оказалась разработанная Яндексом модель с открытым исходным кодом CatBoost, поскольку она позволяет эффективно работать с категориальными данными и использовать много гиперпараметров** для точной настройки. Кроме того, CatBoost обеспечивает высокую скорость обучения и минимизирует риск переобучения (overfitting).
Мы подобрали входные данные, которые нужно подавать в модель, чтобы получать результат нужной точности:
- продажи ровно год назад,
- тренд за 12 недель,
- тренд за 8 недель,
- модуль учёта подвижных праздников.
Поскольку модель работает только первый год, бывают ситуации, когда клиент по собственному опыту знает, что для правильного прогноза нужно учесть дополнительные особенности, не выявляемые на данных прошлого года. Например, для праздников с фиксированной датой спрос может зависеть от дня недели, на который выпадает праздник. Для подвижных праздников (Пасха и др.) повышение спроса может сильно зависеть от сезона, на который они приходятся. В этих случаях производится корректировка либо дообучение модели, чтобы новый прогноз учитывал дополнительную информацию.
Кроме того, мы провели кластеризацию магазинов по фактору поведения, т.е. сгруппировали магазины, где поведение посетителей следует аналогичным паттернам. Например, в крупных городах наплыв посетителей в пиковые даты гораздо мощнее, чем в мелких посёлках, где количество посетителей всегда ограничено численностью населения. Использование в модели прогнозирования данных конкретного кластера магазинов ещё больше повышает точность предвидения.
Веб-приложение для автоматизации составления рабочего графика
Полученный прогноз используется для составления рабочего графика сотрудников.
Чтобы автоматизировать процесс согласования графиков с сотрудниками, мы спроектировали в дополнение к веб-приложению мобильное PWA-приложение*** для сотрудников. Посредством этого приложения каждый сотрудник может указать доступные часы работы, а менеджер в дальнейшем будет видеть эту информацию при разработке графика. После того как менеджер создал план, сотрудник получает уведомление и видит в приложении график своих смен. Если же нужно внести изменения в утверждённый план (например, если сотрудник заболел), то приложение рассылает уведомления всем сотрудникам, у которых соответствующие часы указаны как доступные, и они могут взять дополнительную работу. Таким образом, менеджеру больше не нужно обзванивать сотрудников.

Веб-приложение на основании прогноза сообщает, какое количество сотрудников должно выйти на работу в определённый день/время. В дальнейшем планируется автоматизировать составление индивидуальных графиков. Помимо планирования, в веб-приложении менеджеру доступны разнообразные отчёты: о количестве посетителей, эффективности работы каждого сотрудника и др. Осуществлена интеграция с системой подсчёта количества посетителей и другими внутренними информационными системами.
Для разработки приложений был выбран Vue 3, поскольку это популярный, активно развивающийся фреймворк для создания пользовательских интерфейсов. Он позволяет с минимальными затратами собрать удобный и производительный интерфейс. Для разработки бэкенда используется C#, поскольку он позволяет поддерживать совместимость как с Linux, так и с Windows.
Автоматизация развёртывания приложений с использованием кластера Kubernetes
До решения данной задачи у каждого из четырёх приложений клиента был отдельный пайплайн, который нужно было запускать независимо от других. Поскольку выкладывать обновления на продакшен-окружение нужно еженедельно, а на тестовое — ежедневно или чаще, на это уходило много времени. Вместо этого был создан универсальный конфигурируемый пайплайн, где можно в едином интерфейсе галочками выбрать, какие именно приложения нужно обновить. Это позволяет значительно экономить рабочее время DevOps-специалиста — развёртывание всех приложений занимает ~15 минут.
На проекте используется подход GitOps и технология Flux CD.
Результат
В настоящее время модель уже даёт прогнозы нужной точности (90%) для недель без праздников. В праздничные недели в случае необходимости производится корректировка модели; это особенно касается подвижных праздников, поскольку для них величина спроса зависит от даты (сезона), на которую выпал праздник. По окончании годового цикла можно будет оценить общие итоги работы модели.
Автоматизация развёртки успешно реализована, время на обновление приложений сократилось в несколько раз.