Реализация голосового AI-бота для обработки входящих обращений
Бот входящих обращений — первая линия клиентской поддержки. Самостоятельно решает типовые запросы (статус, баланс, расписание), при необходимости эскалирует с полным контекстом на оператора. Целевой Containment Rate: 60–75%.
Типология входящих обращений
| Тип | Доля | Автоматизируемость |
|---|---|---|
| Проверка статуса | 35% | 95% |
| Изменение данных | 20% | 75% |
| FAQ / информация | 25% | 90% |
| Жалобы | 10% | 20% |
| Срочные вопросы | 10% | 40% |
Мультисценарный бот
from typing import Callable
@dataclass
class DialogScenario:
name: str
triggers: list[str] # фразы для определения сценария
handler: Callable
priority: int = 0
SCENARIOS = [
DialogScenario(
name="order_status",
triggers=["заказ", "статус", "где посылка", "когда доставят"],
handler=handle_order_status_scenario,
priority=10
),
DialogScenario(
name="account_balance",
triggers=["баланс", "остаток", "сколько денег", "счёт"],
handler=handle_balance_scenario,
priority=10
),
DialogScenario(
name="technical_issue",
triggers=["не работает", "ошибка", "сломалось", "проблема"],
handler=handle_tech_support_scenario,
priority=5
),
]
async def route_to_scenario(user_text: str) -> DialogScenario:
# Используем LLM для точной маршрутизации
response = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": f"Определи сценарий из: {[s.name for s in SCENARIOS]}. JSON: {{'scenario': '...'}}"
}, {"role": "user", "content": user_text}],
response_format={"type": "json_object"}
)
scenario_name = json.loads(response.choices[0].message.content)["scenario"]
return next((s for s in SCENARIOS if s.name == scenario_name), SCENARIOS[-1])
Передача контекста оператору
async def transfer_to_agent(session: CallSession, reason: str):
"""Эскалируем с полным контекстом диалога"""
context = {
"call_id": session.call_id,
"phone": session.phone,
"customer": await lookup_customer(session.phone),
"dialog_summary": await summarize_dialog(session.history),
"intent": session.current_intent,
"escalation_reason": reason,
"timestamp": datetime.utcnow().isoformat()
}
await crm.create_case(context)
await telephony.transfer_call(session.call_id, agent_queue="support")
Уведомление оператора перед соединением
AGENT_BRIEFING_TEMPLATE = """
Переключаю клиента {phone}.
Причина обращения: {intent}.
Клиент уже сообщил: {summary}.
Не нужно спрашивать: номер заказа и имя — уже получены.
"""
Сроки: бот для одной категории обращений — 2 недели. Полноценный мультисценарный бот — 2–3 месяца.







