Аннотация
Данные о заказах гостей накапливаются в системе учёта ресторана, но их результат поступает менеджеру после смены либо самому гостю в рассылку. Официант — единственный участник обслуживания, который в момент разговора с гостем не располагает ничем, кроме текущего заказа.
Boostaurant обрабатывает историю заказов и по номеру столика выдаёт официанту профиль гостя и пять рекомендаций по меню. Отмеченные официантом аллергены исключаются из выдачи начиная со следующего обращения. Рекомендации строятся тремя способами по убыванию персонализации — матричное разложение, кластеризация, популярность, — поэтому платформа выдаёт обоснованное предложение и гостю, пришедшему впервые.
Продукт не заменяет систему учёта или программу лояльности: он работает поверх данных системы учёта и добавляет получателя, которого у этих данных не было.
Область применения
Рестораны с полным обслуживанием, использующие систему учёта iiko, с базой от 500 постоянных гостей или от 1 000 заказов в месяц.
Состояние
Разработан прототип: база данных, рекомендательное ядро, программный интерфейс, бот официанта. Прототип обучен и проверен на синтетических данных, сформированных по формату iiko. Внедрений в действующих ресторанах нет.
Технические характеристики
| Интерфейс официанта | Бот в мессенджере (прототип — Telegram, aiogram 3.x); установка приложений не требуется |
|---|---|
| Сервис рекомендаций | Программный интерфейс на FastAPI |
| Хранилище | PostgreSQL; структура таблиц повторяет формат выгрузки iiko |
| Рекомендательные модели | SVD (библиотека Surprise), k-means (scikit-learn) |
| Выдача | 5 позиций меню с категорией, ценой и указанием основания рекомендации |
| Развёртывание | Docker; отдельный экземпляр с собственной базой и моделями для каждого ресторана |
| Сетевая доступность | Ни один порт не открыт во внешнюю сеть; бот работает в режиме long polling |
| Обновление моделей | Переобучение по расписанию |
| Требования к серверу | 2 vCPU, 4 ГБ ОЗУ, 20 ГБ SSD, Ubuntu 22.04/24.04 |
| Персональные данные | Имя, пол, e-mail, карты лояльности и бонусные балансы не собираются и не хранятся |
Показатели прототипа
Доля корректных рекомендаций для гостя с историей заказов (целевое значение — не менее 80 %)
То же для гостя с единственным визитом
То же для гостя с тремя визитами
Синтетические данные: 300 гостей, 56 блюд, 12 категорий меню. Корректной считается позиция первой пятёрки, относящаяся к категориям меню, характерным для поведенческого типа гостя.
Особенности разработки
Матричное разложение применяется к гостю, включённому в обученную модель. Гостю с одним и более заказом, ещё не вошедшему в модель, рекомендации строятся по группе гостей со сходной структурой заказов (k-means). Гостю без истории выдаются популярные позиции. Официант видит, какой слой сработал.
Счётчик заказов смешивает две величины — насколько гость любит блюдо и как часто он посещает ресторан. Нормировка внутри гостя делает оценку сравнимой между редкими и частыми гостями.
Смещение блюда отражает его популярность, и его вклад превышал вклад факторов вкуса. Популярность вынесена в отдельный слой для гостей без истории.
Средний чек и доли 12 категорий меню. Признаки давности и частоты визитов исключены: для нового гостя они вырождены и группируют гостей по активности, а не по вкусу.
Фильтр применяется ко всему ранжированному списку, а не к первой пятёрке, с поправкой на долю категории в заказах гостя. Заметки официанта совпадают с признаками блюд в справочнике меню, поэтому отмеченный аллерген учитывается в следующей же рекомендации.
Бот не содержит прикладной логики и обращается к сервису рекомендаций по HTTP. Замена мессенджера затрагивает только клиентский модуль.
Схемы
Интерфейс официанта





Экраны прототипа. Данные гостей синтетические.