Amazon web services 我可以创建一个AWS Lex Bot,根据用户输入显示不同的响应吗?

Amazon web services 我可以创建一个AWS Lex Bot,根据用户输入显示不同的响应吗?,amazon-web-services,aws-lambda,aws-lex,Amazon Web Services,Aws Lambda,Aws Lex,我试图创建一个lex机器人,让用户了解不同的选项。例如,它可以告诉用户三种不同的产品。我似乎找不到有关如何在不使用lambda函数的情况下执行此操作的文档,我也不知道如何将用户输入从bot本身传递到lambda函数,以便使用简单的“if/then”,然后返回相应的消息。使用lambda函数仅仅根据输入给出响应似乎有些过分,但我被卡住了。谢谢。为了进一步了解Lex bot的工作原理,该服务允许您定义话语(“如果”条件),它将智能地尝试执行模糊匹配,以确定用户所说的话是否符合您定义的话语之一。您可以

我试图创建一个lex机器人,让用户了解不同的选项。例如,它可以告诉用户三种不同的产品。我似乎找不到有关如何在不使用lambda函数的情况下执行此操作的文档,我也不知道如何将用户输入从bot本身传递到lambda函数,以便使用简单的“if/then”,然后返回相应的消息。使用lambda函数仅仅根据输入给出响应似乎有些过分,但我被卡住了。谢谢。

为了进一步了解Lex bot的工作原理,该服务允许您定义话语(“如果”条件),它将智能地尝试执行模糊匹配,以确定用户所说的话是否符合您定义的话语之一。您可以在AWS控制台中声明和修改这些语句

这个条件应用程序的“then”部分是定义用户输入与定义的语句(状态)匹配后发生的事情,其中一些基本计算是以Lambda函数的形式处理的,最容易实现

对于满足条件后返回静态文本/信息之类的简单操作: 从
lambda_处理程序
函数返回一个结果正确的字符串。这方面的一个基本伪代码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!"

根据您希望如何设置应用程序,您可以决定如何在不同的语句之间分割逻辑,以及在传递了prop数据的if/then案例中分割逻辑。如果您有更复杂的查询、问题类型和计算,这些都将决定构建Lex聊天机器人的最佳方式。

Lex聊天机器人本身仅适用于某些输入具有预定义响应的简单常见问题解答对话。但是,您不能基于插槽值设置响应。您可能会有一个非常有限的动态响应,这些插槽值只是放在响应中(想象一个疯狂的Libs游戏),但仅此而已

只要您希望基于用户输入创建真正的动态响应,那么您就需要使用Lambda函数来比较Lex请求,并基于用户输入或插槽值构建适当的响应


文档

一旦您设置了Lambda函数,并且Lex准备好将处理后的用户输入作为Lex请求(也称为“事件”)传递,那么您必须密切关注本文档:

传入的请求具有一致的格式,用于传递
currentIntent
sessionAttribute
插槽
inputTranscript
(完整用户输入)等。它可能看起来很难理解,但是一旦你把它解析成它的主要组件,那么为了构建动态响应,它就非常容易使用了。只需确保您完全遵循Lex请求和响应格式即可


例子 以下是Lambda函数(Node.js)的开始示例:


嗨,杰夫,欢迎来到SO,谢谢你的邀请。为什么您认为使用Lambda是过度的?也许您可以提供一些代码示例,帮助更好地理解您的问题,而您在标题中提出的问题将通过以下回答得到回答,如果不理解为什么Lambda不是一个可行的选项,很难为您的用例提供额外的建议。谢谢您的及时回复。我看到您编写的函数需要接收两个项,“事件”和“上下文”。在Lex中,我如何指定应该传递给Lambda函数的内容?没问题!在文档()中本页的“定义静态响应卡”部分,您可以看到一些示例,这些示例定义了用户响应的特定术语(称为插槽)将如何与话语相匹配,以及示例图像
// 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);  
}