我有一个现有的瀑布对话。我想对它进行调整,以便它可以从更复杂的用户对机器人问题的响应中提取数据。
在我的LUIS应用程序中,我创建了一个名为GetLocation
的意图,该意图经过培训可以找到一个名为Location
的实体。这方面的一个例子是用户输入"我正在寻找布里斯托尔"这将匹配实体"布里斯托尔"。这就是我目前所拥有的:
function(session) {
builder.Prompts.text(session, "Hello... Which city are you looking in?");
},
function(session, results) {
session.privateConversationData.city = results.response;
builder.Prompts.number(session, "Ok, you are looking in " + results.response + ", How many bedrooms are you looking for?");
},
etc...
我想将响应字符串发送到LUIS并从中提取城市位置,而不是简单地存储响应字符串。我发现的所有LUIS示例都是为了匹配并转到新的Intents,但我只想保持瀑布对话。我如何利用LUIS来做到这一点?
答案 0 :(得分:0)
我认为您可以通过设置两个不同的对话框来实现此目的:
对话1:
这是您上面的对话框,正常的瀑布式对话框,可以驱动对话。
对话2:
将使用LUIS模型使用LUIS Intent识别器创建此对话框。对话框1将发出提示,然后将用户传递到此对话框并解析用户输入的文本。由于您的模型已经过训练以识别位置,因此您现在需要做的就是提取实体。
在对话框2使用LUIS解析位置信息并提取实体后,您将结束对话框并将实体(位置)返回到对话框1,该对话框仍将位于Dialog Stack上。
<强>代码强>
//create intent recognizer based on LUIS model
var luisModel = "<Your LUIS Model URL>";
var recognizer = new botbuilder.LuisRecognizer(luisModel);
//create dialog handler for info to be parsed by LUIS
var dialog = new botbuilder.IntentDialog({ recognizers: [recognizer] });
//root dialog
bot.dialog("/", [
function(session){
//prompt user and pop LUIS intent dialog onto dialog stack
session.send("Hello, which city are you looking in?");
session.beginDialog("/begin_loc_parse");
},
//this will be resumed after our location has been extracted
function(session, results){
//check for extracted location
if(results.entity){
//got location successfully
session.send("Got city from user: " + results.entity);
//resume normal waterfall with location.....
} else {
//start over
session.beginDialog("/");
}
}
]);
//LUIS intent dialog
dialog.matches("input_location", function(session, args){
//grab location entity
var city = botbuilder.EntityRecognizer.findEntity(args.entities, "builtin.geography.city");
if(city){
//pop the LUIS dialog off of the dialog stack
//and return the extracted location back to waterfall
session.endDialogWithResult(city);
} else session.endDialog("Couldn't extract city entity.");
});
//called if user doesn't enter something like "I am looking in [city]"
dialog.onDefault(function(session, args){
session.send("I'm sorry, I didn't quite catch that. In which city are you looking?");
});
所以基本上,在根对话框中,当你提示用户输入该位置,然后调用session.beginDialog("/begin_loc_parse")
时,你就会将对话传递给你的LUIS意图对话框。
用户在此点之后输入的任何文本都将由LUIS模型解释。这允许您使用模型识别并从用户提取位置信息。
然后,关键是使用session.endDialogWithResult()
从堆栈中弹出LUIS对话框,并使用新提取的位置返回原始瀑布。