Intent Detection для чат-бота: таксономия, модель, мониторинг

Чат-бот переводит на оператора там, где вопрос можно закрыть самому, — и вы теряете клиентов. Мы настраиваем определение намерений под ключ: собираем таксономию, обучаем модель и передаём регламенты сопровождения. Ложные переводы на оператора уходят, а доля самостоятельных решений растёт.
Часто задаваемые вопросы

Почему intent detection ломается на живом трафике

В пилоте распознавание намерений даёт точность под 95% на размеченном наборе в несколько сотен реплик. На живом трафике та же модель ошибается на каждой третьей фразе, и доля ручного перевода на оператора растёт с первых дней работы.

Первый источник ошибок — длинный хвост запросов. Люди пишут так, как модель не видела: «а можно с доставкой, но не на этой неделе», «подскажите, я запуталась в тарифах». Каждая такая формулировка встречается один раз, в обучающую выборку не попадает, а в сумме эти реплики дают половину обращений.

Второй — неоднозначные формулировки и смешанные темы в одной реплике. «Верните деньги и отключите подписку» — это два разных намерения в одном сообщении, а классификатор обучен выбирать один класс и молча теряет второе. Пользователь не получает ответа на половину вопроса и повторяет его, уже раздражённо.

Третий — отсутствие единого словаря. Пока разметчики и аналитики не договорились, где граница между «отменить заказ» и «изменить заказ», похожие фразы уезжают в разные классы. Таксономия расплывается, метрика на отложенной выборке выглядит прилично, а ошибки распознавания намерений всплывают уже в диалоге.

Сверху ложится шум ввода — опечатки, транслит, распознанная речь. Именно на нём ломается всё, что хорошо работало в демо. Дальше разбираем, как это закрывается.

Что даёт управляемая таксономия намерений

Пока намерения собраны списком фраз «как получилось», близкие классы перекрываются, и бот отвечает не в тему. Управляемая таксономия — это иерархия домен → интент → под-интент, где у каждого класса есть правило ответа, а для всего непокрытого заведён отдельный класс вне сценария. Точность считается по каждому домену отдельно, и слабый домен не размывает общую картину.

Вариант Когда подходит Ограничения
Плоский список, 30–50 интентов Один сценарий поддержки, узкая продуктовая база Новые темы падают в ближайший интент — растут ложные срабатывания
Иерархия домен → интент → под-интент Несколько направлений, разные команды Нужна разметка и арбитраж спорных примеров
Таксономия с явным классом вне сценария Открытая база, поток незнакомых формулировок Требует регулярного пересмотра: часть новых тем переводится в реальные интенты

Эффект виден на трёх метриках. Доля автоответов растёт с 50–60% до 85%: модель перестаёт угадывать между похожими намерениями. Доля ручных переводов падает в 2–3 раза — оператор подключается только при уверенности ниже порога или при явном запросе вне сценария.

Устойчивость на новых темах даёт класс вне сценария: незнакомая формулировка не притягивается к ближайшему интенту, а попадает в очередь на разбор, и таксономия пересматривается по этим примерам. Уходит и целый класс отказов — «бот уверенно ответил не то», который дороже честного перевода на оператора. Порог уверенности по каждому домену и явная иерархия — отработанная практика в открытых платформах вроде Rasa.

Подходы к intent detection: правила, обучение, гибрид

Подход Когда подходит Ограничения
Правила и словари 10–30 интентов, стабильные формулировки, разметки пока нет рвётся на перефразах и опечатках; словарь растёт быстрее, чем точность
Обучение на размеченных диалогах живая речь, тысячи примеров, интенты пересекаются нужна разметка и её пересборка при смене таксономии; редкие интенты проседают
Гибридный подход правила как быстрый слой на критичных интентах, модель — на остальном сложнее отладка: ошибка живёт либо в правиле, либо в модели

Выбор здесь определяется не модой, а объёмом диалогов и стабильностью предметной области. Правила и словари дают предсказуемость на узком наборе интентов, обучение на разметке — обобщение на перефразы, гибрид — компромисс между управляемостью и гибкостью.

Гибрид обычно собирается каскадом: словарный слой снимает однозначные обращения, модель распределяет остаток, а порог уверенности решает, отвечать автоматически или уточнять. Порог подбирается по матрице ошибок — завышенный гонит долю передач оператору вверх, заниженный увеличивает число неверных ответов. Мы фиксируем его на валидации и пересматриваем при каждом изменении таксономии, иначе качество тихо уезжает.

Что выбрать — зависит от того, что дороже именно вам: ложный ответ или лишняя передача оператору. Опишите задачу и покажите логи диалогов — вернёмся с оценкой, какой из трёх вариантов закроет ваши интенты.

