在使用Alexa技能套件测试我的交互模型时,我发现了一些奇怪的东西。
我定义了一个自定义插槽类型,如下所示:
CAR_MAKERS Mercedes | BMW | Volkswagen
我的意图计划是这样的:
{
"intents": [
{
"intent": "CountCarsIntent",
"slots": [
{
"name": "CarMaker",
"type": "CAR_MAKERS"
},
...
样本话语如:
CountCarsIntent Add {Amount} cars to {CarMaker}
现在,在开发人员控制台中进行测试时,我注意到我可以编写如下内容:
"Add three cars to Ford"
它实际上会解析这个!即使在交互模型中从未提及“福特”! lambda请求是:
"request": {
"type": "IntentRequest",
...
"intent": {
"name": "CountCarsIntent",
"slots": {
"CarMaker": {
"name": "ExpenseCategory",
"value": "whatever"
},
...
这真的让我感到惊讶,因为关于custom slot types的文档很清楚,插槽只能采用交互模型中列出的值。
现在,似乎值也是动态解析的!这是一个新功能,还是我错过了什么?
实际上这是正常的(而且很好,IMO)。 Alexa使用您提供的单词列表作为指南,而不是确定列表。
如果它没有这种灵活性,那么就无法知道用户是否使用了你不期望的单词。这样您就可以学习和改进列表和处理。
Alexa将提供的槽值视为“样本”。因此,交互模型中未提及的槽值也将被映射。
当您创建自定义插槽类型时,要理解的关键概念是这是Alexa的NLP(自然语言处理)的训练数据。您提供的值不是严格的枚举或数组,限制用户可以说的内容。这有两个含义
1)不在您的插槽值中的单词和短语将传递给您,
2)如果所说的内容未知,您的代码需要执行您需要的任何验证。
由于您知道该插槽的可接受值,因此请始终对代码执行插槽值验证。通过这种方式,当您获得有效汽车制造商以外的其他东西或您不支持的东西时,您可以礼貌地回复
“对不起,我不明白,你能再说一遍吗?”
要么
“对不起,我们的列表中没有。你能不能从[列表中提供一些样品]中选择一些东西”
更多信息here