«Кофе тұнбасымен бал ашу vs BigQuery ML»: Кофехана круассандарды тастауды тоқтатып, сұранысты қалай болжай алады
Панфилов көшесіндегі таң. Таң атқаннан бері жаңбыр жауып тұр. Бариста витринада жатқан 40 жап-жаңа, қытырлақ круассанға шарасыздықпен қарайды. Ол қазірдің өзінде біледі: бүгін ең көбі 15-ін ғана сатып алады. Қалған 25-і кешке қоқысқа кетеді (немесе тағылымдамадан өтушілерге таратылады). Ал екі күннен кейін, күн шығып, терраса қонақтарға толған кезде, круассандар сағат 11:30-да таусылып, қонақтар бәсекелестерге кетіп қалады. Таныс жағдай ма? Қоғамдық тамақтандыру саласында мұны «кофе тұнбасымен бал ашу» деп атайды. Ал біз мұны BigQuery ML көмегімен емделетін инженерлік сәтсіздік деп атаймыз.
Нақты инженерлік және бизнес-проблема қандай болды?
Horeca саласындағы шағын бизнес (әсіресе Алматы мен Астанадағы кофеханалар мен наубайханалар) қатаң маржиналдық диета жағдайында өмір сүреді. Круассанның фудкосты (өзіндік құны) — шамамен 30-35%. Бірақ оған есептен шығаруды (Food Waste) қоссаңыз, сатылған пісірілген өнімнің нақты өзіндік құны ғарышқа ұшып кетеді.
Иелері қылдай үстінде тепе-теңдікті сақтауға тырысады:
- Артық тапсырыс (Overstock): Есептен шығаруға әкеледі. 10 круассанды есептен шығарсаңыз — сатылған 30 круассанның пайдасын жойдыңыз.
- Тапсырыстың жетіспеуі (Stockout): Қонақ кофе мен нан-тоқаш өнімдерін алуға келді, бірақ олар жоқ. Қонақ ренжіді, орташа чек төмендейді, клиенттің LTV (Lifetime Value) нөлге ұмтылады. Сіз тек круассан үшін 1500 теңге ғана емес, клиенттің таңғы ритуалын да жоғалтасыз.
Классикалық тәсіл: менеджер немесе аға бариста Excel-ді (ең жақсы жағдайда) немесе дәптерді (ең нашар жағдайда) ашып, өзінің «алтыншы сезіміне» сүйене отырып, ертеңге тапсырыс жазады. Бірақ адам миы көп өлшемді уақыт қатарларын жақсы қабылдай алмайды. Ол өткен сейсенбіде мереке болғанын, ал осы бейсенбіде ауа райы бұзылатынын ұмытып кетеді. Нәтижесінде — тапсырыстардағы хаос.
Неліктен қарапайым шешім (Moving Average және Excel) жұмыс істемеді?
Көмек сұраған инженердің алғашқы ойы: «Жай ғана соңғы 7 күндегі сырғымалы орташа мәнді (Moving Average) алайық». Біз бірінші кезеңде солай істедік. Және бұл үлкен сәтсіздікке ұшырады.
Неліктен қарапайым эвристикалар ритейл мен Horeca үшін жұмыс істемейді:
- Айқын маусымдылық. Апта ішіндегі сұраныстың өз паттерндері бар (сейсенбі — өлі күн, сенбі — ең жоғары шек).
- Мерекелер. Наурыз, 8 наурыз, ұзақ демалыс күндері статистиканы бұзады. Қарапайым орташа мән ертең мереке екенін білмейді.
- Каннибализация. Егер сіз мәзірге «Синнабон» қоссаңыз, круассан сатылымы төмендейді.
Мұнда толыққанды MLOps стегін (Jupyter, Python, Scikit-learn, Airflow, инференс үшін Kubernetes) тарту — шағын бизнес үшін архитектуралық суицид. Мұндай кластерді қолдау құны (TCO) айына $500-дан басталады. Айналымы 5-7 млн теңге болатын бір кофехана үшін — бұл тиімсіз.
Бізге инфрақұрылымды көтермей-ақ, тек SQL-ді пайдаланып, деректер жатқан жерде машиналық оқыту модельдерін оқытуға мүмкіндік беретін құрал қажет болды. Міне, осы кезде сахнаға BigQuery ML шығады.
Шешім архитектурасы: Кассадан болжамға дейін
Күрделі дата-пайплайндардың орнына біз талғампаз және іс жүзінде тегін Serverless архитектурасын құрдық. Кассалық жүйеден (мысалы, iiko немесе Poster) деректер күн сайын түнде BigQuery-ге құйылады. Ол жерде машиналық оқыту моделі де жұмыс істейді.
┌──────────────┐ ┌───────────────┐ ┌───────────────────┐ ┌──────────────────┐
│ POS (iiko) │ ──> │ Cloud Run │ ──> │ BigQuery │ ──> │ BigQuery ML │
│ Webhooks/API │ │ Data Ingestion│ │ Staging & Storage │ │ (ARIMA_PLUS) │
└──────────────┘ └───────────────┘ └───────────────────┘ └──────────────────┘
│
▼
┌──────────────────┐
│ Telegram Bot │
│(Таңғы есеп беру) │
└──────────────────┘1-сурет. Сұранысты болжаудың серверсіз пайплайны
Логиканың негізінде ARIMA_PLUS жатыр — бұл арнайы уақыт қатарларын болжау (Time-Series Forecasting) үшін жасалған BigQuery ML-дегі кірістірілген алгоритм. Классикалық ARIMA-дан айырмашылығы, Google нұсқасы аномалияларды, секірістерді, демалыс күндерінің әсерін және маусымдылықты автоматты түрде өңдейді. Гиперпараметрлерді баптау үшін сізге Data Scientist болудың қажеті жоқ — BQ ML мұны өздігінен жасайды (AutoML).
Кодты көрейік. Алдымен біз сатылымдарды күндер бойынша біріктіре отырып, деректер витринасын (Data Mart) жинаймыз. Содан кейін — модельді бір ғана SQL сұрауымен оқытамыз.
-- Машиналық оқыту моделін тікелей деректер базасында жасаймыз
CREATE OR REPLACE MODEL `ozatkz-project.coffee_shop.bakery_demand_model`
OPTIONS(
model_type='ARIMA_PLUS',
time_series_timestamp_col='sales_date',
time_series_data_col='quantity_sold',
time_series_id_col='product_id', -- Барлық нан-тоқаш өнімдері үшін бірден оқытамыз!
data_frequency='DAILY',
auto_arima=TRUE,
holiday_region='KZ' -- Қазақстандық мерекелерді автоматты түрде ескереміз
) AS
SELECT
DATE(transaction_timestamp) AS sales_date,
product_id,
SUM(quantity) AS quantity_sold
FROM
`ozatkz-project.coffee_shop.pos_transactions`
WHERE
category = 'Bakery'
AND transaction_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 365 DAY)
GROUP BY
sales_date, product_id;GitHub-тағы кодты көру (OZAT-kz)
holiday_region='KZ' параметріне назар аударыңыз. Google Cloud бізде қашан Наурыз немесе Тәуелсіздік күні екенін өзі біледі және демалыс күндерін ескере отырып, болжамды түзетеді! time_series_id_col арқасында модель ондаған SKU (круассандар мен маффиндер) үшін параллельді түрде оқытылады.
Енді модель оқытылғаннан кейін (біз бұл оқытуды аптасына бір рет түнде іске қосу үшін Scheduled Query баптадық), бас баристаға жіберу үшін ертеңгі күнге болжам алуымыз керек:
-- Келесі 3 күнге болжам аламыз
SELECT
product_id,
CAST(forecast_timestamp AS DATE) AS target_date,
ROUND(forecast_value) AS predicted_quantity,
ROUND(prediction_interval_lower_bound) AS min_expected,
ROUND(prediction_interval_upper_bound) AS max_expected
FROM
ML.FORECAST(
MODEL `ozatkz-project.coffee_shop.bakery_demand_model`,
STRUCT(3 AS horizon, 0.9 AS confidence_level)
)
WHERE
CAST(forecast_timestamp AS DATE) = DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY);GitHub-тағы кодты көру (OZAT-kz)
Нәтижесінде менеджер Telegram-да хабарлама алады: «Ертеңге 24 бадам круассанына тапсырыс беріңіз. Күтілетін сатылым диапазоны (90% ықтималдықпен): 21-ден 28 данаға дейін». Бұл енді интуиция емес, бұл бизнесті Data-Driven басқару.
Нақты не өлшенді: Метрикалар және FinOps
Production-режимінде бір ай жұмыс істегеннен кейін біз метрикаларды алдық. Нәтижелер күткеннен асып түсті:
- Есептен шығарудың төмендеуі (Food Waste): 74%-ға төмендеді. Егер бұрын кофехана айына 180 000 ₸ нан-тоқаш өнімдерін есептен шығарса, қазір бұл сома 45 000 ₸-ге дейін қысқарды.
- Жоғалған табыс (Out-of-Stock): Тауардың қолжетімділік деңгейі (Availability) 82%-дан 96%-ға дейін өсті. Біз таңғы қонақтарды жоғалтуды тоқтаттық.
Нан-тоқаштан ай сайынғы қаржылық шығындар (мың ₸)
Ал енді ең қызықтысы — FinOps (Иелену құны). Кофеханаға ЖИ енгізу қанша тұрады?
BigQuery өңделген байттар үшін тарифтелетіндіктен, ал кофехананың бір жылдағы деректері 50 Мегабайттан аспайтындықтан, ARIMA_PLUS моделін оқыту ай сайынғы Free Tier (1 Терабайт сұраныс тегін) ішіне кіреді.
Бұлтты инфрақұрылымға (вебхуктерге арналған Cloud Run + BigQuery) жұмсалған жалпы шығын айына $0.00 құрады. Біз серверлерге бір цент жұмсамай, бизнеске жылына миллионнан астам теңге үнемдедік. Міне, сондықтан біз OZAT-та Serverless-ті қатты жақсы көреміз!
Шешімнің шынайы шектеулері мен компромисстері
- Суық старт проблемасы: Егер сіз жаңа десерт (мысалы, меренга рулетін) енгізсеңіз, модель оны алғашқы 2-3 аптада болжай алмайды. Паттерндерді жинау үшін уақыт қажет.
- Сыртқы маркетинг: Модель сіздің Instagram-да таргет іске қосқаныңызды немесе блогерді шақырғаныңызды білмейді. Агрессивті промо-трафик күндері болжам төмендетіледі.
- Деректердің тазалығына сезімталдық: Егер бариста есептен шығаруды ұмытып кетсе немесе «Шие қосылған қатпарлы нан» орнына «Круассан» деп соқса, модель осы қоқысты үйреніп, қате болжам береді (Garbage In - Garbage Out). Кассалық тәртіп қатаң сақталуы керек.
Предиктивті аналитиканы енгізу енді тек R&D бөлімдері бар корпорациялардың ғана еншісінде емес. Бүгінде кез келген Instagram сатушысы, жергілікті кофехана немесе ТҚС (СТО) архитектураны дұрыс құра білсе, Enterprise деңгейіндегі құралдарды өте арзан (немесе тегін) пайдалана алады. Мұндай рычаг нүктелерін табу — бұл біздің Скауттар Академиясында үйрететін нәрсе.
Ақшаны қоқысқа тастауды тоқтату үшін сізге дата-орталық қажет емес. Сізге сауатты SQL және аздаған инженерлік парасат қажет.
💡 ОЗАТ кеңесі: Енгізуге дайынсыз ба? Архитектура мен бюджетті Scope Builder арқылы есептеңіз немесе тегін ЖИ-аудиттен өтіңіз.

Рустам Шарафутдинов
Google Cloud архитектурасы саласындағы сарапшы және 15 жылдан астам тәжірибесі бар Senior Full-Stack әзірлеушісі. Ақауға төзімді архитектураларға, жоғары жүктемелі жобаларды оңтайландыруға және AI (Vertex AI) интеграциясына маманданған.