Разработка AI-системы распознавания намерения звонящего в IVR

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1564 услуг
Разработка AI-системы распознавания намерения звонящего в IVR
Средний
~5 дней
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1360
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929

Проблема: классификация намерения в первые секунды звонка

Клиент звонит в техподдержку и говорит «счёт за интернет пришёл». Традиционное 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

  1. Анализ логов текущей IVR — сбор типовых запросов, выделение категорий (1-2 дня).
  2. Проектирование таксономии — совместно с вашими экспертами (1-2 дня).
  3. Разработка классификатора — настройка LLM, embeddings, кларификации (1-2 недели).
  4. Интеграция с IVR-платформой — через REST API или WebSocket (1-2 недели).
  5. Нагрузочное тестирование — проверка latency p99 и точности на боевых данных (3-5 дней).
  6. Запуск в пилотном режиме — параллельная работа с мониторингом (1-2 недели).

Что входит в работу

  • Модель классификации — обученная на ваших данных, с документацией по таксономии.
  • API-сервис — обёртка для вызова из IVR, включая обработку ошибок.
  • Тестовый набор — размеченные звонки для верификации точности.
  • Инструкция по поддержке — добавление новых категорий, обновление модели.
  • Обучение операторов — как реагировать на переводы от AI-классификатора.

Сроки и стоимость

Базовый классификатор и тестирование — 2-3 недели. Полная интеграция с IVR-платформой, обучение модели на ваших данных и настройка сценариев — 4-6 недель. Стоимость рассчитывается индивидуально — оценим ваш проект после знакомства с спецификой.

Гарантируем точность >90% на этапе тестирования. Сокращение затрат на колл-центр до 40% за счёт снижения нагрузки на операторов. Экономия бюджета на маршрутизацию вызовов достигает 30%. Наш опыт — более 5 лет в AI-решениях для голосовых интерфейсов.

Свяжитесь с нами, чтобы обсудить архитектуру вашего AI-IVR. Проведём аудит текущей системы и предложим план внедрения. Закажите пилотный проект — протестируем классификатор на ваших логах за 2 недели.

Распознавание и синтез речи: ASR, TTS, клонирование голоса

Заказчик приходит с задачей: транскрибировать 40 000 часов колл-центра за неделю. Штатный облачный ASR (Google Speech-to-Text) выдаёт WER 28% на отраслевой лексике и стоит ощутимо дорого при таких объёмах. Задача — снизить WER ниже 10% и перейти на self-hosted инференс.

Типовые проблемы, с которыми приходят

WER не сходится к нужной метрике. Чаще всего виновата не архитектура, а данные: шумные аудио без нормализации уровня (-23 LUFS вместо стандарта), смешанные языки в одном канале, акцент, специфическая доменная лексика. Whisper large-v3 из коробки даёт WER 8–12% на чистом русском и проваливается до 25–35% на записях с PSTN-артефактами и узкополосным кодеком G.711.

Диаризация ломается при больше двух спикеров. pyannote/speaker-diarization-3.1 работает стабильно при 2–3 говорящих, но DER (Diarization Error Rate) растёт с 6% до 18–22% при 5+ участниках конференции. Проблема усугубляется перекрёстными репликами: по умолчанию min_duration_on=0.1 срезает короткие вставки.

Клонирование голоса — латентность или качество. XTTS v2 (Coqui) даёт натуральный голос, но при потоковой генерации stream_chunk_size=20 первый аудиочанк прилетает через 1.4–2.0 с — неприемлемо для интерактивных сценариев. StyleTTS2 и Kokoro быстрее, но требуют точной подготовки референсного аудио.

Как это решается на практике

Базовый стек для production-пайплайна:

  • ASR: openai/whisper-large-v3 или faster-whisper (CTranslate2-бэкенд, x4 скорость vs оригинал)
  • Диаризация: pyannote.audio 3.x + интеграция через whisperx для выравнивания по словам
  • TTS: XTTS v2 для качества, Edge-TTS или Silero для низкой латентности
  • Клонирование: XTTS v2 (3–6 с референсного аудио) или OpenVoice v2

Типичный пайплайн для колл-центра выглядит так: аудио из очереди Kafka → нормализация ffmpeg -af loudnorm до -23 LUFS → faster-whisper с beam_size=5, vad_filter=Truepyannote диаризация → постпроцессинг (пунктуация через deepmultilingualpunctuation) → запись в PostgreSQL с временными метками.

Кейс из практики. Финтех-компания с 12 000 звонков/день. Исходный WER на русском с банковской лексикой — 22% (Google STT). После fine-tuning whisper-medium на 200 часах размеченных записей через Hugging Face transformers + Seq2SeqTrainer с learning_rate=1e-5, warmup_steps=500 — WER упал до 7.3%. Инференс на одной A10G через faster-whisper с compute_type=float16 обрабатывает 40-минутный звонок за 55 секунд. Итоговая стоимость инференса — $0.0008/мин против $0.016/мин у облачного провайдера.

Дообучение Whisper на доменных данных

Когда общая модель не справляется, fine-tuning — первый инструмент. Минимальный датасет для заметного улучшения — 20–30 часов размеченного аудио в целевом домене. Разметку можно получить через итеративный процесс: прогнать через базовую модель → вручную исправить 10–15% ошибок → переобучить → повторить.

training_args = Seq2SeqTrainingArguments(
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=5000,
    fp16=True,
    predict_with_generate=True,
    generation_max_length=225,
)

Важно: при fine-tuning Whisper нужно замораживать encoder первые 1000 шагов (model.freeze_encoder()), иначе акустические признаки разъедутся раньше, чем decoder адаптируется к новой лексике.

Синтез речи: выбор под задачу

Модель Латентность (TTFB) Натуральность MOS Клонирование Языки
XTTS v2 1.2–2.0 с 4.1–4.3 Да, 3 с референса 17
StyleTTS2 0.3–0.6 с 4.0–4.2 Да, требует адаптации en, + fine-tune
Kokoro-82M 0.08–0.15 с 3.7–3.9 Нет en, ja
Silero TTS 0.05–0.1 с 3.4–3.6 Нет ru, en, de, и др.
Edge-TTS ~0.4 с (cloud) 4.0 Нет 100+

Для интерактивных ботов с требованием TTFB < 300 мс — Silero или Kokoro. Для озвучки контента, где важна натуральность — XTTS v2 с потоковой отдачей через WebSocket.

Процесс работы

Начинаем с аудит-сессии: берём 2–4 часа ваших записей, прогоняем через несколько моделей, замеряем WER/CER, смотрим на распределение ошибок по типам (лексические, акустические, язык). Это занимает 1–2 дня и сразу показывает, нужен ли fine-tuning или достаточно пост-обработки.

Далее — выбор архитектуры под ваш throughput: один GPU для 1000 мин/день или кластер с балансировщиком для 100 000+ мин/день. Деплой через Docker-контейнер с FastAPI или Triton Inference Server для батчированного инференса.

Сроки зависят от сложности: базовая интеграция готовой модели — 1–2 недели. Fine-tuning с подготовкой данных и валидацией — 4–8 недель. Полная разработка голосового пайплайна (ASR + диаризация + TTS + мониторинг) — 2–4 месяца.