Watson Assistant - лучший способ обработки логики в зависимости от значений сущностей - PullRequest
0 голосов
/ 04 мая 2018

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

Если пользователь пишет "Что я могу сделать с солью и маслом"

Тогда массив будет: Ingrediente:["salt","oil"]

Затем я хочу добавить соответствующее блюдо, в зависимости от того, содержит ли массив Ingrediente определенный ингредиент, например, если Ingrediente содержит и «соль», и «масло», массив ListaPlatillos будет добавлен значения «Стейк» и «Салат», соответствующие элементам в массиве Ingrediente соответственно, я пытаюсь сделать это внутри слота, например:

enter image description here

Условия написаны так:

($Ingrediente.contains('Sal') || $Ingrediente.contains('Sal de grano')) && !$ListaPlatillos.contains('Ensalada de ejote asado con menta y queso feta ')

И LisaPlatillos добавляется так:

    "context": {
    "ListaPlatillos": "<? context.ListaPlatillos.append( 'Ensalada de ejote asado con menta y queso feta ' ) ?>"
  }

Проблема в том, что проверяется только первое условие и, таким образом, добавляется только первое блюдо. Какой правильный / лучший способ обновить ListaPlatillos в зависимости от значений Ingrediente?

1 Ответ

0 голосов
/ 07 мая 2018

Логика оценки диалога работает таким образом, что когда ответ соответствует - условие ответа в интервале оценивается как истинное, тогда этот ответ обрабатывается вместе с его контекстом, и никакие другие ответы не будут обрабатываться впоследствии. Таким образом, обновления должны были бы быть сделаны в контексте только одного узла ответа - который не мог бы быть идеальным в этом случае. Вы можете использовать поле output для этой цели, так как здесь также оцениваются выражения SpEL, и результат их не сохраняется в context, который в этом случае вам не нужен (вы хотите только обновить значение одного поля в контексте). Код, который будет выполнять обновления в этом случае, будет выглядеть так:

output : {
    "update1" : "<?($Ingrediente.contains('Sal') || $Ingrediente.contains('Sal de grano')) && !$ListaPlatillos.contains('Ensalada de ejote asado con menta y queso feta ') ? context.ListaPlatillos.append( 'Ensalada de ejote asado con menta y queso feta ' ) : '' ?>"
    "update2" : "<?...?>"
}

В общем случае синтаксис condition ? something : something:

output : {
    "update" : "<? condition ? what_to_do_when_true : what_to_do_when_false?>"
}

Теперь, когда вы реализуете такую ​​более сложную логику в диалоге, вы можете проверить Cloud Functions - есть способ вызова пользовательских функций из Watson Assistant, который может обрабатывать значения, представленные пользователем, вычислять что-то и возвращать это обратно в WA, где его можно использовать для вывода некоторого текста пользователю. Чтобы узнать больше об этом, посетите WA Doc - как совершать программные звонки из WA или Google how to make programatic calls from watson assistant.

...