30

我正在使用 Alexa Skills Kit(用于 Amazon Echo)并想创建一种技能,将意图发送到 AWS Lambda 函数,该函数只会通过电子邮件将一些东西发回给我。

示例话语将是这样的:

MemoIntent take a memo {myMemo}
MemoIntent to take a memo {myMemo}
MemoIntent send a memo {myMemo}

这将允许我说“Alexa,让我的秘书做个备忘录,提醒我今天回家路上去商店”,然后会从我的 Lambda 函数中收到一封电子邮件,说“提醒我去我今天回家路上的商店。”

插槽是自由形式的myMemo——此时只需一两句话就可以了,但我在文档中没有找到很多关于如何为这样的东西编写模式的帮助。我目前最好的猜测失败了:

错误:您的请求有问题:未知插槽名称“{myMemo}”。发生在第 1 行的示例“MemoIntent take a memo {myMemo}”中。

我正在使用文档不鼓励使用的 AMAZON.LITERAL 插槽类型,但它也没有提供有关如何解决此问题的任何建议。此外,就像我提到的,它失败了。

这是失败的架构:

{
    "intents": [
        {
            "intent": "MemoIntent",
            "slots": [
                {
                    "name": "myMemo",
                    "type": "AMAZON.LITERAL"
                }
            ]
        }
    ]
}
4

5 回答 5

23

文字与其他插槽类型不同,因为您必须在示例话语中提供培训,如官方文档中所述: https ://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/alexa -skills-kit-interaction-model-reference

示例话语语法

示例话语将用户可以说出的短语映射到您定义的意图。它们被写成纯文本文件中的行,使用以下格式:

IntentName  this is a sample utterance with no slots
IntentName  this is a sample utterance containing a {SlotName}
IntentName  this is a sample utterance containing a {SlotName} and {AnotherSlotName}

请注意,上述格式适用于除 AMAZON.LITERAL 之外的所有插槽类型。对于 AMAZON.LITERAL,您还需要指定示例槽值:

IntentName  this is a sample utterance containing a {slot value|SlotName} using LITERAL

或者,使用自定义插槽将允许您在定义大量示例自定义插槽值后提供插槽。在这种情况下,您将创建一个名为 myMemo 的新自定义插槽,其类型为自定义插槽名称,例如MY_MEMO. 您的自定义槽值将填充潜在值(这些不是它会收到的唯一值),例如:

walk the dog
eat more bacon
go to the store on the way home
于 2015-12-04T00:29:37.167 回答
5

我们目前正在开发一种人工智能(用于 Alexa),它应该能够回答各种各样的问题。用户能够说出需要在后端分析的复杂问题是非常重要的。如果 Alexa 由于话语和插槽类型有限而提前放弃它们,我们将无法提供这样的服务。

目前我们正在尝试以下方法。(请记住,我们的实验是基于德语的。其他语言的行为可能会有所不同。)

1. 每个词类的自定义槽类型

我们为以下词类定义了自定义槽类型

  • 审讯(什么,谁,什么时候)
  • 项目(网络安全、暗网、恶意软件)
  • 动词(是、有、可以)
  • 形容词(流行的、廉价的、不安全的)
  • 代词 (the, he, she)

2. 句子结构的示例话语

然后我们为带有样本话语的句子定义了可能的结构

QuestionIntent {Interrogation}
QuestionIntent {Item}
QuestionIntent {Verb}
QuestionIntent {Adjective}
QuestionIntent {Interrogation} {Verb} {Item}
QuestionIntent {Interrogation} {Verb} {Item} {Adjective}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Pronoun} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Item} {Preposition} {Item}
QuestionIntent {Interrogation} {Verb} {Adjective} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Adjective} {Item}
QuestionIntent {Interrogation} {Item} {Verb}
QuestionIntent {Interrogation} {Item} {Verb} {Adjective}
QuestionIntent {Interrogation} {Item} {Verb} {Pronoun} {Adjective}
QuestionIntent {Item} {Verb} {Interrogation}
QuestionIntent {Verb} {Item} {Verb}
QuestionIntent {Verb} {Adjective} {Item} {Verb}

3. 后端 NLP 分析

然后我们在后端对提交的单词进行 NLP 分析。接收到的数据如下所示:

"intent": {
      "name": "QuestionIntent",
      "slots": {
        "Item": {
          "name": "Item",
          "value": "darknet"
        },
        "Preposition": {
          "name": "Preposition"
        },
        "Adjective": {
          "name": "Adjective"
        },
        "Verb": {
          "name": "Verb",
          "value": "is"
        },
        "Interrogation": {
          "name": "Interrogation",
          "value": "what"
        },
        "Pronoun": {
          "name": "Pronoun",
          "value": "the"
        }
      }
    }

有些词可能会丢失,有些词可能会听错。在这种情况下,我们会记住早期交流的主题,并用这些“填充”缺失的单词。例如:What is {it}?What is {Darknet}?

我们正在试验一个广泛的插槽类型列表。但这增加了听错的风险(英语中一个很好的例子是writeright,幸运的是它们没有被分配到同一个词类)。所以我们转向了一种非常狭窄的方法。列表仅包含可由 AI 处理并存储在知识库中的单词。例如,项目列表不包含单词ponyunicorn。我们希望这会产生更好的结果(更少令人困惑的答案)。

没有用话语结构定义的复杂句子使用起来非常容易混淆。例如,如果一个句子包含超过 2 个动词(这可能是构建时态所必需的)。但是到目前为止,只要用户表现出一定程度的礼貌,我们的方法就会产生具有良好准确性的结果。

但最后:不幸的是,目前,不可能用无数不同的单词和句子结构来口述备忘录之类的东西。

于 2017-08-24T09:14:00.263 回答
1

我尝试了另一种方法。

我创建了一个自定义插槽类型,其中包含这样的值列表。

wordOne
wordOne wordTwo
wordOne wordTwo wordThree
wordOne wordTwo wordThree wordFour
wordOne wordTwo wordThree wordFour wordFive

您可以根据需要使用尽可能长的字符串继续列表。

我的猜测是,Alexa 在尝试填充插槽时,会根据插槽类型的值中的空格分隔单词的数量来定位,以匹配它听到的内容。

使用这种自定义插槽类型,我在单个插槽中抓取整个句子取得了相当大的成功。尽管我从未在意图上测试过它,而不仅仅是将插槽作为话语。

但是,如果您将意图分开,它可能会起作用。也许是这样的。

StartMemoIntent take a memo
StartMemoIntent to take a memo
StartMemoIntent send a memo
StartMemoIntent record a memo
StartMemoIntent listen to my memo
RecordMemoIntent {memo}

但是,您必须小心,如果您没有足够的样本话语用于其他意图,它可能会混淆意图。

如果您使用 StartMemoIntent 放置足够多的示例话语(至少 7-8 个),那么选择正确的话语应该没有问题。

于 2017-12-15T09:21:42.487 回答
1

亚马逊搜索查询

AMAZON.SearchQuery插槽类型可让您捕获构成搜索查询的不太可预测的输入。

前任:

{
  "intents": [
    {
      "name": "SearchIntent",
      "slots": [
        {
          "name": "Query",
          "type": "AMAZON.SearchQuery"
        },
        {
          "name": "CityList",
          "type": "AMAZON.US_CITY"
        }
      ],
      "samples": [
        "search for {Query} near me",
        "find out {Query}",
        "search for {Query}",
        "give me details about {CityList}"
      ]
    }
  ]
}

更多关于AMAZON.SearchQuery 这里

AMAZON.LITERAL槽将槽值的识别词传递给没有转换的槽。但是,不推荐。您不能在使用AMAZON.LITERAL对话模型配置的技能中使用。

于 2018-09-01T07:18:04.690 回答
1

根据这里的一些评论,我发现您可以通过在自定义槽值字段中添加大量随机单词列表来让 Alexa 识别自由形式的单词或短语。

我通过运行生成了我的;

from nltk.corpus import words
import json

words_list = words.words()[:100]

values = []
for word in words_list: 
    value = {}
    value['id'] = None
    value['name'] = {}
    value['name']['value'] = word
    value['name']['synonyms'] = []
    values.append(value)

print(json.dumps(values))

然后将这些值复制粘贴到;

{
  "languageModel": {
    "types": [
      {
        "name": "phrase",
        "values": [values you get from above]
...
于 2018-02-03T19:32:41.527 回答