Могу ли я создать AWS Lex Bot, который отображает разные ответы на основе пользовательского ввода? - PullRequest
3 голосов
/ 19 марта 2019

Я пытаюсь создать бот lex, который позволяет пользователям узнавать о различных опциях.Например, он может рассказать пользователю о трех доступных продуктах.Я не могу найти документацию о том, как это сделать без использования лямбда-функции, и я не могу понять, как передать пользовательский ввод самого бота в лямбда-функцию, чтобы использовать простое «if / then»", а затем верните соответствующее сообщение.Кажется чрезмерным использование лямбда-функции, чтобы просто дать ответ, основанный на вводе, но я застрял.Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Чтобы пролить немного света на то, как работает бот Lex, сервис позволяет вам определять высказывания (условия «если»), которые он будет интеллектуально пытаться выполнить нечетким соответствием, чтобы определить, сказал ли пользователь что-то, что подходитодно из высказываний, которые вы определили.Вы можете объявлять и изменять эти высказывания в консоли AWS. примеры этого доступны здесь.

Часть "then" этого условного приложения - это место, где вы можете определить, что происходит послепользовательский ввод соответствует определенному высказыванию (состоянию), где обрабатываются некоторые базовые вычисления, проще всего в форме лямбда-функции.

Для чего-то простого, например, возврата статического текста / информации после выполнения условия: верните из вашей функции lambda_handler строку с правильным результатом.Базовая псевдокодовая реализация Python этого будет выглядеть следующим образом:

# Here's an implementation where you have an intent of a user asking 
# for more info about a particular object (info_type as defined in Lex console). 

def lambda_handler(event, context):    
  info_name = event['info_type']

  if info_name = 'business_hours':
      return "Our business hours are 9am-5pm"
  elif info_name = 'slogan':
      return "We're customer obsessed"
  else:
      return "Sorry, we don't have info about this!"

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

0 голосов
/ 20 марта 2019

Бот Lex сам по себе действительно хорош только для простых бесед с часто задаваемыми вопросами, в которых определенные входные данные имеют заранее определенные ответы. Но вы не можете установить ответы, основываясь на значениях слота, которые захватывает Лекс. У вас может быть очень ограниченный динамический отклик, когда эти значения слотов просто помещаются внутри отклика (представьте игру Mad Libs), но это все.

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


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

Amazon Lex - Использование лямбда-функций
Создание лямбда-функции (пример заказа цветов)
Установить лямбда-функцию в качестве кодового хука Lex Intent

Как только у вас настроена функция Lambda, и Lex готов передать обработанный пользовательский ввод как запрос Lex (также называемый «Событием»), вам придется обратить пристальное внимание на этот документ:

Формат запроса и ответа Lex

Входящий запрос имеет согласованный формат для доставки currentIntent, sessionAttributes, slots, inputTranscript (полный ввод пользователя) и многого другого. Это может показаться слишком сложным, но как только вы разберете его по основным компонентам, с ним действительно легко будет работать, чтобы получить динамические ответы. Просто убедитесь, что вы точно придерживаетесь формата запросов и ответов Lex.


Пример * * одна тысяча тридцать одна Вот пример для запуска вашей лямбда-функции (Node.js): // The JSON body of the request is provided in 'event'. // 'respondToLex' is the callback function used to return the Lex formatted JSON response exports.handler = (event, context, respondToLex) => { console.log( "REQUEST= "+JSON.stringify(event) ); //view logs in CloudWatch // INCOMING VARIABLES FROM REQUEST EVENT // ------------------------------------- var intentName = event.currentIntent.name; var slots = event.currentIntent.slots var sessionAttributes = event.sessionAttributes var userInput = event.inputTranscript // OUTGOING VARIABLES FOR RESPONSE // ------------------------------- var responseMsg = ""; var responseType = ""; var slotToElicit = ""; var error = null; var fulfillmentState = null; // DETERMINE RESPONSE BASED ON INTENTS AND SLOT VALUES // --------------------------------------------------- if (intentName == "intentA") { responseType = "Close"; responseMsg = "I am responding to intentA"; fulfillmentState = "fulfilled'; } elseif (intentName == "intentB") { if (slots["productChoice"] == null) { responseMsg = "I can tell that productChoice slot is empty, so I should elicit for it here. Which product would you like? Hat or Shoes?"; responseType = "ElicitSlot"; slotToElicit = "productChoice"; } else { if (slots["productChoice"]=="hat") { responseMsg = "I can tell you selected a hat, here is my dynamic response based on that slot selection."; } elseif (slots["productChoice"]=="shoes") { responseMsg = "I can tell you selected shoes, here is my dynamic response based on that slot selection."; } } } else { error = "Throw Error: Unknown Intent"; } // CREATE RESPONSE BUILDER for each responseType (could turn into functions) // ------------------------------------------------------------------------- if (responseType=="Close") { var response = [ "sessionAttributes" = sessionAttributes, "dialogAction" = [ "type" = responseType, "fulfillmentState" = fulfillmentState, "message" = [ "contentType" = "PlainText"; "content" = responseMsg, ] ] ]; } elseif (responseType == "ElicitSlot) { var response = [ "sessionAttributes" = sessionAttributes, "dialogAction" = [ "type" = responseType, "intentName" = intentName, "slots" = slots "slotToElicit" = slotToElicit, "message" = [ "contentType" = "PlainText"; "content" = responseMsg, ] ] ]; } responseJSON = JSON.stringify(response); console.log("RESPONSE= "+ responseJSON); // view logs in CloudWatch respondToLex(error, responseJSON); }

...