Интент (намерение) — то, чего человек хочет добиться обращением. «Где мой заказ», «когда привезут», «отследить доставку» — три формулировки одного интента.
Распознавание интента — способ свести разнообразие формулировок к конечному набору ситуаций, для каждой из которых заготовлен сценарий. Это первый шаг почти любого бота и маршрутизатора обращений: от того, куда попала фраза, зависит весь дальнейший диалог.
Как это работает
Классическая схема: для каждого интента собираются примеры формулировок, на них обучается классификатор, и входящая фраза относится к одному из классов с некоторой уверенностью.
С появлением языковых моделей задачу часто решают иначе — просят модель отнести обращение к одной из категорий, описанных словами. Обучающие примеры при этом не нужны, а точность на типовых задачах сопоставима.
Выбор между подходами упирается в объём: обученный классификатор дешевле в эксплуатации при большом потоке, модель — быстрее в запуске и проще в изменении набора категорий. На потоке в тысячи обращений в день разница в цене одного обращения умножается заметно; на старте, когда набор категорий ещё меняется каждую неделю, гибкость важнее.
Интент плюс слоты. Полная постановка задачи — не только «чего хочет человек», но и «какими данными это делать»: «где мой заказ № 4517» — это интент «статус заказа» плюс номер, который достаётся извлечением сущностей. Интент выбирает сценарий, слоты его наполняют.
Сколько классов и как их организовать
Разумный объём. Управляемый набор — обычно до 20–40 интентов. Дальше точность начинает падать не потому, что модель «слабая», а потому, что формулировки классов начинают пересекаться: количество различимых ситуаций у пользователей ограничено.
Иерархия вместо плоского списка. Если категорий нужно больше, их собирают в два уровня: сначала грубый класс («доставка», «оплата», «возврат»), затем уточнение внутри («изменить адрес», «узнать статус»). Классифицировать дважды по узкому набору проще, чем один раз по сотне классов, и промежуточный результат пригодится маршрутизации.
Неопределённый класс обязателен. В набор всегда входит «не распознано» / «вне тематики». Без него классификатор вынужден присвоить любой мусор — поздравления, спам, вопрос не по профилю — к какому-то рабочему интенту, и бот уверенно поведёт диалог в сторону.
Как проектировать набор интентов
По действию, а не по теме. «Доставка» — плохой интент, потому что под него попадают и «когда привезут», и «сколько стоит», и «можно ли изменить адрес». Нужны три разных сценария.
Из реальных обращений. Набор, придуманный за столом, всегда расходится с тем, о чём спрашивают. Основа — выгрузка переписки за несколько месяцев.
Немного. Двадцать интентов поддерживать реально, двести — нет. Если их получается много, часть задачи стоит отдать поиску по документам.
С запасным вариантом. Интент «не распознано» обязателен, и обращения, попавшие в него, — главный материал для развития.
Близкие интенты и падение точности
Механизм. Если два интента различаются не формулировкой, а контекстом («изменить дату доставки» и «изменить дату оплаты»), их примеры пересекаются по лексике, и граница между классами проходит по шуму. Чем ближе классы, тем ниже точность на обоих — добавление каждого нового «соседа» ухудшает распознавание старых.
Диагностика. Ошибки ищут по матрице ошибок на размеченной выборке: смотрят не общий показатель, а пары «куда перепутывается». Если два класса устойчиво путаются местами — это один интент с уточняющим вопросом, а не два.
Правило разрешения. Разделять классы стоит тогда, когда для них действительно разные сценарии или разные исполнители; если ответ один и тот же — классы объединяют, как бы ни хотелось детализации в отчёте.
Порог уверенности
Классификатор возвращает не только класс, но и уверенность. Порог, ниже которого обращение считается нераспознанным, — основной рычаг настройки.
Низкий порог означает, что бот уверенно ведёт человека не по той ветке. Высокий — что он слишком часто отвечает «не понял». Первое раздражает сильнее, поэтому при сомнении лучше ошибиться в сторону высокого порога и переспросить.
Порог подбирается по данным, а не по ощущениям: строят зависимость доли ошибочных веток и доли «не понял» от порога и выбирают приемлемый баланс. Типичные рабочие значения лежат в диапазоне 0,6–0,8 уверенности, но на близких интентах порог приходится поднимать.
Как развивать набор после запуска
Основной источник — обращения, попавшие в категорию «не распознано». Их разбор раз в неделю показывает, каких интентов не хватает и какие формулировки не покрыты примерами.
Второй источник — обращения, распознанные с низкой уверенностью. Даже если ветка выбрана верно, низкая уверенность означает, что примеров для этого интента мало.
Третий — диалоги, после которых человек всё равно обратился к оператору: интент распознан, а сценарий не решил задачу.
Когда интенты перестают работать
Признак: набор разросся, интенты начали пересекаться, и добавление нового ухудшает распознавание соседних. Это естественный предел подхода.
Выход — не дробить дальше, а перенести часть нагрузки на поиск по документам, оставив интенты только для действий: оформить, отменить, проверить статус. Для связки с приоритетом и маршрутизацией по исполнителям интент комбинируют с срочностью и темой — это классификация обращений.
Частые вопросы
Чем интент отличается от темы обращения?
Интент описывает действие, которое нужно совершить, а не область. «Доставка» — тема, под которую попадают разные вопросы с разными сценариями. «Узнать статус доставки» — интент, для которого можно написать конкретный ответ.
Сколько интентов делать?
Столько, сколько реально поддерживать: двадцать-тридцать обычно управляемо. Если набор разрастается до сотен, это признак, что часть обращений правильнее обслуживать поиском по документам, а не сценариями.
Где брать примеры формулировок?
Из реальной переписки за несколько месяцев. Наборы, составленные командой умозрительно, систематически расходятся с тем, как формулируют пользователи: те пишут короче, с опечатками и без контекста.
Как измерять качество распознавания?
Точностью и полнотой по каждому классу на размеченной выдержке реальных обращений, с разбором матрицы ошибок. Общая доля верных ответов вводит в заблуждение при дисбалансе: если половина обращений — «статус заказа», модель, всегда отвечающая «статус», покажет 50% при полной непригодности.
Что делать, если в одном обращении несколько намерений?
«Отмените заказ и верните деньги» — два действия. Рабочая схема — определить главный интент (обычно тот, ради которого человек написал, чаще ближе к концу фразы) и после его отработки предложить обработать следующий, а не выбирать один наугад.
Нужен ли отдельный интент под спам и нерелевантные сообщения?
Нужен класс «вне тематики», и это не то же, что «не распознано»: спам и поздравления уверенно относятся к нерелевантным, а «не распознано» — неуверенность на профильных темах. Смешение двух классов в один засоряет материал для развития: разбор мусора не даёт новых интентов, но вытесняет из отчёта настоящие пробелы.