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

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

例如,如果用户说...


我想要一个汉堡和薯条


我想将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();
    },

];


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

任何帮助表示赞赏!

最佳答案

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

例如:

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的实体,如下所示:

azure - 向Microsoft botframework对话框堆栈添加多个对话框-LMLPHP

关于azure - 向Microsoft botframework对话框堆栈添加多个对话框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48571383/

10-16 19:44