Как определить тип пользовательского слота, который не является списком?
Я играю с Alexa Skills Kit (для Amazon Echo) и хочу создать навык, который отправит намерение функции AWS Lambda, которая просто отправит мне что-то обратно.
Примеры результатов будут примерно такими:
MemoIntent take a memo {myMemo}
MemoIntent to take a memo {myMemo}
MemoIntent send a memo {myMemo}
Это позволило бы мне сказать что-то вроде "Alexa, попросите моего секретаря взять памятку, напомнить мне, чтобы я пошел в магазин по дороге домой сегодня", а затем получит электронное письмо от моей функции лямбда, говоря: "Напомните мне сегодня идти в магазин по дороге домой".
Слот myMemo
представляет собой произвольную форму - на данный момент это будет только предложение или два, но я не нахожу много помощи в документации о том, как написать схему для чего-то вроде этого. Мое лучшее предположение в настоящий момент терпит неудачу с:
Ошибка: возникла проблема с вашим запросом: неизвестное имя слота '{MyMemo}'. В образце "MemoIntent" введите заметку {myMemo} ' строка 1.
Я использую тип слота AMAZON.LITERAL, который документация обескураживает, но он также не предлагает никаких предложений о том, как это сделать. И кроме того, как я уже упоминал, это терпит неудачу.
Ниже приведена схема:
{
"intents": [
{
"intent": "MemoIntent",
"slots": [
{
"name": "myMemo",
"type": "AMAZON.LITERAL"
}
]
}
]
}
Ответы
Ответ 1
Литералы отличаются от других типов слотов тем, что вы должны обеспечить обучение в выборочном произношении, как указано в официальной документации:
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
Ответ 2
В настоящее время мы разрабатываем ИИ (для Алекса), который должен отвечать на самые разные вопросы. Очень важно, чтобы пользователи могли формулировать сложные вопросы, которые должны анализироваться в бэкэнд. Если Алекса рано их катит из-за ограниченных высказываний и типов слотов, мы не можем предоставить такую услугу.
В настоящий момент мы экспериментируем со следующим подходом. (Имейте в виду, что наш эксперимент основан на немецком языке. Другие языки могут вести себя по-другому.)
1. Пользовательские типы слотов для класса слов
Мы определили пользовательские типы слотов для следующих классов слов:
- опрос (что, кто, когда)
- (кибербезопасность, темная сеть, вредоносное ПО)
- глагол (есть, имеет, может)
- прилагательное (популярное, недорогое, небезопасное)
- местоимение (он, она, она)
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-анализ представленных слов в бэкэнд. Полученные данные выглядят следующим образом:
"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}?
Мы экспериментировали с широким списком списков для типов слотов. Но это увеличивает риск неправильного восприятия чего-то (хороший пример на английском - это запись и право, к счастью, они не привязаны к одному классу слов). Поэтому мы переключились на очень узкий подход. Списки содержат только слова, которые могут обрабатываться ИИ и хранятся в базе знаний. Например, список предметов не содержит слов пони или единорога. Мы ожидаем, что это принесет лучшие результаты (менее путаные ответы).
Сложные предложения, не определенные с помощью структуры высказываний, очень запутывают работу. Например, если предложение содержит более двух глаголов (что может потребоваться для создания времени). Но пока наш подход приводит к результатам с хорошим уровнем точности, пока пользователь ведет себя с некоторой степенью вежливости.
Но в конце концов: К сожалению, на данный момент невозможно прописать что-то вроде памятки с бесконечным количеством разных слов и структур предложений.
Ответ 3
Я попробовал другой подход к этому.
Я создал Custom Slot Type со списком таких значений.
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}
Вы должны быть осторожны, однако, это может смутить намерения, если у вас недостаточно примеров высказываний для ваших других намерений.
Если вы поставили достаточно выборочных высказываний, по крайней мере 7-8, с помощью StartMemoIntent, у него не должно возникнуть проблемы с правильным выбором.