Розробка AI-системи черги дзвінків з предиктивним часом очікування
Оператори перевантажені, клієнти роздратовані, а бізнес втрачає до 30% вхідного трафіку. Стандартний IVR з «ваш дзвінок дуже важливий» лише збільшує abandonment rate — втрати дзвінків досягають 30% при очікуванні більше хвилини. Наш підхід на основі машинного навчання вирішує цю проблему: модель у реальному часі прогнозує точний час очікування та адаптує IVR-повідомлення для кожного абонента. Результат — скорочення втрачених дзвінків на 20–35% та зростання задоволеності клієнтів. За даними дослідження Forbes, компанії, які впровадили AI в кол-центри, знижують операційні витрати на 30%. Економія для середнього кол-центру становить від 2 000 000 до 5 000 000 грн на рік за рахунок зниження відтоку. Ми гарантуємо точність прогнозу ±15% при стабільному навантаженні, що підтверджено досвідом впровадження в 20+ контакт-центрах. Компанія має 5 років досвіду та 20+ реалізованих проектів у сфері AI-телефонії. Економія становить 2–5 млн грн на рік.
Як працює ML прогнозування часу очікування?
Основу складає ансамбль градієнтного бустингу (Gradient Boosting Regressor) з 200 деревами глибиною 5. Модель навчається на дев'яти ознаках:
- довжина черги в момент дзвінка
- кількість доступних операторів
- середня тривалість розмови за останні 30 хвилин
- година та день тижня
- флаг святкового дня
- інтенсивність вхідних дзвінків за останні 10 хвилин
- кількість операторів на перерві
- середній скіл-матч скор (наскільки кваліфікація оператора відповідає запиту)
Прогноз оновлюється кожні 30 секунд і видається з довірчим інтервалом (p10, p50, p90). Для production-розгортання модель конвертується в ONNX з INT8-квантизацією — це знижує latency p99 до 5 мс і дозволяє утримувати p99 інференсу нижче 10 мс навіть при пікових навантаженнях.
import numpy as np from sklearn.ensemble import GradientBoostingRegressor from datetime import datetime class WaitTimePredictor: def __init__(self): self.model = GradientBoostingRegressor( n_estimators=200, max_depth=5, learning_rate=0.05 ) self.feature_names = [ "queue_length", "available_agents", "avg_handle_time_last_30min", "hour_of_day", "day_of_week", "is_holiday", "incoming_call_rate_last_10min", "agents_on_break", "avg_skill_match_score" ] def predict_wait_time(self, queue_state: dict) -> tuple[float, float]: """Повертає (передбачений час, стандартне відхилення)""" features = self.extract_features(queue_state) X = np.array([[features[f] for f in self.feature_names]]) predicted = self.model.predict(X)[0] # Використовуємо quantile regression для довірчого інтервалу # На практиці навчаємо три моделі: q10, q50, q90 return max(0, predicted), max(15, predicted * 0.3) def extract_features(self, state: dict) -> dict: now = datetime.now() return { "queue_length": state["queue_length"], "available_agents": state["available_agents"], "avg_handle_time_last_30min": state["avg_handle_time"], "hour_of_day": now.hour, "day_of_week": now.weekday(), "is_holiday": is_holiday(now), "incoming_call_rate_last_10min": state["call_rate"], "agents_on_break": state["agents_on_break"], "avg_skill_match_score": state.get("skill_match", 0.7) } Чому Gradient Boosting краще за нейромережу?
Gradient Boosting дає інтерпретованість та стійкість на розріджених даних. Нейромережа перенавчається при малому обсязі логів (менше 10 000 дзвінків) і потребує більше обчислювальних ресурсів. Ансамбль дерев працює ефективно вже на 1000 дзвінків на день і дозволяє легко додавати нові ознаки без перенавчання всієї моделі. На практиці ми не раз стикалися з ситуацією, коли LSTM давала приріст точності лише на 2–3% при 10-кратному збільшенні часу інференсу — такий оверхед невиправданий для real-time систем. На відміну від RAG-підходів, наша модель не потребує зовнішніх баз знань і працює без пошуку документів, що забезпечує затримку менше 10 мс. Gradient Boosting у 2–3 рази точніший за просте середнє значення. Gradient Boosting call center – найкращий вибір для реального часу.
Деталі навчання моделі
- Квантильна регресія: три окремі Gradient Boosting Regressor для p10, p50, p90.
- Функція втрат: quantile loss (pinball loss).
- Оптимізація гіперпараметрів: RandomizedSearchCV по 5-fold cross-validation.
- Донавчання: щотижня на нових даних з інкрементальним оновленням.
Які дані потрібні для навчання моделі?
Ключовий джерело — логи АТС з часовими мітками та статусами дзвінків. Додатково підвантажуємо календар свят і розклад перерв операторів. Оптимальний обсяг — від трьох місяців історії при навантаженні від 1000 дзвінків на день. Якщо даних менше — використовуємо transfer learning з публічних датасетів або симуляцію. Згідно з документацією scikit-learn, Gradient Boosting ефективний на вибірках від 1000 зразків.
IVR-повідомлення з динамічним часом
def format_wait_time_message(wait_seconds: float, uncertainty: float) -> str: wait_minutes = int(wait_seconds / 60) uncertainty_minutes = int(uncertainty / 60) if wait_seconds < 60: return "Очікування не перевищить однієї хвилини." elif uncertainty_minutes <= 1: return f"Ваш орієнтовний час очікування — {wait_minutes} хвилин." else: lower = max(1, wait_minutes - uncertainty_minutes) upper = wait_minutes + uncertainty_minutes return f"Очікування займе від {lower} до {upper} хвилин." async def update_queue_announcement(queue_id: str, predictor: WaitTimePredictor): """Оновлюємо повідомлення в черзі кожні 30 секунд""" while True: state = await get_queue_state(queue_id) wait_time, uncertainty = predictor.predict_wait_time(state) message = format_wait_time_message(wait_time, uncertainty) # Опціональний callback if wait_time > 300: # > 5 хвилин message += " Хочете, ми передзвонимо вам, як тільки звільниться оператор?" await telephony.update_queue_message(queue_id, message) await asyncio.sleep(30) Порівняння підходів до прогнозування часу очікування
| Модель | Точність (MAPE) | Час інференсу | Мінімальний обсяг даних | Інтерпретованість |
|---|---|---|---|---|
| Gradient Boosting | 12–15% | <10 мс | 1 000 дзвінків | Висока (важливість ознак) |
| LSTM | 9–12% | 50–100 мс | 50 000 дзвінків | Низька (чорний ящик) |
| Просте середнє | 30–40% | <1 мс | будь-який | Висока |
Gradient Boosting дає оптимальний баланс точності, швидкості та вимог до даних. Для більшості контакт-центрів це найкращий вибір.
Порівняння: предиктивна черга проти FIFO
| Параметр | FIFO-черга | Предиктивна черга (AI) |
|---|---|---|
| abandonment rate | 25–35% | 10–18% |
| точність прогнозу | відсутня | ±15% (p50) |
| час реакції на зміни | ручне налаштування | адаптація за 30 сек |
| можливість callback | ні | автоматичний при очікуванні >5 хв |
| складність впровадження | мінімальна | 4–6 тижнів під ключ |
Предиктивна черга знижує відтік дзвінків приблизно в 2 рази в порівнянні з FIFO.
Склад робіт (що входить у вартість)
- Аудит поточної телефонії та збір логів для навчання
- Розробка пайплайну ознак та навчання моделі (Gradient Boosting + квантильна регресія)
- Інтеграція з IVR та CRM через REST API
- Налаштування callback-сервісу (автоматичний дозвон при звільненні оператора) – механізм callback scheduling (планування зворотних дзвінків)
- Документація моделі та навчання адміністраторів
- Підтримка протягом 30 днів після запуску
Доставка: повна документація, навчання персоналу, 30-денна підтримка.
Процес і строки
- Аналітика та збір даних — 1 тиждень
- Проектування ознак та навчання MVP — 1–2 тижні
- Інтеграція в продуктив — 1–2 тижні
- Тестування та оптимізація — 1 тиждень
- Деплой та передача документації — 1 тиждень
Орієнтовні строки: від 4 до 6 тижнів під ключ. Вартість проекту під ключ — від 150 000 грн (орієнтовно). Зв'яжіться з нами — оцінимо ваш проект безкоштовно та запропонуємо рішення.
Отримайте консультацію: пишіть на пошту або в месенджери — підберемо оптимальну конфігурацію під ваше навантаження.
Наша система інтелектуальної маршрутизації дзвінків (intelligent call routing) базується на моделі прогнозування часу очікування (predictive wait time model) і застосовується в ML контакт-центр, де машинне навчання call center підвищує ефективність. AI черга дзвінків дозволяє досягти abandonment rate зниження на 20–35%.







