有没有办法在中断后将自定义数据返回到提示符?

时间:2018-04-24 05:57:47

标签: node.js nlp botframework bots luis

我希望我能清楚这个问题。 我的问题是我想使用简单的Luis触发对话框,只是将意图/实体发送回给定的当前对话框。

即我想从业务对话框中分离触发对话框,定义触发其唯一功能的对话框并返回相关数据,例如:

bot.dialog('NegativeAnswerTriggeredDialog', [
    (session, args, next) => {
        var response = { type: 'bool', value: false, index: 1, entity: 'No', score: 1};
        session.endDialogWithResult({ response:response });
    }
]).triggerAction({
    matches: 'NegativeAnswer',
    onSelectAction: (session, args, next) => {
        session.beginDialog(args.action, args);
    }
});

所以,请注意我只是准备一些对象,然后我将endDialogWithResult交给上一个对话框。

问题是提示无法识别此对象或此对象的格式,我不确定。有没有办法以接受它作为提示的有效输入的方式返回它?

BTW,我想在这里实现的目标是允许用户用自然语言回答提示。

1 个答案:

答案 0 :(得分:0)

我将基于您试图传递的Prompt.confirm对话框来假设您正在处理的提示类型为NegativeAnswerTriggeredDialog

问题是根据the BotBuilder Handle User Actions documentationtriggerAction是默认情况下清除了对话框堆栈。从文档中:

  

将triggerAction绑定到对话框会将其注册到机器人。触发后,triggerAction将清除对话框堆栈,并将触发的对话框推入堆栈。此操作最适合用于在会话主题之间切换或允许用户请求任意独立任务。如果要覆盖此操作将清除对话框堆栈的行为,请在triggerAction中添加onSelectAction选项。

您应该改用customActions,它直接绑定到bot而不是Dialog对象。

考虑我的代码示例,其中有Prompt.confirmPrompt.choice的对话框:

bot.dialog('GreetingDialog', [
    (session) => {
        session.send('You reached the Greeting intent. You said \'%s\'.', session.message.text);
        builder.Prompts.confirm(session, "Would you like to learn more?");
    }, (session, results) => {
        console.log(results.response);
        if (results.response) {
            session.endDialog("You're doing your part!");
        } else if (!results.response) {
            session.endDialog("Awwww....  no fun.");
        } else {
            session.endDialog("Something else is going on here.");
        }
    }
]).triggerAction({
    matches: 'Greeting'
});

bot.dialog('HelpDialog',[
    (session) => {
        session.send('You reached the Help intent. You said \'%s\'.', session.message.text);
        builder.Prompts.choice(session, "Pick something colorful", ["Red", "Yellow", "Blue"]);
    }, (session, results) => {
        switch(results.response.entity) {
            case "Red":
                session.endDialog("Red it is.");
                break;
            case "Yellow": 
                session.endDialog("Yellow it is.");
                break;
            case "Blue":
                session.endDialog("Blue it is.")
                break;
            default:
                session.endDialog("I have no idea what that is.");
        }
    }
]).triggerAction({
    matches: 'Help'
});

bot.customAction({
    matches: 'NegativeAnswer',
    onSelectAction: (session, args, next) => {
        session.endDialogWithResult({response: false});
    }
});

bot.customAction({
    matches: "PositiveAnswer",
    onSelectAction: (session, args, next) => {
        session.endDialogWithResult({response: true});
    }
});

bot.customAction({
    matches: "Red",
    onSelectAction: (session, args, next) => {
        session.endDialogWithResult({response: { index: 0, entity: 'Red', score: 1 }});
    }
});

bot.customAction({
    matches: "Yellow",
    onSelectAction: (session, args, next) => {
        session.endDialogWithResult({response: { index: 1, entity: 'Yellow', score: 1 }});
    }
});

bot.customAction({
    matches: "Blue",
    onSelectAction: (session, args, next) => {
        session.endDialogWithResult({response: { index: 2, entity: 'Blue', score: 1 }});
    }
});

Prompt.confirm是是/否提示,因此将“是”映射到true,将“否”映射到false。它不会占用您尝试传递的代码示例中的对象。在我的测试运行中,基于LUIS意图,我将“是”,“当然”和“是”设置为“是”。 “否定”,“否”和“我不这么认为”(以及其他变体)映射为“否”。在LUIS意向方面,您的设置可能有所不同。

另一方面,

Prompt.choice期望响应对象包含在“红色”,“蓝色”和“黄色”示例customAction中。在这种情况下,我针对适当的意图设置了“绯红色”,“栗色”,“琥珀色”,“天蓝色”等可能的发音。

只要您对每种Intent有预期的可能答案,它就应该映射到正确的答案。