3

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

4

2 回答 2

2

为了更深入地了解 Lex 机器人的工作原理,该服务使您能够定义话语(“if”条件),它会智能地尝试执行模糊匹配,以确定用户是否说了符合其中之一的内容。你定义的话语。您可以在 AWS 控制台中声明和修改这些话语,此处提供了示例。

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

对于一些简单的事情,比如一旦满足条件就返回静态文本/信息:从你的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!"

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

于 2019-03-19T19:45:58.950 回答
0

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

只要您想根据用户输入创建真正动态的响应,您就需要使用 Lambda 函数来比较 Lex 请求并根据用户输入或槽值构建适当的响应。


文档

Amazon Lex - 使用 Lambda 函数
创建 Lambda 函数(例如 Order Flowers)
将 Lambda 函数设置为 Lex Intent 的代码挂钩

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

Lex 请求和响应格式

传入的请求具有一致的格式,用于传递currentIntent、 the sessionAttributes、 the slots、 the inputTranscript(完整的用户输入)等。它可能看起来需要很多东西,但是一旦你将它解析成它的主要组件,那么为了构建动态响应,它真的很容易使用。只需确保您准确地遵循 Lex 请求和响应格式即可。


例子

这是您的 Lambda 函数 (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);  
}
于 2019-03-20T07:27:32.333 回答