Хотя в статье на сайте Aimylogic есть достаточно подробное описание работы с сущностями, однако не хватает конкретики в виде примеров использования в сценариях. Полезно также посмотреть статью с синтакисом шаблонов:
https://help.aimylogic.com/docs/ru/how-to-create-a-script/user-says/template_syntax/
Итак, мне нужно решить следующую задачу:
- Компания производит ряд продуктов.
- Голосовой бот задает вопрос клиенту с каким продуктом проблема.
- Клиент отвечает на вопрос и во фразе должен фигурировать один из продуктов.
- Необходимо минимизировать количество интентов, чтобы обработка была максимально компактной и более красивой.
- После определения продукта должно отработать ветвление в зависимости от типа продукта.
Самый простой вариант реализации — это в блоке «Синтез речи» добавить интенты по каждому типу продукта. И дальше сделать ветвления.
Реализуем тоже самое с помощью пользовательских сущностей. Зайдем в «Сущности» -> «Создать справочник синонимов»:
Создаем справочник сущностей с именем $products. Для примера три сущности:
В синонимах не отрабатывают шаблоны, т.е. если задать «Эксперт * Плюс», то фраза «Эксперт !!! Плюс» подходящая под шаблон распознана не будет. Например, если пользователь в текстовом чате может написать «МайХит» вместе и «Май Хит» раздельно, то придется в синонимах указывать оба значения.
При появлении во фразе пользователя заданного для сущности синонима в переменной $products появится имя сущности. Его можно проверить в блоке «Условие», например, с помощью выражения $products == «Expert Plus».
Реализуем простой функционал заполнения переменной $products для теста, чтобы лучше понять как работают сущности:
- В блоке «Синтез речи» спрашиваем клиента «С каким продуктом у вас проблема?».
- В интент вставляем потенциальный ответ пользователя, но вместо конкретного названия продукта используем сущность $products. Например, если в интенте будет фраза: * [проблема] * с $products, то интент сработает только если клиент скажет, например «У меня проблема с Эксперт Плюс», либо кратко ответит «с Эксперт Плюс». Но если клиент ответит «Эксперт Плюс», то синоним не распознается, поскольку наличие «с» перед «Эксперт Плюс» обязательное.
- С обработанного интента переходим на блок «Синтез речи», где выводим значение переменной $products, чтобы убедится, что оно заполнено верно.
Результат работы:
Тестируем как отрабатывает ветвление:
Если нам все-же нужно использовать шаблон, то тогда можно усложнить интент, записав его, например, таким образом:
$products::first * $products::second *
В этом случае сначала будет выделена первая часть, которая попадет в переменную $first и вторая часть, которая отправиться в $second.
Например, добавим сущность Plus:
Если пользователь во фразе выругается :-), например: «Эксперт, блин, плюс», то интент:
$products::first * $products::second *
отработает эту фразу и в переменная $first = «Expert», а $second = «Plus». Это не удобно, но как вариант…
В некоторых случаях нужно в одной фразе определить producttype (котел, бойлер косвенного нагрева, GSM контроллер и пр.) и модель. Например, пользователь может в одном предложении смешать тип оборудования и продкт: «котел Эван Эксперт», «котел стаут плюс» и т.п.
При этом работает вариант с использованием двух разных сущностей в одном интенте:
* $products::product * $producttype::type *
Чтобы перебрать все возможные комбинации достаточно задать следующие интенты:
Отрабатывает также запись интентов без переноса результата в переменные:
При этом последовательнось задания интентов не влияет на результат. Можно последние две строчки поместить в начало, отрабатывает также.
Все бы ничего, но в ряде случаев вторая переменная не обнуляется. Например, если ответить «котел», то в $products остается значение от предыдущего обращения. Поэтому более корректный вариант — инициализировать переменные перед вызовом интента.
$product = ""; $type = "";
И далее добавить блок в котором задается значение переменной $type для случая когда пользователь назвал модель оборудования, но во фразе не был указан тип:
switch ($product) { case "Expert": case "ExpertPlus": case "Practic": case "PracticPlus": case "Stout": case "StoutPlus": case "Next": case "NextPlus": case "Start": case "StartPlus": $type = "WaterHeater"; break; }
При этом если пользователь во фразе про оборудование назовет «котел», то переменная $product будет пустой и алгоритм начнет задавать уточняющие вопросы для конкретизации модели.
Если в сценарии задана некоторая уточняющая логика, например, пользователь назвал продукт «Эксперт», но есть расширенная модификация «Эксперт Плюс», он идет с WiFi. Стоит задать пользователю уточняющий вопрос: «Котел с WiFi?». Если тот отвечает утвердительно, то нужно откорректировать выбор пользователя, заменив значение переменной $product с «Expert» на «ExpertPlus». Итак, при ветвлении с утвердительного ответа на вопрос про WiFi идет ветка на блок «Код» в котором стоит следующий JavaScript:
switch ($product) { case "Expert": $product = "ExpertPlus"; break; case "Practic": $product = "PracticPlus"; break; case "Stout": $product = "StoutPlus"; break; }