Инженерлік хаб

«Алло, кірпікке орын бар ма?»: Түскі асқа бармайтын, Алматы сұлулық салондарына арналған дауыстық AI-әкімші

15.09.2026
Шарафутдинов Р.

Жұма, кеш, Әл-Фараби кептелісте. Ал лидтер күйіп жатыр.

Алматыдағы бьюти-коворкингтің әдеттегі кешін елестетіңіз. Instagram-да таргет қосылған, Reels вирус болып тарауда, директ хабарламаларға толып кетті. Клиент көлік жүргізіп келе жатып, дауыстық хабарлама жазады: «Алло, сәлем! Ертең кешкі жетілер шамасында Әйгерімге кірпікке орын бар ма?»

Бұл кезде әкімші бадам сүті қосылған Flat White алуға кеткен, басқа клиентпен сөйлесіп жатыр немесе ауысым соңында шаршаған. 40 минут өтеді. Клиент көрші салонға жазылып үлгерді. 2000 ₸ тұратын лид күйіп кетті. Айлық ауқымда бұл «адами фактордың» 5 секунд ішінде жауап бере алмауы салдарынан 300–400 мың теңге жоғалту деген сөз.

Қазақстанның шағын және орта бизнесі (SMB) кіріс өтінімдерді өңдеу жылдамдығына байланысты қыруар ақша жоғалтуда. Дәл осы жерде Google Cloud пен Gemini 2.5 Flash мультимодальды қуаты іске қосылады.

Неге батырмасы бар чат-боттар — бұл кринж?

Салон иесінің ойына бірінші келетіні — Telegram немесе WhatsApp-та чат-бот жасау. Бірақ шыны керек: ешкім ақымақ автожауапбергіштермен сөйлескенді ұнатпайды. Клиент жазылғысы келгенде, ол «1 — Қызметтер, 2 — Шеберлер, 3 — Жазылу» дегенді басқысы келмейді. Оған жанды диалог керек. Егер бот контекстті түсінбесе немесе күнді YYYY-MM-DD форматында енгізуді талап етсе, конверсия құлдырайды.

Бізге эмпатиясы бар, сыпайы әкімші сияқты әрекет ететін бот керек болды. Сленгті түсінетін («ноготочки», «реснички»), дауыстық хабарламаларды лезде танитын және шеберлердің кестесіне тікелей қол жеткізе алатын бот.

Архитектура: Serverless AI-Әкімші

Біз ауыр серверлерсіз, виртуалды машиналарсыз немесе бос тұрған қуаттар үшін абоненттік төлемсіз архитектура жасадық. Негізінде тек кіріс хабарлама келген кезде ғана оянатын Cloud Run және аудионы өңдеп (Speech-to-Text), бір промпт ішінде пайымдай (Reasoning) алатын Gemini 2.5 Flash жатыр.

Сәулет сұлбасы / Деректер ағыны (ASCII)
┌─────────┐   (1) Аудио     ┌──────────────┐   (2) Стрим Flash-қа  ┌─────────────────────┐
│ Client  │ ══════════════> │  Cloud Run   │ ════════════════════> │ Gemini 2.5 Flash    │
│ (WA/IG) │ <══════════════ │ (FastAPI)    │ <════════════════════ │ (Live Audio/Speech) │
└─────────┘   (5) Жауап     └──────┬───────┘   (3) JSON Intent     └─────────────────────┘
                                   │
                              (4) Check / Book
                                   V
                            ┌─────────────────────┐
                            │ Google Calendar API │
                            └─────────────────────┘

Деректер ағынының тізбегі:

  1. Клиент WhatsApp-қа дауыстық немесе мәтіндік хабарлама жібереді. Webhook біздің Cloud Run сервисімізге ұшады.
  2. Cloud Run OGG/AAC бинарлық файлын алып, оны тікелей Gemini 2.5 Flash-ке береді (үшінші тарап транскрибаторларынсыз!).
  3. LLM мыналарды шығарып алады: Қызмет, Шебер, Күн және Уақыт. Қатаң JSON қайтарады (Function Calling).
  4. Сервис шебердің Google Calendar API-ін тартады. Егер уақыт бос болмаса, Gemini сыпайы бас тартуды генерациялап, жақын арадағы бос орындарды ұсынады. Егер бос болса — Event қояды.
  5. Клиент жауапты мәтінмен (немесе қалауы бойынша TTS арқылы генерацияланған аудиомен) алады.

