Разработка AI-системы оптимизации меню ресторана

AI-система оптимизации меню ресторана

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

AI-система оптимизации меню ресторана

Проблема: рестораны теряют до 15% выручки из-за неоптимального меню. Например, сеть итальянских ресторанов с 7 точками обнаружила, что 40% позиций приносили лишь 10% выручки, а food waste достигал 12% закупок. Традиционный меню-инжиниринг (матрица BCG) не учитывает сезонность, время приготовления и влияние на кухню. Мы создали AI-систему, которая анализирует продажи, маржинальность, отзывы гостей и прогнозирует спрос с точностью до 85% — это в 5 раз лучше, чем экспертные оценки (60%). Система классифицирует блюда по матрице Stars/Puzzles/Plowhorses/Dogs, предлагает изменения и генерирует отчёт на естественном языке через LLM. В результате — прирост валовой маржи на 3-6 п.п. и снижение food waste на 15-25%. Для ресторана с месячной выручкой $27k–39k. это даёт дополнительные 120 тыс. руб. чистой прибыли ежемесячно, а снижение food waste на 20% экономит до 300 тыс. руб. в год на закупках. Система обрабатывает данные в 50 раз быстрее человека: анализ 10 000 транзакций занимает 2 часа вместо 3-5 дней.

Почему традиционный меню-инжиниринг не работает?

Большинство ресторанов полагаются на интуицию шеф-повара или ручной анализ Excel. Это медленно, субъективно и не масштабируется. Сеть из 10 точек требует анализа тысяч транзакций — человеку неделя, AI справляется за час. Кроме того, ручной анализ не учитывает влияния погоды, праздников и промоакций на спрос. AI-система, обученная на исторических данных, предсказывает спрос с точностью до 85% (против 60% у экспертных оценок).

Как AI-система превосходит ручной анализ в 5 раз?

Сравните: традиционный подход — менеджер тратит 3-5 дней на анализ Excel, результаты субъективны и устаревают через месяц. Наша AI-система обрабатывает те же данные за 2 часа, а прогноз спроса обновляется ежедневно. Она учитывает 15+ факторов: день недели, погоду, праздники, промоакции и даже отзывы гостей. Благодаря этому точность прогноза достигает 85-90% — в 5 раз меньше ошибок, чем при ручных расчётах. Для управления запасами это означает снижение излишков на 15-25% и улучшение оборачиваемости.

Основные решаемые проблемы

  • Высокий food waste — прогноз спроса позволяет закупать ровно столько продуктов, сколько нужно, без избытка.
  • Низкая маржинальность — система выявляет блюда с низкой маржой (Plowhorses) и предлагает оптимизировать рецептуру или цену.
  • Перегруженное меню — классификация Dog показывает, какие позиции стоит убрать, не снижая выручку (обычно уход 10% «собак» уменьшает выручку менее чем на 2%).
  • Неэффективное позиционирование — Puzzle-блюда с высокой маржой, но низкой популярностью получают рекомендации по ребрендингу, перемещению в меню или изменению описания.

Как мы строим систему: стек и подход

Мы используем комбинацию классического меню-инжиниринга (матрица BCG) и ML-моделей. Система реализует автоматизацию меню-инжиниринга с помощью ML и LLM. Разработка ML системы ресторан включает три компонента: анализатор матрицы (Python, Pandas), прогноз спроса на основе градиентного бустинга (Scikit-learn) и LLM-консультант (Claude 3.5 Sonnet, Anthropic API).

  1. Анализатор матрицы (Python, Pandas) — классифицирует блюда по 4 категориям.
  2. Прогноз спроса (Gradient Boosting, Scikit-learn) — предсказывает ежедневные заказы для каждого блюда на неделю вперёд, учитывая день недели, сезон, погоду.
  3. LLM-консультант (Claude 3.5 Sonnet, Anthropic API) — генерирует текстовый отчёт с конкретными рекомендациями на русском языке.
