Пользовательские сущности (справочники) в Aimylogic

Хотя в статье на сайте Aimylogic есть достаточно подробное описание работы с сущностями, однако не хватает конкретики в виде примеров использования в сценариях. Полезно также посмотреть статью с синтакисом шаблонов:

https://help.aimylogic.com/docs/ru/how-to-create-a-script/user-says/template_syntax/

Итак, мне нужно решить следующую задачу:

  1. Компания производит ряд продуктов.
  2. Голосовой бот задает вопрос клиенту с каким продуктом проблема.
  3. Клиент отвечает на вопрос и во фразе должен фигурировать один из продуктов.
  4. Необходимо минимизировать количество интентов, чтобы обработка была максимально компактной и более красивой.
  5. После определения продукта должно отработать ветвление в зависимости от типа продукта.

Самый простой вариант реализации — это в блоке «Синтез речи» добавить интенты по каждому типу продукта. И дальше сделать ветвления.

Реализуем тоже самое с помощью пользовательских сущностей. Зайдем в «Сущности» -> «Создать справочник синонимов»:

Создаем справочник сущностей с именем $products. Для примера три сущности:

В синонимах не отрабатывают шаблоны, т.е. если задать «Эксперт * Плюс», то фраза «Эксперт !!! Плюс» подходящая под шаблон распознана не будет. Например, если пользователь в текстовом чате может написать «МайХит» вместе и «Май Хит» раздельно, то придется в синонимах указывать оба значения.

При появлении во фразе пользователя заданного для сущности синонима в переменной $products появится имя сущности. Его можно проверить в блоке «Условие», например, с помощью выражения $products == «Expert Plus».

Реализуем простой функционал заполнения переменной $products для теста, чтобы лучше понять как работают сущности:

  1. В блоке «Синтез речи» спрашиваем клиента «С каким продуктом у вас проблема?».
  2. В интент вставляем потенциальный ответ пользователя, но вместо конкретного названия продукта используем сущность $products. Например, если в интенте будет фраза: * [проблема] * с $products, то интент сработает только если клиент скажет, например «У меня проблема с Эксперт Плюс», либо кратко ответит «с Эксперт Плюс». Но если клиент ответит «Эксперт Плюс», то синоним не распознается, поскольку наличие «с» перед «Эксперт Плюс» обязательное.
  3. С обработанного интента переходим на блок «Синтез речи», где выводим значение переменной $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;
}

Spread the love
Запись опубликована в рубрике IT рецепты. Добавьте в закладки постоянную ссылку.

Обсуждение закрыто.