Разработка AI-системы распознавания намерения звонящего в IVR
Распознавание намерения в IVR — точная классификация запроса из одной-двух фраз в первые секунды звонка. Высокая точность маршрутизации (>90%) — ключевой показатель эффективности AI-IVR.
Многоуровневая классификация намерений
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)
Обработка неоднозначных намерений
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% — целевой показатель
}
Сроки: классификатор намерений + тестирование — 2–3 недели. Полная интеграция в IVR — 4–6 недель.