Код: FastAPI-да AI-қозғалтқышты көтеру

Сервисіміздің өзегіне назар аударайық. Төмендегі код кіріс вебхуктерді өңдеуге арналған жұмыс референсі болып табылады. Production-нұсқасында ол Meta/WhatsApp қолтаңбаларын тексерумен, ретрайлармен және логгингпен толықтырылады.

import os
import json
from fastapi import FastAPI, Request
from google import genai
from google.genai import types
from google.oauth2 import service_account
from googleapiclient.discovery import build
from datetime import datetime, timedelta

app = FastAPI()

# Gemini 2.5 Flash инициализациясы
client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))

# Google Calendar API инициализациясы (Service Account бапталған деп есептейміз)
creds = service_account.Credentials.from_service_account_file('gcp-calendar-sa.json', scopes=['https://www.googleapis.com/auth/calendar'])
calendar_service = build('calendar', 'v3', credentials=creds)
CALENDAR_ID = os.environ.get("CALENDAR_ID", "primary")

def check_availability(start_time_iso, end_time_iso):
    """Календарьдағы слотың бос екенін тексереді (p95 latency ~150ms)."""
    events_result = calendar_service.events().list(
        calendarId=CALENDAR_ID, timeMin=start_time_iso, timeMax=end_time_iso,
        singleEvents=True, orderBy='startTime'
    ).execute()
    return len(events_result.get('items', [])) == 0

def book_appointment(client_name, service_name, start_time_iso, end_time_iso):
    """Слотты брондайды."""
    event = {
        'summary': f"{service_name} - {client_name}",
        'start': {'dateTime': start_time_iso, 'timeZone': 'Asia/Almaty'},
        'end': {'dateTime': end_time_iso, 'timeZone': 'Asia/Almaty'},
    }
    calendar_service.events().insert(calendarId=CALENDAR_ID, body=event).execute()

@app.post("/webhook/whatsapp")
async def handle_whatsapp_message(request: Request):
    payload = await request.json()
    message = payload.get("message", "")
    
    # Gemini 2.5 Flash үшін промпт. Қатаң формат үшін System Instructions қолданамыз
    prompt = f"""
    Сен - Алматыдағы сұлулық салонының сыпайы әкімшісісің.
    Бүгінгі күн: {datetime.now().strftime("%Y-%m-%d %H:%M")}.
    Клиенттің хабарламасы: "{message}"
    Ниетті анықта. Егер клиент жазылғысы келсе, JSON қайтар:
    {{"intent": "book", "service": "қызмет", "time_start": "ISO-8601"}}
    """
    
    response = client.models.generate_content(
        model='gemini-2.5-flash',
        contents=prompt,
        config=types.GenerateContentConfig(
            response_mime_type="application/json",
            temperature=0.1
        )
    )
    
    data = json.loads(response.text)
    
    if data.get("intent") == "book":
        # Брондау логикасы
        start_time = data["time_start"]
        end_time = (datetime.fromisoformat(start_time) + timedelta(hours=1)).isoformat()
        
        is_free = check_availability(start_time, end_time)
        if is_free:
            book_appointment("WA-дан келген клиент", data["service"], start_time, end_time)
            return {"reply": f"Керемет! Сізді {data['service']} қызметіне {start_time} уақытына жаздым. Күтеміз!"}
        else:
            return {"reply": "Өкінішке орай, бұл уақыт бос емес. Басқа уақытты ұсынайын ба?"}
            
    return {"reply": "Мен сізді толық түсінбедім, аға әкімшіге қосамын!"}

GitHub-тағы кодты көру (OZAT-kz)

Бұл сиқырды өрістету үшін біз Terraform қолданамыз. Бір команда, және Cloud Run қажетті рұқсаттармен көтеріледі. Токендерді сақтау үшін біз Secret Manager қолданатынымызға назар аударыңыз.

resource "google_cloud_run_v2_service" "ai_admin" {
  name     = "ai-salon-admin"
  location = "europe-west4"
  ingress  = "INGRESS_TRAFFIC_ALL"

  template {
    containers {
      image = "eu.gcr.io/my-project/ai-salon-admin:latest"
      
      env {
        name = "GEMINI_API_KEY"
        value_source {
          secret_key_ref {
            secret  = google_secret_manager_secret.gemini_key.secret_id
            version = "latest"
          }
        }
      }
      
      resources {
        limits = {
          cpu    = "1000m"
          memory = "512Mi"
        }
      }
    }
    
    # Шағын бизнес үшін Scale to zero - бұл мастхэв!
    scaling {
      min_instance_count = 0
      max_instance_count = 5
    }
  }
}

