Разрешить AWS Lex принимать любые пользовательские данные
Я создаю чат-бота, который задает пользователю вопрос с широким диапазоном возможных ответов, например:
Бот: "Что вы хотите, чтобы ваш пользователь сказал био?"
UserA: "Меня зовут Боб. # Чаты - это круто!!!"
или же
Пользователь B: "123"
Я хочу, чтобы Лекс принял практически любой пользовательский ответ. В настоящее время он будет повторять один и тот же вопрос, если ответ пользователя не совместим с существующим слотом.
Есть ли встроенный слот для этого или способ создать собственный слот, который ведет себя так?
4 ответа
Вы можете создать слот без какого-либо значения для намерения и снять соответствующий флажок. Затем в Lambda initialization and validation hook
просто захватить ввод пользователя из event['inputTranscript']
и назначьте это значение в слот.
Надеюсь, поможет.
У Lex нет AMAZON.SearchQuery, но один из способов подойти к нему - включить множество разнородных значений в перечисление SlotType, как это делается в боте Lex, созданном стеком CloudFormation из этого сообщения в блоге. Пользовательский тип слота в этом случае имеет 81 перечисляемое значение, включая -
- "работает в поддержку, хорошо для моей карьеры"
- "1234567890"
- "Два"
- "C"
- "Е"
- "начать викторину"
- "уволиться"
Значение слота в случае этого бота используется для поиска в экземпляре Elasticsearch.
Вы можете попробовать следовать по этому пути. Пользовательский тип слота может иметь до 10000 перечисляемых значений. Также обратите внимание, что опция "Expand Values" должна быть включена.
В пределах Lambda initialization and validation hook
ты можешь позвонить elicit slot
чтобы вернуть весь пользовательский ответ в качестве параметра.
Взгляните на некоторые примеры функций Lex lambda для примера использования elicit slot
,
Дополнительный способ, который я нашел для этого, заключается в проверке того, является ли расшифровка одной из строк подсказки слота. Если это так, то можно безопасно получить значение слота. Если нет, то вы, вероятно, уже получили значение слота и можете изменить его.
Вот простой пример получения слота обратной связи, когда бот получает запрос «Большой палец вверх» или «Большой палец вниз»:
current_intent = event["sessionState"]["intent"]
slot_to_elicit = event["proposedNextState"]["dialogAction"]["slotToElicit"]
transcript = event["inputTranscript"]
if slot_to_elicit and (transcript in ["Thumbs up", "Thumbs down"]):
response = elicit_feedback_slot(
slot_to_elicit=slot_to_elicit, intent=current_intent
)
else:
text = f"Thank you for your feedback!"
fulfillment_state = "Fulfilled"
response = close(
event=event,
fulfillment_state=fulfillment_state,
message_text=text,
)
Я знаю, что это все еще не идеальное решение, так как вам нужно явно соответствовать подсказкам слота. Возможно, используйте регулярное выражение или используйте Lex, получая интерпретируемое значение, а не расшифровку. Надеюсь, у Лекса когда-нибудь появится