Alexa 自定义插槽类型:没有意图的价值

Posted

技术标签:

【中文标题】Alexa 自定义插槽类型:没有意图的价值【英文标题】:Alexa Custom Slot Type: No value in intent 【发布时间】:2017-07-31 23:43:03 【问题描述】:

我已经在亚马逊开发者论坛上发布了这个问题,但在那里没有收到答案。我猜 *** 从一开始就应该是首选:

根据我的理解,如果我使用自定义插槽类型,即使其可能值列表不包含口语单词,口语单词仍会传递给函数。文档说

自定义槽类型不等同于枚举。如果被口语理解系统识别,列表之外的值仍可能返回。

现在我有一个自定义插槽类型 LIST_OF_PERSONS,其值为 Matthias|Max

EmployeeDetailsIntent Person 

如果我使用不在LIST_OF_PERSONS 中的值调用此意图,则 Intent 仍会被调用,但 JSON 不包含插槽的“值”键:

"request": 
    "type": "IntentRequest",
    "requestId": "EdwRequestId.a943e233-0713-4ea5-beba-d9287edb6083",
    "locale": "de-DE",
    "timestamp": "2017-03-09T14:38:29Z",
    "intent": 
      "name": "EmployeeDetailsIntent",
      "slots": 
        "Person": 
          "name": "Person"
        
      
    
  

这是“按设计工作”还是错误?那么我如何访问 Intent 中的口语单词呢? this.event.request.intent.slots.Person.value 未定义?

我的代码位于 AWS lambda 中,我使用的是 nodejs alexa-sdk 版本 1.0.7。我的技能语言是德语。

【问题讨论】:

奇怪。我从来没有遇到过插槽信息中缺少“值”属性的情况。我要注意的一件事是,我的自定义插槽的单词列表是行分隔的。您似乎在使用条形分隔符? 条形/管道分隔符正是亚马逊开发控制台向我展示的摘要。当我编辑值时,它们会根据需要进行行分隔 那么我只能建议您尝试使用 en-US 区域设置相同的技能和意图,因为问题可能是 de-DE 特有的,因为它更新且使用较少。 【参考方案1】:

(免责声明:这篇文章总结了我自己的“解决方法”。它可能是也可能不是“最好的方法”。似乎对我有用,所以我想在这里简要分享/记录它)

我最近遇到了类似的问题,表达如下:

"tell me about townName"

如果我说"tell me about London",它会起作用。

如果我说"tell me about"(故意遗漏townName),程序“死”(并返回一个与您的相似的JSON,带有未定义的this.event.request.intent.slots.townName.value

虽然我不能 100% 确定这是一个“功能”(即我们需要编写更智能的代码来解决这个问题)还是“问题”(即 Alexa 团队需要解决或修复)。这种情况最近在我的认证过程中引起了一个真正的问题。

为了解决这个问题,我实施了一种解决方法(或修复,无论你怎么称呼它),以避免 Alexa 由于这种极端情况而“死亡”。

从 Alexa skill-sample-nodejs-trivia index.js 文件中,我找到了一个帮助我解决此问题的 sn-p 函数(为简单起见,我对其进行了一些编辑):

function isAnswerSlotValid(intent) 
    var answerSlotFilled = intent && intent.slots &&
        intent.slots.townName && intent.slots.townName.value;
    return answerSlotFilled

(即此函数返回 True 用于插槽 townName 的有效值和 False 用于未定义/否则)。

在定义意图时,我可以使用这个函数来“绕过”一个空槽值场景:

var startHandlers = Alexa.CreateStateHandler(states.START,

  // bla bla bla//

  "AnswerIntent": function()   

    // handel missing slot value
    var answerSlotValid = isAnswerSlotValid(this.event.request.intent);

    if (answerSlotValid && moreConditions) 
      // do something fun
    
    else 
      // handle empty slot scenario
    
  

  // bla bla bla//


有兴趣看看是否有更好/更“正确”的解决方案来更优雅地处理空/未定义的插槽。

【讨论】:

【参考方案2】:

我已经看到当意图同时具有带槽和不带槽的话语时会发生这种情况。例如:

myIntent 是什么让汽车开得快 myIntent 是什么让 CAR_TYPE 跑得快

CAR_TYPE 包含不同类型汽车的列表。

myIntent 仍然需要在 schema 中为 myIntent 定义 slot CAR_TYPE,但是第一个 Intent 没有使用它。 在这种情况下,最好在 CAR_TYPE 中包含“car”并消除第一个话语。但在其他情况下,句子语法确实不允许这样做,所以你需要期待一个空槽,就像你看到的那样。

【讨论】:

【参考方案3】:

我认为问题在于使用自定义槽类型的话语必须与至少一个其他值一起使用。

例如

EmployeeDetailsIntent get Person

会起作用,而

EmployeeDetailsIntent Person 

不会

【讨论】:

【参考方案4】:

有同样的事情,获取自定义插槽名称,但 Json 输入中缺少值。使用普通插槽。使用 Alexa 开发者控制台。必须在我的自定义槽值中添加一个“ID”值,然后我开始获取值。我以为我以前尝试过,但也许我没有在每个值上加上一个 ID。尽管其他答案对我不起作用,但这对我有用。

【讨论】:

以上是关于Alexa 自定义插槽类型:没有意图的价值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Alexa Skill 中的用户随机输入中提取自定义插槽

取消意图未调用 Alexa

如何在 Alexa 插槽中获取单个字母

Alexa 技能交互模型不确定自定义插槽

Amazon Alexa 录制自定义词

导出 Amazon Alexa 插槽和意图