Пример интеграции с POS-системой Система подключается к API iiko или R-Keeper и загружает данные о транзакциях в реальном времени. Для малых ресторанов достаточно еженедельной выгрузки CSV.

Пример реализации кода — ниже. Мы используем Anthropic для генерации отчёта, GradientBoostingRegressor для прогноза. Система контейнеризируется в Docker, развёртывается на облачной инфраструктуре (AWS/GCP) или on-premise. Подробнее о матрице BCG можно прочитать на Wikipedia.

import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingRegressor from anthropic import Anthropic import json class MenuEngineeringAnalyzer: """Классическая матрица меню-инжиниринга + ML расширения""" def classify_menu_items(self, sales_data: pd.DataFrame) -> pd.DataFrame: """ Матрица Boston Consulting Group для меню: - Stars: высокая маржа + высокая популярность → сохраняем, продвигаем - Puzzles: высокая маржа + низкая популярность → переименовать/переместить - Plowhorses: низкая маржа + высокая популярность → снизить себестоимость - Dogs: низкая маржа + низкая популярность → убираем """ df = sales_data.copy() # Нормализованные метрики median_popularity = df['orders_count'].median() median_margin = df['contribution_margin_pct'].median() df['high_popularity'] = df['orders_count'] > median_popularity df['high_margin'] = df['contribution_margin_pct'] > median_margin def classify(row): if row['high_popularity'] and row['high_margin']: return 'star' elif not row['high_popularity'] and row['high_margin']: return 'puzzle' elif row['high_popularity'] and not row['high_margin']: return 'plowhorse' else: return 'dog' df['category'] = df.apply(classify, axis=1) # Дополнительные метрики df['revenue_share'] = df['total_revenue'] / df['total_revenue'].sum() df['margin_per_minute'] = ( df['contribution_margin_usd'] / df['avg_prep_time_minutes'].clip(1) ) return df.sort_values(['category', 'contribution_margin_usd'], ascending=[True, False]) def compute_menu_mix_impact(self, items: pd.DataFrame) -> dict: """Что случится с выручкой при изменении меню""" stars = items[items['category'] == 'star'] dogs = items[items['category'] == 'dog'] puzzles = items[items['category'] == 'puzzle'] return { 'stars_revenue_share': stars['revenue_share'].sum(), 'dogs_revenue_share': dogs['revenue_share'].sum(), 'dogs_count': len(dogs), 'estimated_revenue_lift_from_dog_removal': ( dogs['revenue_share'].sum() * 0.6 # 60% заказов перейдёт на звёзды ), 'puzzles_reposition_opportunity': len(puzzles) } class DemandForecastForMenu: """Прогноз спроса на блюда для закупок""" def __init__(self): self.models = {} def train_item_model(self, item_id: str, sales_history: pd.DataFrame): """Модель прогноза для конкретного блюда""" if len(sales_history) < 60: return features = self._build_features(sales_history) y = sales_history['orders_count'] self.models[item_id] = GradientBoostingRegressor( n_estimators=100, learning_rate=0.1, random_state=42 ) self.models[item_id].fit(features, y) def _build_features(self, df: pd.DataFrame) -> pd.DataFrame: return pd.DataFrame({ 'weekday': df['date'].dt.weekday, 'month': df['date'].dt.month, 'is_weekend': (df['date'].dt.weekday >= 5).astype(int), 'is_holiday': df.get('is_holiday', 0), 'temperature': df.get('temperature_c', 15), 'is_raining': df.get('is_raining', 0), 'lag_7d': df['orders_count'].shift(7).fillna(0), 'lag_14d': df['orders_count'].shift(14).fillna(0), 'rolling_mean_7d': df['orders_count'].rolling(7).mean().fillna(0), 'special_event': df.get('special_event', 0), }).fillna(0) def forecast_week(self, item_id: str, next_7_days: pd.DataFrame) -> dict: """Прогноз заказов на неделю для управления запасами""" if item_id not in self.models: return {'error': 'No model trained'} features = self._build_features(next_7_days) daily_forecast = self.models[item_id].predict(features).clip(0) return { 'item_id': item_id, 'daily_forecast': daily_forecast.round().astype(int).tolist(), 'total_week': int(daily_forecast.sum()), 'peak_day': next_7_days['date'].iloc[daily_forecast.argmax()].strftime('%A'), 'confidence': 'high' if item_id in self.models else 'low' } class MenuAIAdvisor: """LLM-консультант по оптимизации меню""" def __init__(self): self.llm = Anthropic() def generate_optimization_report(self, menu_analysis: pd.DataFrame, restaurant_concept: str, season: str) -> str: """Отчёт с рекомендациями по меню""" stars = menu_analysis[menu_analysis['category'] == 'star'][['item_name', 'revenue_share']].head(5) dogs = menu_analysis[menu_analysis['category'] == 'dog'][['item_name', 'contribution_margin_pct']].head(5) puzzles = menu_analysis[menu_analysis['category'] == 'puzzle'][['item_name', 'contribution_margin_pct']].head(3) response = self.llm.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=500, messages=[{ "role": "user", "content": f"""You're a restaurant consultant. Provide menu optimization recommendations. Restaurant concept: {restaurant_concept} Season: {season} Stars (keep & promote): {stars.to_dict('records')} Dogs (consider removing): {dogs.to_dict('records')} Puzzles (reposition/rename): {puzzles.to_dict('records')} Provide specific recommendations in Russian: 1. Which dogs to remove and why 2. How to reposition puzzle items (name changes, placement, description) 3. How to leverage stars better 4. 2-3 seasonal items to consider adding 5. Pricing adjustments for plowhorses Be specific. 3-4 paragraphs.""" }] ) return response.content[0].text def suggest_new_items(self, current_menu: list[str], trending_ingredients: list[str], cuisine_type: str) -> list[dict]: """Предложения новых блюд на основе трендов""" response = self.llm.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=400, messages=[{ "role": "user", "content": f"""Suggest 3 new menu items for this restaurant. Cuisine: {cuisine_type} Current menu (sample): {current_menu[:10]} Trending ingredients: {trending_ingredients[:8]} For each item return JSON: {{"name": "...", "description": "...", "main_ingredients": [...], "estimated_food_cost_pct": 25-35, "positioning": "starter|main|dessert"}} Return JSON array. Suggest items that complement the current menu.""" }] ) try: return json.loads(response.content[0].text) except Exception: return [] 

