Интент

6

Интент (намерение) — то, чего человек хочет добиться обращением. «Где мой заказ», «когда привезут», «отследить доставку» — три формулировки одного интента.

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

Как это работает

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

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

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

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

Сколько классов и как их организовать

Разумный объём. Управляемый набор — обычно до 20–40 интентов. Дальше точность начинает падать не потому, что модель «слабая», а потому, что формулировки классов начинают пересекаться: количество различимых ситуаций у пользователей ограничено.

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

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

Как проектировать набор интентов

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

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

Немного. Двадцать интентов поддерживать реально, двести — нет. Если их получается много, часть задачи стоит отдать поиску по документам.

С запасным вариантом. Интент «не распознано» обязателен, и обращения, попавшие в него, — главный материал для развития.

Близкие интенты и падение точности

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

Диагностика. Ошибки ищут по матрице ошибок на размеченной выборке: смотрят не общий показатель, а пары «куда перепутывается». Если два класса устойчиво путаются местами — это один интент с уточняющим вопросом, а не два.

Правило разрешения. Разделять классы стоит тогда, когда для них действительно разные сценарии или разные исполнители; если ответ один и тот же — классы объединяют, как бы ни хотелось детализации в отчёте.

Порог уверенности

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

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

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

Как развивать набор после запуска

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

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

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

Когда интенты перестают работать

Признак: набор разросся, интенты начали пересекаться, и добавление нового ухудшает распознавание соседних. Это естественный предел подхода.

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

Частые вопросы

Чем интент отличается от темы обращения?

Интент описывает действие, которое нужно совершить, а не область. «Доставка» — тема, под которую попадают разные вопросы с разными сценариями. «Узнать статус доставки» — интент, для которого можно написать конкретный ответ.

Сколько интентов делать?

Столько, сколько реально поддерживать: двадцать-тридцать обычно управляемо. Если набор разрастается до сотен, это признак, что часть обращений правильнее обслуживать поиском по документам, а не сценариями.

Где брать примеры формулировок?

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

Как измерять качество распознавания?

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

Что делать, если в одном обращении несколько намерений?

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

Нужен ли отдельный интент под спам и нерелевантные сообщения?

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

Что почитать по теме