Отправка дополнительных сведений с помощью js SDK в Amazon Lex - PullRequest
2 голосов
/ 21 января 2020

Сценарий

Я хотел бы добавить функцию обратной связи, по поводу любых ответов от бота. Идея состоит в том, чтобы отправить пару ответа и вопроса с намеренным сообщением, например, большими пальцами вниз, а затем с помощью лямбда-функции сохранить его где-нибудь еще для будущих ссылок.

Вещи, которые я пробовал

Я использую JS SDK от Amazon lex для добавления на веб-сайт.

  1. Попытка добавления пары ключ-значение в requestAttributes, но метод postText выдает ошибку с сообщением Unexpected key 'requestAttributes' found in params, что является неожиданным, поскольку в руководстве для разработчиков оно упоминается там.

Документация URL

На основе той же документации я попытался добавить два слота в намерение с помощью last_question & last_response и отправлял их просто во входной строке, например: Thumbs down last_question last question last_answer last answer - этот я не понимаю, как это работает.

i. Есть ли лучший способ справиться с этим требованием?

ii. Как пользовательские слоты работают в одном запросе с несколькими данными, что я должен отправить в lex?

1 Ответ

2 голосов
/ 21 января 2020

я. Есть ли лучший способ справиться с этим требованием?

Из того, что я помню, postText - это просто способ вручную подключать и отправлять пользовательские входы к вашему боту Lex, вместо того, чтобы проходить через Facebook Messenger для пример. Так что postText не обрабатывает никакого распознавания слотов, намерений или чего-то подобного. Это все сделано Лексом, а затем обработано с помощью Lambda.

Так что я бы предложил использовать sessionAttributes, чтобы запоминать как last_question, так и last_response через несколько ходов. Затем снова используйте postText, чтобы просто отправить большие пальцы вверх или вниз по рейтингу.

Затем лямбда распознает вход рейтинга как свой собственный слот и извлечет last_question и last_response из sessionAttributes, а затем выполните сохранение и отслеживание рейтинговой системы по своему усмотрению.

Пример:

Пользователь : "... (Вопрос A) ... «

  1. postText передает вопрос А Лексу
  2. Лекс получает вопрос А, интерпретирует намерение и слоты и передает Лямбде
  3. Лямбда получает вход, намерение и данные слота
  4. Лямбда сохраняет вопрос A в sessionAttributes как last_question
  5. Лямбда определяет ответ A - правильный ответ
  6. Лямбда сохраняет ответ A в sessionAttributes as last_answer и переходит к Lex
  7. Lex получает Ответ A от Lambda и отвечает пользователю Ответом A

Bot : ". .. (Ответ А) .... Пожалуйста, оцените этот ответ. "

  1. Ответ Lex поступил через выходной канал.

Пользователь : «Недурно».

  1. postText проходит. Недурно до Лекса. -> Лекс интерпретирует. Лямбда получает.
  2. Лямбда сохраняет ввод пользователя как user_rating
  3. Лямбда находит last_question и last_answer в sessionAttributes
  4. Лямбда сохраняет last_question, last_answer и user_rating в базе данных
  5. Лямбда стирает last_question и last_answer с sessionAttributes для повторного запуска.
  6. Лямбда отвечает -> Лекс отвечает -> Выходной канал отображает ответ.

Бот : «Спасибо, пожалуйста, задайте еще один вопрос.»


ii. Как пользовательские слоты работают в одном запросе с несколькими сведениями, что я должен отправлять на lex?

Похоже, что у вас возникает путаница в том, что вы должны подготовить отформатированные данные перед отправкой в ​​Lex внутри postText, когда это намного проще, чем это. Просто передайте пользовательский ввод и позвольте Лексу разобраться в зависимости от того, как вы настроили намерения и слоты. Вот как это должно быть go для многослотового одиночного входа.

Lex получает пользовательский ввод в виде строки и пытается проанализировать строку на предмет намерений и слотов, ища наилучшие совпадения. Вы просто подготавливаете консоль Lex с намерениями и слотами, а также настраиваемыми слотами и значениями слотов, чтобы повысить точность ее соответствия.

Итак, предположим, вы знаете, что пользователь может предоставить один ввод с несколькими сведениями, которые вы хотели бы поймать например, отдельные слоты:

«Сколько времени в Нью-Йорке?»

Вы, вероятно, хотите уловить тип вопроса, поэтому у вас есть слот для определить, запрашивает ли пользователь «время», «погоду» или «население». Таким образом, они будут сделаны как один слот question_type, с этими параметрами в качестве значений слотов.

Тогда вы также захотите узнать, о чем идет речь, чтобы у вас был другой слот, чтобы определить, спрашивал ли пользователь о «Нью-Йорк» или «Париж» или «Бангкок». Таким образом, они будут сделаны как один слот question_location с этими параметрами в качестве значений слотов.

После того, как вы подготовите эти слоты и значения слотов в консоли Lex, вы также захотите подготовить Lex для этого типа. ввод, сужая, где в предложении Лекс, вероятно, найдет, какие слоты. Это были бы высказывания для этого намерения, помещающие имена слотов внутри фигурных скобок "{}":

что такое {question_type} в {question_location}

Тогда представьте себе больше способов и в разных порядках, которые пользователь может задать эти вопросы:

что {question_type} это в {question_location}
in {question_location} что такое {question_type}

Lex проанализирует вход и заполнит слоты тем, что было обнаружено в этой части вход. Затем в Lambda вы сравниваете слоты с тем, что ожидаете, и определяете лучший ответ.

...