Проблема: класифікація наміру в перші секунди дзвінка
Клієнт телефонує в техпідтримку і каже «рахунок за інтернет прийшов». Традиційне DTMF-меню змушує його натискати кнопки, дратуючи та втрачаючи час. Навантаження на операторів кол-центру зростає, а середній час обробки збільшується. Ми вирішуємо це завдання за допомогою AI-класифікатора намірів, який за секунди визначає мету дзвінка за природною мовою та направляє до потрібного сервісу. Точність маршрутизації >90% — ключовий показник ефективності AI-IVR. Система аналізує не окремі ключові слова, а повний контекст фрази, що дозволяє відрізнити «оплатити рахунок» від «уточнити суму». У нашій практиці впровадження такого класифікатора знизило навантаження на першу лінію підтримки на 35%. За даними Gartner, автоматизація IVR скорочує витрати кол-центру до 40%.
Як AI-класифікація підвищує точність маршрутизації?
Класична IVR використовує DTMF-меню та прості тригери за ключовими словами. AI-підхід на базі LLM та embeddings дозволяє визначити намір навіть за однією фразою з урахуванням контексту. Ми застосовуємо багаторівневу таксономію: спочатку визначаємо основну категорію (billing, technical, contract), потім уточнюємо підкатегорію та витягуємо сутності (номер рахунку, адреса).
from pydantic import BaseModel
class IntentClassification(BaseModel):
primary_intent: str # основне намір
secondary_intent: str = None # уточнення
entities: dict = {} # витягнуті сутності
confidence: float
requires_clarification: bool = False
# Таксономія намірів (приклад для телеком)
INTENT_TAXONOMY = {
"billing": {
"subcategories": ["invoice", "payment", "debt", "tariff_change"],
"examples": ["скільки я винен", "оплатити рахунок", "змінити тариф"]
},
"technical": {
"subcategories": ["no_internet", "slow_speed", "tv_issue", "router"],
"examples": ["інтернет не працює", "повільна швидкість", "телевізор"]
},
"contract": {
"subcategories": ["new_connection", "cancellation", "address_change"],
"examples": ["підключити", "розірвати договір", "переїзд"]
}
}
async def classify_caller_intent(
utterance: str,
taxonomy: dict
) -> IntentClassification:
taxonomy_description = "\n".join(
f"{cat}: {', '.join(data['examples'][:3])}"
for cat, data in taxonomy.items()
)
response = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": f"""Класифікуй намір абонента.
Категорії та приклади:
{taxonomy_description}
Поверни JSON: {{
"primary_intent": "...",
"secondary_intent": "...",
"entities": {{}},
"confidence": 0.0-1.0,
"requires_clarification": false
}}"""
}, {"role": "user", "content": utterance}],
response_format={"type": "json_object"}
)
data = json.loads(response.choices[0].message.content)
return IntentClassification(**data)
Чому багаторівнева таксономія краща за плоску?
Плоска класифікація (наприклад, 20 категорій на одному рівні) дає точність близько 75-80% через перекриття класів. Ієрархічна таксономія з поділом на основні та підпорядковані наміри підвищує точність до 90-95%. Крім того, вона дозволяє задавати уточнюючі питання лише у спірних випадках, не перевантажуючи клієнта зайвими діалогами. Для збагачення контексту ми використовуємо RAG, що особливо корисно при рідкісних запитах. Додатково застосовуємо fine-tuning базової LLM на ваших даних — це адаптує модель під специфіку бізнесу.
Обробка неоднозначних намірів
CLARIFICATION_TEMPLATES = {
"billing_vs_technical": "Уточніть — ви телефонуєте з питання оплати чи з технічного питання?",
"new_vs_existing": "Ви вже наш клієнт чи хочете підключитися?",
"internet_vs_tv": "Що саме не працює — інтернет чи телебачення?",
}
async def handle_ambiguous_intent(
call: IncomingCall,
classification: IntentClassification
) -> IntentClassification:
if not classification.requires_clarification:
return classification
# Визначаємо відповідне уточнююче питання
clarification = determine_clarification_question(
classification.primary_intent
)
await call.say(clarification)
response = await call.listen(timeout_sec=8)
return await classify_caller_intent(response, INTENT_TAXONOMY)
Тестування та моніторинг точності
async def evaluate_ivr_accuracy(test_set: list[dict]) -> dict:
"""Тестуємо класифікатор на тестовому наборі"""
correct = 0
total = len(test_set)
for test_case in test_set:
result = await classify_caller_intent(
test_case["utterance"], INTENT_TAXONOMY
)
if result.primary_intent == test_case["expected_intent"]:
correct += 1
accuracy = correct / total
return {
"accuracy": accuracy,
"correct": correct,
"total": total,
"target_met": accuracy >= 0.90 # 90% — цільовий показник
}
Порівняння підходів: плоска vs ієрархічна класифікація
| Параметр | Плоска класифікація | Ієрархічна + кларифікація |
|---|---|---|
| Точність | 75-80% | 90-95% |
| Час обробки | <0.5 сек | <1 сек |
| Необхідність кол-центру | ~30% дзвінків | <10% (лише складні кейси) |
| Адаптація до нових категорій | Перенавчання всієї моделі | Додавання підкатегорії без ретрейну |
Технологічний стек і терміни впровадження
| Компонент | Технологія | Термін розробки |
|---|---|---|
| Класифікатор намірів | GPT-4o, LLaMA 3 (fine-tuned) | 1-2 тижні |
| Векторизація та пошук | OpenAI embeddings (1536-dim), pgvector | 3-5 днів |
| Кларифікація | LangChain, шаблони на YAML | 1 тиждень |
| API-сервіс | FastAPI, Triton Inference Server | 1-2 тижні |
| Інтеграція з IVR | REST API / WebSocket | 1-2 тижні |
Типові помилки при впровадженні AI-IVR
- Занадто широка таксономія — більш ніж 15 основних категорій знижують точність. Оптимум — 5-7.
- Ігнорування сутностей — без вилучення номера замовлення або тарифу маршрутизація залишається неточною.
- Відсутність A/B-тестування — запуск без порівняльного аналізу з поточною IVR призводить до неочікуваних падінь.
- Недооцінка latency — якщо класифікація займає >2 секунд, клієнти скидають дзвінок.
Процес впровадження AI-IVR
- Аналіз логів поточної IVR — збір типових запитів, виділення категорій (1-2 дні).
- Проектування таксономії — спільно з вашими експертами (1-2 дні).
- Розробка класифікатора — налаштування LLM, embeddings, кларифікації (1-2 тижні).
- Інтеграція з IVR-платформою — через REST API або WebSocket (1-2 тижні).
- Навантажувальне тестування — перевірка latency p99 та точності на бойових даних (3-5 днів).
- Запуск у пілотному режимі — паралельна робота з моніторингом (1-2 тижні).
Що входить в роботу
- Модель класифікації — навчена на ваших даних, з документацією по таксономії.
- API-сервіс — обгортка для виклику з IVR, включаючи обробку помилок.
- Тестовий набір — розмічені дзвінки для верифікації точності.
- Інструкція з підтримки — додавання нових категорій, оновлення моделі.
- Навчання операторів — як реагувати на переводи від AI-класифікатора.
Терміни та вартість
Базовий класифікатор і тестування — 2-3 тижні. Повна інтеграція з IVR-платформою, навчання моделі на ваших даних та налаштування сценаріїв — 4-6 тижнів. Вартість розраховується індивідуально — оцінимо ваш проект після знайомства зі специфікою.
Гарантуємо точність >90% на етапі тестування. Скорочення витрат на кол-центр до 40% за рахунок зниження навантаження на операторів. Економія бюджету на маршрутизацію викликів досягає 30%. Наш досвід — більш ніж 5 років в AI-рішеннях для голосових інтерфейсів.
Зв'яжіться з нами, щоб обговорити архітектуру вашого AI-IVR. Проведемо аудит поточної системи і запропонуємо план впровадження. Замовте пілотний проект — протестуємо класифікатор на ваших логах за 2 тижні.







