瀑布对话中的Microsoft Bot Framework LUIS

时间:2017-02-27 15:37:45

标签: node.js bots botframework luis

我有一个现有的瀑布对话。我想对它进行调整,以便它可以从更复杂的用户对机器人问题的响应中提取数据。

在我的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来做到这一点?

1 个答案:

答案 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对话框,并使用新提取的位置返回原始瀑布。