Разрешить 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, получая интерпретируемое значение, а не расшифровку. Надеюсь, у Лекса когда-нибудь появитсятип слота..

Другие вопросы по тегам