Разработка AI-системы очереди звонков с предиктивным временем ожидания
Предиктивное время ожидания снижает abandonment rate на 20–35%: клиенты, которые знают точное время ожидания (а не «ваш звонок очень важен для нас»), с меньшей вероятностью вешают трубку.
ML-модель предсказания времени ожидания
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)
}
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)
Callback scheduling
async def offer_callback(call: IncomingCall, predicted_wait: float):
if predicted_wait > 300: # >5 минут
await call.say(
"Время ожидания превышает 5 минут. Хотите, мы перезвоним вам? Нажмите 1."
)
response = await call.listen_dtmf(timeout_sec=5)
if response == "1":
await schedule_callback(call.caller_phone, predicted_wait)
await call.say("Отлично! Мы перезвоним вам в течение {wait} минут.")
await call.hangup()
Сроки: базовое предиктивное время — 2–3 недели. Callback система + ML-модель — 4–6 недель.







