我正在尝试使用Dialogflow Node SDK(使用v2 API)版本0.8.2
创建一个意图,该意图用我创建的用户定义实体执行插槽填充。
从高层次上讲,我有一个实体类型(食物),它来自我无法控制的外部数据库。我有一些具有以下类别->实例列表映射的食物示例:
Junk food -> [beer, doughnuts, pizza]
Meat, Dairy or Eggs -> [steak, 'eggs, brown', 'eggs, green', ham]
...
我有点警惕来自此外部数据库的同义词和规范实例名称中是否存在逗号和连词/析取词;但作为数据驱动的研究员;如果在现阶段有理由,我宁愿放弃简单的实现。
无论如何,我现在想要的主要目的是回答以下问题:
do you guys have ham, doughnuts or pizza?
can I get broccoli here?
do you offer beer, steak, radishes, ketchup or asparagus?
...
这个想法是,客户可以查询一个或多个项目。 (对我而言)这样做的显而易见的方法是创建带有训练示例的意图,并指定设置isList=true
的单个时隙填充参数。
我需要能够使用Node SDK从代码管理Dialogflow代理。实体和意图将由另一个工具生成,该工具查看外部API和数据库等,并帮助我自动生成一些内容以进行对话控制。
现在,我正在发出一个createIntent请求,其中包含约6个培训示例以进行测试。像这样:
"intent": {
"displayName": "test-complex-list",
"trainingPhrases": [
{
"type": "EXAMPLE",
"parts": [
{
"text": "do you have "
},
{
"text": "pizza",
"entityType": "@food",
"userDefined": true,
"alias": "food"
},
{
"text": " or "
},
{
"text": "beer",
"entityType": "@food",
"userDefined": true,
"alias": "food"
},
{
"text": "?"
}
]
},
...
"parameters": [
{
"displayName": "food",
"entityTypeDisplayName": "@food",
"isList": true
}
]
...
我从Dialogflow API得到了成功响应……是的!
现在,我继续前进之前转到Dialogflow控制台进行测试,然后在右上角的测试文本区域中输入do you have ham, doughnuts or pizza?
。我看到的响应指示检测到了正确的意图,但我回来了:Parameter=food
和Value=[Meat, Dairy or Eggs]
。看来我的垃圾食品还没买(嘿,也许Dialogflow很健康)。
我记得以前在控制台中测试过这个用例,并且它起作用了;因此,我单击“保存”,等待“代理培训完成”,然后再次粘贴我的查询中。这次,插槽填充值为[ "Meat, Dairy or Eggs", "Junk Food", "Junk Food" ]
...恰好是我的预期。
我的问题是:当我在Dialogflow控制台中单击“保存”时,发生了什么黑魔法?我在“保存”前后将代理导出到.zip
文件中,并比较结果。唯一的区别似乎是赋予代理各种元素的ID不同。
我的其他意图确实没有问题(在此省略),但这无疑是最复杂的。
我怀疑这是Dialogflow中的错误;但是在抱怨之前,我想我会探索更可能的选择(我错过了一些东西)。