8

在使用 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"
        },
 ...

这真的让我吃惊,因为关于自定义插槽类型的文档非常清楚,插槽只能采用交互模型中列出的值。

现在,似乎值也是动态解析的!这是一个新功能,还是我错过了什么?

4

2 回答 2

6

实际上这是正常的(而且很好,IMO)。Alexa 使用您提供的单词列表作为指南,而不是最终列表。

如果它没有这种灵活性,那么就无法知道用户是否使用了您没有预料到的单词。通过这种方式,您可以学习和改进您的列表和处理方式。

于 2016-10-09T19:18:19.103 回答
1

Alexa 将提供的插槽值视为'Samples'。因此,交互模型中未提及的槽值也将被映射。

当您创建自定义槽类型时,需要理解的一个关键概念是这是 Alexa 的 NLP(自然语言处理)的训练数据。您提供的值不是限制用户可以说的严格枚举或数组。这有两个含义

1) 不在您的槽值中的单词和短语将传递给您,

2)如果所说的内容未知,您的代码需要执行您需要的任何验证。

由于您知道该槽的可接受值,因此请始终对您的代码执行槽值验证。这样,当你得到不是合法的汽车制造商或你不支持的东西时,你总是可以礼貌地回应,比如

“对不起,我没听懂,你能重复一遍吗?”

或者

“抱歉,我们的列表中没有。请您从 [从您的列表中提供一些样品] 中选择一些东西”

更多信息在这里

于 2018-09-01T07:06:55.470 回答