我正在尝试创建一个 lex 机器人,让用户了解不同的选项。例如,它可以告诉用户可用的三种不同产品。我似乎找不到有关如何在不使用 lambda 函数的情况下执行此操作的文档,而且我不知道如何将用户输入从机器人本身传递到 lambda 函数以使用简单的“if/then ",然后返回相应的消息。必须使用 lambda 函数来仅根据输入给出响应似乎有些过分,但我被卡住了。谢谢。
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 聊天机器人的最佳方式。
Lex 机器人本身仅适用于简单的常见问题解答对话,其中某些输入具有预定义的响应。但是您不能根据 Lex 捕获的槽值设置响应。您可能会有一个非常有限的动态响应,其中这些槽值只是放在响应中(想象一下 Mad Libs 游戏),但仅此而已。
只要您想根据用户输入创建真正动态的响应,您就需要使用 Lambda 函数来比较 Lex 请求并根据用户输入或槽值构建适当的响应。
文档
Amazon Lex - 使用 Lambda 函数
创建 Lambda 函数(例如 Order Flowers)
将 Lambda 函数设置为 Lex Intent 的代码挂钩
一旦您设置好 Lambda 函数并且 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);
}