Ibm cloud Watson Assistant根据实体值处理逻辑的最佳方法

Ibm cloud Watson Assistant根据实体值处理逻辑的最佳方法,ibm-cloud,watson,watson-conversation,Ibm Cloud,Watson,Watson Conversation,我是Watson框架的新手,我正在尝试制作一个有助于烹饪的机器人,我目前的对话方式是将用户键入的每个配料实例保存在一个数组中,如下所示: 如果用户写“我可以用盐和油做什么” 然后数组将是:Ingrediente:[“盐”、“油”] 然后,我要做的是根据Ingredite数组是否包含特定成分添加相应的菜肴,例如,如果Ingredite同时包含“盐”和“油”,数组ListaPlatillos将附加值“牛排”和“沙拉”分别对应于Ingrediente数组中的元素,我尝试在插槽中这样做: 条件是这样写

我是Watson框架的新手,我正在尝试制作一个有助于烹饪的机器人,我目前的对话方式是将用户键入的每个配料实例保存在一个数组中,如下所示:

如果用户写“我可以用盐和油做什么”

然后数组将是:
Ingrediente:[“盐”、“油”]

然后,我要做的是根据
Ingredite
数组是否包含特定成分添加相应的菜肴,例如,如果
Ingredite
同时包含“盐”和“油”,数组
ListaPlatillos
将附加值“牛排”和“沙拉”分别对应于
Ingrediente
数组中的元素,我尝试在插槽中这样做:

条件是这样写的:

($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
的值,更新
ListaPlatillos
的正确/最佳方法是什么?

对话框的计算逻辑的工作方式是,当响应匹配时,插槽中的响应条件计算为true,然后,该响应将与其上下文一起处理,之后不会处理其他响应。因此,更新只需要在一个响应节点的上下文中进行,这在本例中可能并不理想。您可以使用
output
字段来实现此目的,因为
SpEL
表达式也会在此处进行求值,并且它们的结果不会存储在
上下文中,在这种情况下,您不希望这样做(您只希望更新上下文中一个字段的值)。在这种情况下,执行更新的代码如下所示:

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" : "<?...?>"
}

现在,在对话框中实现这种更复杂的逻辑时,您可能需要检查
云函数
——有一种方法可以从Watson Assistant调用自定义函数,该函数可以处理用户提交的值,计算一些内容,并将其返回给WA,在WA中可以使用它向用户输出一些文本。要了解更多信息,请访问或谷歌
如何从watson assistant拨打程序性电话

谢谢这是一个非常完整的答案,我觉得我可以更好地处理我的对话:)
output : {
    "update" : "<? condition ? what_to_do_when_true : what_to_do_when_false?>"
}