Watson Assistant 根据实体值处理逻辑的最佳方式

Watson Assistant best way to handle logic depending on entity values

我是 Watson 框架的新手,我正在尝试制作一个有助于烹饪的机器人,我目前进行对话的方式是将用户键入的每个成分实例保存在一个数组中,就像这样:

如果用户写 "What can I make with salt and oil"

那么数组将是:Ingrediente:["salt","oil"]

然后我想做的是根据 Ingrediente 数组是否包含某种成分添加相应的菜,例如,如果 Ingrediente 同时具有 "salt" 和 "oil", 数组 ListaPlatillos 将分别附加对应于 Ingrediente 数组中元素的值 "Steak" 和 "Salad"所以:

条件是这样写的:

($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 ' ) ?>"
  }

问题是只检查了第一个条件,因此只附加了第一道菜,根据 Ingrediente 的值更新 ListaPlatillos 的 correct/best 方法是什么?

对话的评估逻辑的工作方式是,当响应匹配时 - 槽中响应的条件被评估为真,然后此响应与其上下文一起处理,之后不会处理其他响应.因此更新需要在只有一个响应节点的上下文中进行——这在这种情况下可能并不理想。您可以为此目的使用 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 调用自定义函数,这些函数可以处理用户提交的值、计算something 和 return 这回到 WA,它可以用来向用户输出一些文本。要了解更多信息,请访问 WA Doc - how to make programatic calls from WA 或 google how to make programatic calls from watson assistant