GitHub-тағы кодты көру (OZAT-kz)

Метрикалар, FinOps және шағын бизнеске арналған шынайы ROI

Біз абстрактілі корпорацияларды алмаймыз. Астанадағы локалды салон үшін экономиканы есептеп көрейік (5 шебер, күніне 40-50 жазылу). Трафик: күніне ~150 хабарлама (мәтін + аудио).

  • Google Cloud Run: айына ~4,500 сұраныс. Бұл Free Tier (айына 2 миллион сұраныс тегін лимиті) ішінде. Құны: $0.
  • Gemini 2.5 Flash API: Мәтін мен қысқа аудиохабарламаларды өңдеу. 1 млн кіріс токеніне $0.075 бағасымен, айлық инференс шамамен $0.5 (шамамен 250 ₸) болады.
  • Google Calendar API: Тегін.

Енгізу экономикасы: Cloud Run vs Менеджер (мың ₸ / ай)

БАРЛЫҒЫ (TCO): Инфраструктура бизнес иесіне бір кесе капучинодан да арзанға түседі (айына 300 ₸-ден аз!).
ROI: Қашықтан жұмыс істейтін әкімшінің немесе Direct менеджерінің жалақысы 150 000-нан 250 000 ₸-ге дейін. Автоматтандыру тек лидтердің жоғалуынан сақтандырып қана қоймай (~100 000 ₸ жіберіп алған пайданы сақтай отырып), жаңа адамдарды жалдамай-ақ жарнаманы масштабтауға мүмкіндік береді.

Шешімнің өнімділігі де жоғары деңгейде. Кешігу перцентильдері (мәтінге $p50$ ~1.2 секунд, аудио + календарь API үшін $p95$ ~2.5 секунд). Клиент жауапты лезде алады.

Шешімнің шынайы шектеулері мен компромисстері

  • WhatsApp-пен интеграция: Ресми WhatsApp Business API ақылы (Meta диалогтар үшін ақы алады). Төлемеу үшін Скауттар көбінесе "сұр" Node.js кітапханаларын (Baileys), бұл нөмірдің бұғатталу қаупін тудырады.
  • Уақытпен галлюцинациялар: LLM салыстырмалы күндерде («бүрсігүні», «келесі сейсенбіде») шатасуы мүмкін. Промптқа міндетті түрде уақыт белдеуі (Asia/Almaty) бар ағымдағы timestamp қатаң енгізілуі керек.
  • Бас тарту және ауыстыру: Егер клиент түсініксіз міңгірлесе, ботқа аудио арқылы бас тарту контекстін сенімді түсінуді үйрету қиын. Күрделі жағдайларды тірі адамға ауыстырған дұрыс (Handoff).

OZAT Скауттарына арналған бұрыш: Бұны бизнеске қалай сатуға болады

Мұнда OZAT Скауттар Академиясының басты құндылығы жатыр. Сіз «GCP бұлтты инфрақұрылымын» сатпайсыз — бұл сөздер шағын бизнесті қорқытады. Сіз ауырсынудың дайын шешімін сатасыз.

Скаут салонға келіп, ботқа аудио жібереді: «Мені ертең түскі асқа жазып қойшы», және бизнес иесінің экранында Google Календарьда бронь өздігінен пайда болады. Вау-эффект кепілдендірілген. Қазақстанда мұндай ботты «кілтпен» енгізудің орташа чегі 250 000-нан 400 000 ₸-ге дейін жетеді, сонымен қатар саппорт үшін ай сайынғы 15 000 ₸ абоненттік төлем бар (GCP шығындары 300 теңге болғанда).

ЖИ-ді SMB-сектордың күнделікті процестеріне енгізе отырып, инженерлер үлкен нарыққа ие болады, ал бизнес — нақты үнемдеуге қол жеткізеді.

💡 ОЗАТ кеңесі: Енгізуге дайынсыз ба? Архитектура мен бюджетті Scope Builder арқылы есептеңіз немесе тегін ЖИ-аудиттен өтіңіз.

Рустам Шарафутдинов

Рустам Шарафутдинов

Инженерлік хаб авторы

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

Сараптама: GCP, Kubernetes, Микросервистер, React, Node.js

Пікірлер (0)