Client Micromobility Startup (NDA)
Role Freelance Backend Engineer / AI Integration
Period May — Jun 2026
Stack
Go Binotel OpenAI Whisper GPT-4o-mini ElevenLabs Azure TTS Redis PostgreSQL
AI-голосовий агент — підтримка клієнтів мікромобільності preview

AI-голосовий агент — підтримка клієнтів мікромобільності

Огляд

Голосовий AI-агент для автоматизації повторюваних дзвінків до служби підтримки компанії мікромобільності, яка обробляла ~20 000 вхідних дзвінків на місяць. Реалізовано за 24 дні.

Оператори витрачали 80% часу на чотири типові сценарії: проблеми із завершенням поїздки, несправності замка, порушення червоної зони та зависання застосунку. Бот тепер обробляє всі чотири самостійно — запитує CRM у реальному часі, виконує дію та завершує дзвінок. Якщо ситуація нестандартна — плавно передає оператору з повним контекстом розмови.

Результат: ~80% дзвінків закривається без участі оператора.


Архітектура

Binotel webhook → Whisper STT (UA/RU) → GPT-4o-mini → CRM API
                                                        ↓
                              ElevenLabs (pre-recorded) / Azure TTS (real-time)
  1. Клієнт телефонує → Binotel надсилає webhook на Go-сервер
  2. Бот відтворює привітання (ElevenLabs, pre-recorded)
  3. Клієнт говорить → Whisper транскрибує (UA/RU)
  4. GPT-4o-mini визначає проблему і наступний крок через function calling
  5. Запит до CRM іде асинхронно (де транспорт, яка зона, статус поїздки)
  6. Бот виконує дію або задає уточнювальне питання
  7. Якщо вирішено — завершує дзвінок; якщо ні — передає оператору

Системна архітектура — Binotel webhook пайплайн


Сценарії дзвінків

Завершення поїздки

Схема завершення поїздки

Замок не відкривається (велосипед / самокат)

Схема несправності замка

Червона зона

Схема червоної зони

Застосунок завис

Схема зависання застосунку


Що було складно

Затримка пайплайну. STT + LLM + TTS послідовно давали 3–5 сек паузи — неприйнятно для голосового бота. Всі стандартні репліки (вітання, підтвердження, прохання уточнити) згенеровані через ElevenLabs заздалегідь і кешовані. Azure TTS — лише для динамічних відповідей. CRM-запити йдуть асинхронно поки бот ще говорить.

Стан між webhook-викликами. Binotel надсилає окремий POST на кожну подію (відповідь клієнта, DTMF, завершення дзвінка). Стан розмови зберігаємо в Redis з ключем call_id і TTL 30 хв.

Змішана мова. Клієнти вільно переходять між українською та російською — іноді в одному реченні. Whisper з явним language промптом і post-processing нормалізація числівників та кодів транспорту вирішили ~95% випадків.

LLM вигадує дії. GPT-4o-mini міг неправильно класифікувати запит або вигадати дію поза сценарієм. Перейшли на structured outputs + function calling з жорстким переліком: end_trip, restart_transport, create_ticket, transfer_to_operator. LLM вибирає зі списку — не вигадує.

Логіка замка — велосипед vs самокат. Два транспортні засоби мають різні 5–7-крокові алгоритми, де кожен крок залежить від результату попереднього. Замість монолітного промпту — окремий state machine для кожного типу; LLM лише вирішує поточний крок, а не всю логіку.

Пікове навантаження. ~30–40 одночасних дзвінків у пік. Один goroutine на дзвінок, пул воркерів для CRM-запитів з rate limiting. Деплой на VPS 4 vCPU / 8 GB RAM.

Помилкові спрацювання геозони. Геодані в CRM оновлюються із затримкою — клієнт вже повернув транспорт, але система ще показує червону зону. Повторний запит через 10 сек; якщо клієнт стверджує що він на місці і другий запит підтверджує — завершуємо поїздку і анулюємо зайві хвилини.


Архітектурні рішення

Рішення Чому
GPT-4o-mini замість GPT-4 Достатня якість для структурованих сценаріїв, вартість у 10× нижча
ElevenLabs pre-recorded + Azure TTS real-time ElevenLabs — якісний голос для фіксованих фраз (генерується один раз); Azure — для динамічних відповідей у реальному часі
Binotel webhook без власного SIP-сервера Binotel сам керує SIP-інфраструктурою; webhook API достатній для будь-якої складності IVR
Function calling замість вільного промпту Детермінована поведінка, неможливо вийти за межі дозволених дій
State machine для складних сценаріїв Передбачувана логіка, легко тестувати, LLM не тримає весь контекст сценарію

Результати

  • ~80% дзвінків закривається без участі оператора
  • Операційні витрати: ~$400–700/міс (vs. повна ставка оператора)
  • Час реакції: миттєво, без черги
  • Доставка за 24 дні
  • Покрито: 4 основні сценарії + edge cases (помилкові геозони, code-switching, нестандартні моделі телефонів)

Стек

Go · Binotel Webhook API · OpenAI Whisper · GPT-4o-mini · ElevenLabs TTS · Azure Cognitive Services TTS · Redis · PostgreSQL · VPS (Ubuntu)