Сущности, слоты и контексты
Намерение говорит, чего хочет клиент; сущности вытаскивают из фразы конкретные данные; слоты привязывают сущности к намерению, чтобы бот знал, чего ему не хватает; контексты сужают круг намерений, которые бот рассматривает на следующем шаге.
Системные сущности
Извлекаются без настройки, если установлен сервис Duckling (см. раздел Требования к серверам). Если Duckling отключён, системные сущности не распознаются, а пользовательские продолжают работать.
| Тип | Примеры во фразе | Что получает бот |
|---|---|---|
time | «завтра в 15:00», «в следующий понедельник», «3 марта» | Дата и время в ISO-формате, с учётом часового пояса сервера |
number | «пять тысяч», «12», «полтора» | Число |
ordinal | «третий», «первое» | Порядковый номер |
amountOfMoney | «1500 рублей», «$20» | Сумма и валюта |
duration | «на две недели», «3 часа» | Длительность |
distance, volume, temperature, quantity | «10 км», «2 литра», «25 градусов» | Величина и единица |
email, phoneNumber, url | «ivan@mail.ru», «+7 900 123-45-67», «iqstore.ru» | Нормализованное значение |
Пользовательские сущности
Создаются в разделе «Понимание естественного языка», вкладка «Сущности».
- Список — набор значений с синонимами: сущность «Город» со значениями «Москва» (синонимы «мск», «москве»), «Санкт-Петербург» («питер», «спб»). Включите нечёткое совпадение, чтобы прощать опечатки. Бот получает каноническое значение («Москва»), а не то, что набрал клиент.
- Шаблон — регулярное выражение для строго заданного формата: номер карты
\d{4}, номер заявки[A-Z]{2}-\d{6}, промокод.
Сущности видны в event.nlu.entities: массив объектов с полями name (имя сущности), type (list, pattern, system), data.value (значение), meta.start/meta.end (позиция во фразе). В условии перехода: event.nlu.entities.some(e => e.name === 'Город').
Слоты
Слот это ожидаемое место сущности в намерении: у намерения «перевод» слоты «сумма» (amountOfMoney) и «получатель» (сущность «Контакт»). Слоты добавляются на вкладке намерения: выберите имя и сущность, затем в обучающих фразах выделите слова, которые соответствуют слоту (разметка показывается цветом). Чем больше размеченных примеров, тем точнее NLU находит слот в живой речи.
Когда намерение распознано, заполненные слоты лежат в event.nlu.slots: event.nlu.slots.сумма.value. Если клиент назвал не всё, слот остаётся пустым, и его дособирает навык «Заполнение слота»: он спрашивает недостающее, проверяет ответ и хранит значение в сессии, см. «Навыки».
Контексты
Контекст это метка, которую имеют намерения (по умолчанию все в контексте global) и вопросы-ответы. Когда у клиента активны контексты, NLU ищет намерение только среди них, а QnA отвечает только вопросами этих контекстов. Так одно и то же «да» означает разное в разных местах сценария, а вопрос «сколько стоит» внутри раздела «Кредиты» не улетает в ответ про вклады.
- Контекст намерения задаётся в его настройках; у вопроса-ответа в поле «Контексты».
- Действие «Добавить контекст» включает контексты для следующих сообщений на заданное число ходов (TTL), «Убрать контекст» снимает отдельные, «Сбросить контекст» возвращает клиента в
global. Навык «Заполнение слота» управляет контекстами сам. - Текущие контексты видны в
event.nlu.includedContextsи в «Панели отладки».
Как проверить
Откройте эмулятор, напишите фразу и посмотрите «Панель отладки» → вкладка «Отладчик»: там распознанное намерение с уверенностью, список кандидатов, извлечённые сущности и слоты, активные контексты и причина, по которой платформа выбрала процесс, QnA или ничего. Если фраза не распознаётся, добавьте её как пример в намерение и дождитесь переобучения (индикатор внизу Studio).