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

时间:2018-05-04 19:24:11

标签: ibm-cloud watson watson-conversation

我是Watson框架的新手,我正在尝试创建一个有助于烹饪的机器人,我正在进行对话的方式是保存用户在数组中键入的每个成分实例: / p>

如果用户写下“我能用盐和油做什么”

然后数组将是:Ingrediente:["salt","oil"]

我想要做的是添加相应的菜,具体取决于Ingrediente数组是否包含某种成分,例如Ingrediente同时包含“salt”和“oil”,数组{{将分别附加对应于ListaPlatillos数组中元素的值“Steak”和“Salad”,我试图在这样的插槽中进行:

enter image description here

条件写得如下:

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的正确/最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

对话框的评估逻辑的工作方式是,当响应匹配时 - 将插槽中的响应条件评估为true,然后将此响应与其上下文一起处理,之后不会处理其他响应。因此,需要在仅一个响应节点的上下文中进行更新 - 在这种情况下可能不是理想的。您可以将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 - how to make programatic calls from WA 或Google how to make programatic calls from watson assistant