Реалізація голосового 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 місяці.







