在使用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上的文档非常清楚插槽只能采用交互模型中列出的值。
现在,似乎值也是动态解析的!这是一个新功能,还是我错过了什么?
答案 0 :(得分:6)
实际上这是正常的(而且很好,IMO)。 Alexa使用您提供的单词列表作为指南,而不是明确的列表。
如果它没有这种灵活性,那么就无法知道用户是否使用了你并不期望的单词。这样您就可以学习并改进列表和处理。
答案 1 :(得分:1)
Alexa将提供的广告位值视为“样本” 。因此,交互模型中未提及的广告位值也将被映射。
创建自定义广告位类型时,需要了解的关键概念是 这是Alexa NLP(自然语言)的训练数据 处理中)。您提供的值不是严格的枚举或数组 限制了用户可以说的话。这有两个含义
1)不在您的广告位值中的单词和短语会被传递给您,
2)您的代码需要执行所需的任何验证(如果有的话) 说不明。
由于您知道该插槽的可接受值,因此请始终对代码执行插槽值验证。这样,当您得到有效汽车制造商以外的其他东西或您不支持的东西时,您总是可以礼貌地回覆,例如
“对不起,我听不懂,您能再说一次吗”
或
“抱歉,我们没有列出我们。您能不能 从[从列表中选择一些样品]中选择一些东西。“
更多信息here