代码之家  ›  专栏  ›  技术社区  ›  Bill Software Engineer

当已经在对话框中时,如何处理“取消”意图?

  •  1
  • Bill Software Engineer  · 技术社区  · 6 年前

    在MicrosoftBot框架中,我已经开始了一个对话,并且有一些运行的意图,比如说“登录”,但是当我询问用户用户名或密码时,他可能会说“取消那个”或“取消登录”,我如何得到这个意图:“取消”以及如何通过取消当前对话框来处理它?

    // Login Dialog
    bot.dialog('login', [
        (session:Builder.Session) => {
            Builder.Prompts.text(session, 'What\'s your account email?');
        },
        (session:Builder.Session, results: any) => {
            session.dialogData.email = results.response;
            Builder.Prompts.text(session, 'What\'s your password?');
        },
        (session:Builder.Session, results: any) => {
            session.dialogData.passWord = results.response;
            CheckAccountLogin(session, session.dialogData.email,session.dialogData.passWord)
                .then((result:boolean)=>{
                    if(result === true){
                        session.send('Login Successful');
                        session.userData.loginSuccessful = true;
                        session.userData.email = session.dialogData.email;
                    }else{
                        session.userData.loginSuccessful = false;
                    }
                    session.endDialog();
                });
        },
    ]);
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Javier Capello    6 年前

    参考本文: https://docs.microsoft.com/en-us/azure/bot-service/nodejs/bot-builder-nodejs-recognize-intent-messages?view=azure-bot-service-3.0

    你基本上可以注册一个 CancelIntent

    bot.recognizer(new builder.RegExpRecognizer( 
        "CancelIntent", 
        { en_us: /^(cancel|nevermind)/i, ja_jp: /^(キャンセル)/ })
    );
    

    这将使用正则表达式来检测用户何时要取消,而取消当前对话框的一种方法就是结束对话:

    bot.dialog('CancelDialog', function (session) {
        session.endConversation("Ok, cancelling loggin.");
    }).triggerAction({ matches: 'CancelIntent' });
    

    注意,上面的代码告诉bot框架结束对话,因此登录对话框将结束,从而取消操作。

    以下是一些有用的示例: https://github.com/Microsoft/BotBuilder-Samples/blob/master/Node/intelligence-LUIS/app.js

    编辑

    // Make sure you add code to validate these fields
    var luisAppId = process.env.LuisAppId;
    var luisAPIKey = process.env.LuisAPIKey;
    var luisAPIHostName = process.env.LuisAPIHostName || 'westus.api.cognitive.microsoft.com';
    
    const LuisModelUrl = 'https://' + luisAPIHostName + '/luis/v2.0/apps/' + luisAppId + '?subscription-key=' + luisAPIKey;
    
    // Create a recognizer that gets intents from LUIS, and add it to the bot
    var recognizer = new builder.LuisRecognizer(LuisModelUrl);
    

    然后将Luis识别器注册到:

    bot.recognizer(recognizer);
    

    您的取消对话框应该看起来相同,它将与 triggerAction.matches :

    bot.dialog('CancelDialog',函数(会话){
    }).triggerAction({matches:'CancelIntent});
    

    一旦你有了这个设置,创建 取消意向 在Luis应用程序中,添加一些示例语句(至少三个),一旦检测到CancelIntent,会话应该自动转发到CancelDialog。

    这里有更多信息: https://docs.microsoft.com/en-us/azure/bot-service/nodejs/bot-builder-nodejs-recognize-intent-luis?view=azure-bot-service-3.0

        2
  •  0
  •   Bill Software Engineer    6 年前

    另一种方法是使用内置的cancel事件。路易斯仍然会工作。这是基于哈维尔的回答:

    // Setup Luis Recognizer first:
    const LuisModelUrl = 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/' + LuisID + '?subscription-key=' + LuisKey;
    var recognizer = new Builder.LuisRecognizer(LuisModelUrl);
    bot.recognizer(recognizer);
    
    // Dialog definition
    bot.dialog('login', [
        (session:Builder.Session) => {
            // Your dialog stuff here
        }
    ]).cancelAction(
        "Cancel", "What would you like to do next?",
        {
            matches: "Cancel",
            confirmPrompt: "This will cancel your dialog.  Are you ure?"
        }
    );