Внедрение: от аудита диалогов до передачи регламентов

Внедрение intent detection — это не разовая тренировка модели, а цикл: аудит реальных диалогов задаёт таксономию, разметка её уточняет, а отложенная выборка показывает, где классификатор ошибается на новых формулировках. Идём этапами, после каждого виден измеримый результат — доля верных срабатываний, число лишних уточнений, глубина очереди на оператора.

  1. Аудит диалогов. Выгружаем историю обращений за период, считаем долю нераспознанных и сценарии с повторными уточнениями. Так видно, какие намерения стоит выделять отдельно, а какие закрывает обычное меню.
  2. Схема таксономии. Собираем намерения в иерархию: сверху задача клиента, ниже уточнения и сущности. Проверяем пересечения классов, чтобы близкие запросы не спорили за одну метку.
  3. Разметка намерений. Пишем правила для спорных случаев и держим контрольную выборку для проверки согласованности. Расхождение разметчиков выше порога возвращает нас к правкам схемы, а не к обучению.
  4. Настройка уверенности. Задаём порог, ниже которого бот задаёт уточняющий вопрос вместо догадки, и правило передачи оператору. Ложная уверенность на редком классе обходится дороже лишнего уточнения.
  5. Отложенная выборка. Набор диалогов, не попавший в обучение, прогоняем перед выкаткой: смотрим матрицу ошибок по классам, а не одну общую точность — иначе редкие намерения прячутся за средним.
  6. Проверка и передача регламентов. Выпускаем в теневом режиме: модель классифицирует, отвечает пока старый сценарий. Затем отдаём регламент обновления — периодичность переобучения, метрики деградации, ответственный за правки таксономии.

Комплект поставки: таксономия, схема, регламенты

Артефакты, которые описывают, что мы считаем намерением и как поступаем с каждым ответом, остаются у заказчика вместе с кодом. Без них модель через месяц превращается в чёрный ящик, а любое изменение сценария требует возврата к подрядчику. Ниже — комплект, который фиксируем в приёмке.

  • Словарь намерений (таксономия). Дерево интентов с описанием, примерами фраз на каждый класс, границами между близкими намерениями и правилами разметки спорных случаев. Отдельным блоком — то, что сознательно не относим ни к одному интенту.
  • Схема маршрутизации. Таблица «намерение → сценарий или оператор», пороги уверенности, поведение при низкой уверенности и приоритеты, если сработало несколько классов одновременно.
  • Политики обработки. Что попадает в логи, что маскируется или не сохраняется вовсе, срок хранения, роли доступа и порядок выгрузки данных для разбора ошибок.
  • Документация таксономии. Порядок добавления и переименования намерений, версионирование словаря, владелец со стороны заказчика и точки согласования с бизнесом.
  • Регламент переобучения. Триггеры обновления (доля нераспознанных, смещение формулировок пользователей), частота, кто размечает новые примеры и как проверяем качество до выката.
  • Контрольный набор и отчёт качества. Фиксированная выборка диалогов, метрики по каждому намерению, сравнение с предыдущей версией и порядок отката при просадке.
  • Инструкции для поддержки. Куда заводить нетиповые обращения, как эскалировать и кто обновляет словарь, чтобы новые случаи не терялись между командами.

Кейс: как убрали ложные переводы на оператора

Что было

Клиент пришёл с ботом поддержки, который переводил на оператора больше трети диалогов — включая те, где ответ уже лежал в базе знаний. Таксономия намерений собиралась вручную и содержала пересекающиеся классы: «статус заказа» и «где посылка» уходили в разные категории, а модель с равной уверенностью относила запрос к обеим. Порог уверенности зафиксировали при запуске и не пересматривали.

На отложенной выборке доля верных распознаваний составляла 72%, доля ложных переводов на оператора — 34%. Каждый третий диалог забирал время оператора, хотя автоматика закрыла бы его быстрее.

Что изменили

Пересобрали таксономию: убрали пересечения, развели близкие намерения и добавили отдельный класс «не распознано» вместо натягивания запроса на ближайшую категорию. Разметили стратифицированную отложенную выборку в Label Studio — теперь метрики считаются на одних и тех же данных. Порог уверенности подобрали по матрице ошибок: ложный перевод дороже уточняющего вопроса, поэтому бот сначала переспрашивает, а не зовёт человека.

Что стало

Доля верных распознаваний на той же выборке — 94%, ложные переводы на оператора — 7%. Доля диалогов, закрытых без участия оператора, выросла с 58% до 88%. Мониторинг повесили на долю низкоуверенных распознаваний, распределение намерений по дням и расхождение с ручной разметкой: после правки формулировок в интерфейсе рост таких ответов был виден в тот же день, и переобучение заняло часы вместо недели жалоб.

