如何定义不是列表的自定义插槽类型?

How do I define a custom slot type that isn't a list?

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

示例话语如下所示:

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

这将允许我说类似 "Alexa, ask my secretary to take a memo, remind me to go to the store on my way home today" 的内容,然后会收到一封来自我的 Lambda 函数的电子邮件,内容为 "remind me to go to the store on my way home today."

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

Error: There was a problem with your request: Unknown slot name '{myMemo}'. Occurred in sample 'MemoIntent take a memo {myMemo}' on line 1.

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

这是失败的架构:

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

字面量与其他插槽类型的不同之处在于,您必须提供示例话语的训练,如官方文档中所述: 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

我们目前正在开发一个 AI(用于 Alexa),它应该能够回答各种各样的问题。用户能够表达复杂的问题非常重要,这些问题将在后台进行分析。如果 Alexa 由于话语和插槽类型有限而提前放弃它们,我们将无法提供此类服务。

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

1.每个字的自定义插槽类型 Class

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

  • 审讯(什么,谁,什么时候)
  • 项目(网络安全、暗网、恶意软件)
  • 动词(是,有,可以)
  • 形容词(流行、便宜、不安全)
  • 代词(他,她)

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"
        }
      }
    }

有些词可能会丢失,有些词可能会听错。在这种情况下,我们会记住早期交流中的主题和 "fill" 缺少的单词。例如:What is {it}?What is {Darknet}?

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

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

但最后:不幸的是,目前无法口述像备忘录这样的东西,其中包含无数不同的单词和句子结构。

我尝试了另一种方法。

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

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

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

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

使用此自定义槽类型,我在单个槽中抓取整个句子取得了相当大的成功。虽然我从来没有在意图上测试过它,而不仅仅是作为话语的插槽。

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

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 个,那么选择正确的话语应该没有问题。

根据此处的一些评论,我发现您可以通过向自定义槽值字段添加大量随机单词列表来让 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]
...

AMAZON.SearchQuery

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 here

AMAZON.LITERAL 个插槽,它传递插槽值的已识别单词而不进行转换。但是,不推荐这样做。 您不能在配置了对话模型的技能中使用AMAZON.LITERAL