Реалізація голосового AI-бота для call-центру
Голосовий бот для колл-центру — це не проста заміна IVR, а повноцінний AI-асистент на базі LLM. Ми неодноразово стикалися з ситуацією: клієнти впроваджували дешеві мовленнєві роботи і отримували Containment Rate на рівні 20–30%. Користувачі дратувалися і вимагали оператора. Наш підхід: fine-tuning мовної моделі на вашій базі діалогів + дворівнева ескалація. Containment Rate >60% — типовий результат через 4 тижні після деплою. Наша команда має 10+ років досвіду в NLP та MLOps, реалізувала 50+ голосових ботів для call-центрів. Економія на операторах може бути значною.
Як голосовий AI-бот вирішує проблему завантаження операторів?
Стандартний call-центр витрачає 60% часу операторів на типові запити: статус замовлення, зміна адреси, запис на послугу. Голосовий бот розвантажує їх на 70–80% за цими категоріями. У нас є досвід інтеграції з Bitrix24, amoCRM та Salesforce: бот підтягує дані клієнта за номером телефону, виконує сценарій і при необхідності ескалює з повним контекстом. Containment Rate >60% краще звичайного IVR у 2–3 рази.
Типові сценарії та покриття
| Сценарій | Частка дзвінків | Автоматизація |
|---|---|---|
| Статус замовлення | 30–40% | 95% |
| Зміна адреси | 10–15% | 80% |
| FAQ по продукту | 15–20% | 85% |
| Скарги | 5–10% | 30% (далі оператор) |
| Запис/скасування | 10–15% | 90% |
Приклад розрахунку окупності
Економія залежить від обсягу дзвінків та рівня автоматизації.Архітектура бота для call-центру
from enum import Enum from dataclasses import dataclass class DialogState(Enum): GREETING = "greeting" INTENT_RECOGNITION = "intent_recognition" COLLECTING_DATA = "collecting_data" PROCESSING = "processing" CONFIRMATION = "confirmation" TRANSFER_TO_AGENT = "transfer_to_agent" FAREWELL = "farewell" @dataclass class CallSession: call_id: str phone_number: str state: DialogState = DialogState.GREETING intent: str = None collected: dict = None retry_count: int = 0 max_retries: int = 3 def should_transfer(self) -> bool: return (self.retry_count >= self.max_retries or self.intent in ["complaint", "complex_issue"]) Перший рівень ескалації — повторний запит з тим же наміром, другий — переклад оператору з повною історією діалогу.
Intent recognition з прикладами
async def recognize_intent(user_text: str) -> dict: response = await client.chat.completions.create( model="gpt-4o-mini", messages=[{ "role": "system", "content": """Визнач намір клієнта. Поверни JSON: {"intent": "order_status|change_address|cancel_order|complaint|other", "entities": {"order_id": "...", "address": "..."}}""" }, { "role": "user", "content": user_text }], response_format={"type": "json_object"} ) return json.loads(response.choices[0].message.content) Умови ескалації на оператора
ESCALATION_TRIGGERS = [ "оператор", "жива людина", "з'єднайте з людиною", "не розумієте", "марний", "скарга", "претензія", "поверніть гроші", "суд", "споживзахист" ] def should_escalate(text: str, session: CallSession) -> bool: text_lower = text.lower() if any(trigger in text_lower for trigger in ESCALATION_TRIGGERS): return True if session.retry_count >= 2: return True return False Інтеграція з CRM
async def lookup_customer(phone: str) -> dict | None: # Запит до CRM (Bitrix24, amoCRM, Salesforce) async with aiohttp.ClientSession() as session: resp = await session.get( f"{CRM_API_URL}/contacts/search", params={"phone": phone}, headers={"Authorization": f"Bearer {CRM_TOKEN}"} ) data = await resp.json() return data.get("contact") Чому Containment Rate — головний KPI?
Containment Rate — відсоток дзвінків, повністю оброблених ботом без перекладу на оператора. Для call-центру це пряма економія: кожен відсоток підвищення CR знижує cost per call. При CR >60% бот окупається за 4–8 місяців залежно від обсягів. Ми гарантуємо досягнення CR >60% для типових сценаріїв після калібрування моделі.
Що входить в роботу під ключ?
| Етап | Тривалість | Результат |
|---|---|---|
| Аудит діалогів | 1 тиждень | Виділення топ-5 сценаріїв |
| Fine-tuning моделі | 2–3 тижні | Модель з точністю >90% |
| Інтеграція з CRM | 1–2 тижні | Готовий API-конектор |
| Налаштування ескалації | 1 тиждень | Дворівнева схема |
| Моніторинг та навчання | 2 тижні | Дашборди та навчання операторів |
Після запуску — 3 місяці підтримки. Ми оцінимо ваш проект безкоштовно: просто зв'яжіться з нами. Отримайте консультацію по вашому сценарію — розглянемо інтеграцію, обсяг дзвінків та цільовий CR.
ASR і TTS: розпізнавання та синтез мовлення для голосового бота
Голосовий бот складається з трьох компонентів: ASR (розпізнавання мовлення), NLU (розуміння наміру), TTS (синтез відповіді). Якість кожного з них критична для підсумкової конверсії.
ASR (Automatic Speech Recognition): використовуємо Whisper large-v3 або Yandex SpeechKit залежно від вимог до latency та конфіденційності даних. Whisper дає WER менше 5% на чистій мові, Yandex — краще справляється з регіональними акцентами. Streaming-режим ASR — перший токен за 300–500 мс — знижує відчуття затримки.
TTS (Text-to-Speech): синтез відповіді займає 200–400 мс на фразу. Використовуємо SSML-розмітку для управління паузами та інтонацією: <break time="0.3s"/> перед ключовими словами підвищує сприйняту якість на 20–30%.
Зниження шуму: для вхідних дзвінків з фоновим шумом застосовуємо RNNoise (open-source) або Krisp API. Це знижує WER на зашумлених каналах з 25% до 8%.
Інтеграція ASR + TTS додає 500–800 мс до загальної latency циклу. Ми оптимізуємо кожен компонент у зв'язці, домагаючись загального часу відповіді бота менше 2 секунд.
Терміни: MVP з 3–5 сценаріями — 4–6 тижнів. Повна система з аналітикою та A/B тестами — 3–4 місяці.