Чем отличается намерение от сценария диалога

Намерение — это то, что человек хочет получить одной репликой: вернуть заказ, узнать статус доставки, поменять адрес. Сценарий — последовательность шагов и состояний диалога, которая это желание обслуживает: уточнение деталей, слоты, вызовы внутренних систем, точка завершения. Слои живут по разным законам: намерение определяется моделью по тексту и обновляется переобучением на разметке, сценарий описан графом переходов и обновляется правкой ветки.

Если смешать их в одной схеме, каждая новая формулировка клиента превращается в отдельную ветку графа. Таксономия разрастается, число переходов растёт комбинаторно, и любая правка формулировки требует регрессии всего диалога целиком. Хуже другое: реплики со смешанными темами — «хочу вернуть заказ и заодно поменять адрес» — некуда положить, потому что ветка графа подразумевает одну цель на входе.

Между этими слоями нужен слой маршрутизации. Он получает реплику, считает оценку уверенности по каждому намерению из таксономии, применяет порог и правило разрешения конфликтов, и только потом передаёт управление сценарию вместе с текущим состоянием диалога. Сценарий при этом ничего не знает о формулировках, а модель — о слотах и шагах. Правки с обеих сторон остаются локальными, и регрессия не разъезжается по всей схеме.

Уточняющий вопрос — часть маршрутизации, а не отдельная ветка. Когда два намерения близки по уверенности или в реплике смешаны темы, роутер задаёт уточняющий вопрос и удерживает диалог, пока не выберет одну цель. Так граф сценариев остаётся линейным и предсказуемым, а спорные случаи решаются в одном месте — там, где им и положено решаться.

Технические сомнения перед стартом

Перед стартом заказчик проверяет не саму модель, а её эксплуатацию: как переносится текущая логика, сколько нужно данных и что будет с качеством через полгода. Ниже — пять вопросов, которые чаще всего разбираем на техническом обсуждении.

Что делать со старыми правилами?

Оставляем их отдельным слоем: регулярки закрывают жёсткие случаи вроде номеров заказов, модель — свободные формулировки. Приоритет при конфликте задаётся явно и виден в логах.

Сколько фраз нужно размечено вручную?

Объём считаем от числа интентов и вариативности формулировок, а не «на глазок». Старт — несколько сотен фраз на класс, дальше выборка растёт по неуверенным предсказаниям.

Куда девать нераспознанные фразы?

В очередь разбора, а не в заглушку. Вводим порог уверенности и класс «не понял»; доля таких обращений — метрика, показывающая, где таксономии не хватает.

Модель деградирует со временем?

Да, если меняется язык клиентов. Следим за распределением запросов и точностью на контрольной выборке, при просадке дообучаем на свежих данных — в стеке на Rasa это регулярный цикл.

Как обновляется таксономия?

Новые классы заводим по статистике нераспознанных фраз, сохраняя совместимость имён. Старые не удаляем резко — переводим в архив, чтобы отчёты оставались сопоставимыми.

Обсудим задачу и вернёмся с оценкой

Для оценки нужны не общие пожелания, а ваши данные: на первом разговоре разбираем, как бот обрабатывает запросы сейчас и где теряет пользователей. Если есть выгрузка переписки и список интеграций, объём таксономии интентов и состав работ прикидываем уже по итогам разговора.

Что обсудим и какие вводные понадобятся с вашей стороны:

  • Аудит текущего бота — какой слой отвечает за распознавание: правила, регулярные выражения или обученная модель, и на каких запросах он ошибается.
  • Вводные по диалогам — выгрузка логов за период, доля нераспознанных реплик, несколько сотен размеченных примеров по ключевым сценариям.
  • Границы таксономии — перечень сценариев и желаемая детализация: крупные интенты или подклассы с отдельной реакцией на неясный ввод.
  • Данные и доступы — каналы (мессенджеры, веб-виджет, телефон), интеграции с CRM или справочником, тестовый контур для прогона модели.
  • Язык и стиль — обслуживаемые языки и диалекты, доля опечаток и транслита, нужна ли обработка голосовых сообщений.
  • Критерии приёмки — целевая доля верных срабатываний, допустимый уровень ложных, на какой выборке считаем качество.
  • Порядок старта — что делаем в первую очередь: замер текущего качества, разметка, черновик таксономии.
  • План работ — этапы, точки сверки, состав команды и порядок передачи модели вашим инженерам.

После разговора вернёмся с оценкой, планом работ и перечнем рисков. Опишите задачу и пришлите выгрузку логов — этого достаточно, чтобы двигаться дальше.

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

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

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139