Сущности в контексте
Платформа предоставляет механизм извлечения сущностей (entities) для распознавания и обработки структурированных данных из пользовательского ввода. Этот функционал позволяет работать с различными типами данных, такими как номера телефонов, даты, адреса и другие.
Принцип работы
Распознавание: При поступлении сообщения NLU-модель автоматически извлекает сущности, соответствующие настроенным шаблонам.
Сохранение в контекст: Извлеченные данные сохраняются в объекте
context
, становясь доступными для использования в сценарии.Доступ к данным: Доступ к значению сущности осуществляется через следующие поля:
context.имя_сущности.str
: Отформатированное строковое представление.context.имя_сущности.raw
: Оригинальное значение, как оно было введено пользователем.
Данные из контекста можно использовать как декларативно в блоке Текст, так и программно в Сниппетах.
Практическое руководство
Рассмотрим пример извлечения номера телефона и его использования в сценарии.
Шаг 1. Конфигурация сущности
Перейдите в раздел Сущности и создайте новую сущность с типом Phone number
. Присвойте ей имя, например, Phone
.
Шаг 2. Создание сниппета
Перейдите в раздел Сниппеты и создайте новый сниппет с именем getPhoneNumber
. Добавьте следующий код для извлечения данных из контекста и вывода их в чат для отладки:
async function snippet (core = new Core(), context = new Context()) {
// Прямой доступ к сущности, извлеченной из последнего сообщения
core.sendText("Получаю доступ из контекста к сущности 'Phone': " + context.Phone.str);
}
Шаг 3. Построение и тестирование сценария
Перейдите в раздел Сценарии и создайте новый сценарий.
В качестве триггера (первого шага) установите блок Сущность и выберите созданную ранее сущность
Phone
.Добавьте два шага-реакции:
Сниппет: Выберите созданный сниппет
getPhoneNumber
.Текст: Введите
Указан телефон: {{Phone.str}}
для демонстрации прямого доступа к данным сущности.
Сохраните сценарий.
Для проверки откройте тестовый чат и отправьте сообщение, содержащее номер телефона. В ответ система должна вернуть два сообщения, подтверждающих успешное извлечение данных как через сниппет, так и напрямую в текстовом блоке.
Продвинутые техники работы с контекстом
Обработка нескольких сущностей
Если в одном сообщении может содержаться несколько сущностей одного типа, их можно обработать с помощью свойства .others
, которое содержит массив всех дополнительных совпадений.
Пример сниппета:
async function snippet (core = new Core(), context = new Context()) {
if (context.Phone) {
core.sendText('Основной номер: ' + context.Phone.str);
if(context.Phone.others && context.Phone.others.length > 0) {
// Проходим по массиву остальных найденных номеров
context.Phone.others.forEach((phoneEntity, index) => {
core.sendText(`Дополнительный номер ${index + 1}: ${phoneEntity.str}`);
});
} else {
core.sendText('Дополнительные номера не обнаружены.');
}
} else {
core.sendText('Номер не обнаружен.');
}
}
Доступ к истории контекста
Сниппеты предоставляют доступ не только к текущему состоянию контекста, но и к его истории. Это позволяет извлекать данные из предыдущих сообщений диалога.
context.current.meta.entities
: Сущности, извлеченные из текущего сообщения.context.events
: Массив всех событий в диалоге. Для доступа к последнему событию используетсяcontext.events[context.events.length - 1]
.
Пример сниппета для демонстрации различных способов доступа:
async function snippet (core = new Core(), context = new Context()) {
// Способ 1: Прямой доступ к сущности из последнего сообщения
if (context.Phone) {
core.sendText('Способ 1 (прямой доступ): ' + context.Phone.str);
}
// Способ 2: Доступ через метаданные текущего события
if (context.current && context.current.meta && context.current.meta.entities && context.current.meta.entities.Phone) {
core.sendText('Способ 2 (из context.current): ' + context.current.meta.entities.Phone.str);
}
// Способ 3: Доступ через историю событий
const lastEvent = context.events[context.events.length - 1];
if (lastEvent && lastEvent.meta && lastEvent.meta.entities && lastEvent.meta.entities.Phone) {
core.sendText('Способ 3 (из истории событий): ' + lastEvent.meta.entities.Phone.str);
}
}
Последнее обновление