将多个对话框添加到Microsoft botframework对话框堆栈

时间:2018-02-01 20:41:02

标签: azure botframework direct-line-botframework

根据Microsoft's Botframework Documentation here,通过triggerAction使用onSelectAction,如果用户的话语包含匹配的词组,则可以将对话框添加到堆栈顶部。

但是,如果用户的话语包含两个匹配的短语,那么如何在堆栈中添加多个对话框?

例如,如果用户说...

  

我想要一个汉堡和薯条

我想将burgers对话框和fries对话框添加到堆栈中,因此我们可以提出有关这两个对话框的问题。

我尝试过这样的事情:

bot.dialog('burgers', require('./burgers'))
    .triggerAction({
        matches: [/burger/i],
            onSelectAction: (session, args, next) => {
                session.beginDialog(args.action, args);
            }
    });

bot.dialog('fries', require('./fries'))
    .triggerAction({
        matches: [/fries/i],
            onSelectAction: (session, args, next) => {
                session.beginDialog(args.action, args);
            }
    });

以下是汉堡对话框的示例(薯条对话框是相同的):

var builder = require('botbuilder');
var Store = require('./store');

module.exports = [
    // Destination
    function (session) {
        session.send('Burger dialog test');
        builder.Prompts.text(session, 'I am just testing the burger dialog');
    },
    function (session, results, next) {
        session.send('Now we should go to the next dialog in the stack', results.response);
        session.endDialog();
    },

];

但是,只有一个对话框被调用...然后它就结束了游戏!

感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

正如您所发现的,一次只能触发一个对话框,因此,作为触发多个对话框的变通方法,我们可以先触发一个对话框并分析用户输入以调用不同的子对话框。

例如:

bot.dialog('addOrder', (session, args)=>{
    var text = session.message.text;
    var found = text.match(/burger/i);
    if(found!=null){
        session.beginDialog('burger');
    }
    var found = text.match(/fries/i);
    if(found!=null){
        session.beginDialog('fries');
    }    
}).triggerAction({
    matches: [/burger/i, /fries/i]
});

bot.dialog('burger',(session)=>{
    session.send("burgers");
    //logic of 'burger' dialog
    session.endDialog();
});

bot.dialog('fries', (session)=>{
    session.send("fries!");
    //logic of 'fries' dialog
    session.endDialog();
}); 

正如您在此处所见,我们可以使用正则表达式数组首先触发addOrder对话框,然后调用此addOrder对话框中的其他对话框。

或者你可以训练一个LUIS并在你的机器人中使用它:

const LuisModelUrl = 'YOUR-BOT-ENDPOINT';
var recognizer = new builder.LuisRecognizer(LuisModelUrl);
var intents = new builder.IntentDialog({recognizers:[recognizer]})
.matches('MyOrder',(session, args)=>{
   var entities = args.entities;
   //handle entities
});

bot.dialog('/',intents);

我创建了一个名为MyOrder的意图和两个名为MyOrder.BurgersMyOrder.Fries的实体,如下所示:

enter image description here