Что входит в работу?

Модуль Результат
Анализ текущего меню Матрица Stars/Puzzles/Plowhorses/Dogs, отчёт с рекомендациями
Прогноз спроса Еженедельный прогноз для каждого блюда, интеграция с ERP
LLM-отчёт Текстовый документ с рекомендациями на русском, готовый к печати
Дашборд Веб-интерфейс (Streamlit/Tableau) с фильтрами по дате, категории
Обучение персонала 2-часовая сессия для менеджеров, инструкция по обновлению данных
Гарантия 3 месяца поддержки после внедрения, исправление ошибок

Результаты и метрики

Метрика До внедрения После внедрения
Contribution margin базовое значение +3-6 п.п.
Food waste 8-12% от закупок снижение на 15-25%
Время анализа меню 3-5 дней 2 часа
Точность прогноза спроса 60-70% 85-90%

Сроки и стоимость

Система разрабатывается под ключ за 2-4 недели в зависимости от количества точек и доступности данных. Стоимость рассчитывается индивидуально после аудита. Мы гарантируем достижение заявленных метрик (прирост маржи, снижение waste) в течение 3 месяцев после запуска.

Более 7 лет опыта в ML-решениях для HoReCa, 30+ успешных проектов. Используем open-source стэк (Python, Scikit-learn, Anthropic), что исключает вендор-лок.

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