如何在瀑布对话框中调用QNA机器人?

时间:2019-11-08 17:07:34

标签: c# botframework chatbot qnamaker

说一个例子,当我们在初始步骤的瀑布对话框中有3个菜单(选项)时,当用户选择了第三个选项时,系统应接管qna bot形式,那有可能吗?

1 个答案:

答案 0 :(得分:0)

这里使用Nodejs而不是C#,但希望这会为您指明正确的方向。您可以执行此操作,只需要创建一个单独的QnA对话框并通过await step.beginDialog(YOUR_QNA_DIALOG_NAME)从您的瀑布中调用它即可。您可能希望该对话框在第一步中提示问题,在第二步中提供答案,并且(如果需要)提示他们是否要问其他问题,以便您可以通过replaceDialog循环。如果在初始菜单选择之后还有步骤,则您可能希望在退出时使用cancellAllDialogs而不是endDialog,否则该自动程序将在第一个对话框结束的地方继续操作。

也许有一种更优雅的方法可以不使用瀑布对话框来执行此操作,但是我还没有找到它。

我在下面提供了一个示例QnA对话框,但是请注意,在这种情况下,如果没有识别出意图,我会将其用作默认操作,因此它使用了ActivityHandler中的activity.text而不是明确提示用户,并且它不会循环。不过,尽管这可能会有所帮助。

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

const { Dialog, MessageFactory } = require('botbuilder');
const { QnAServiceHelper } = require('../helpers/qnAServiceHelper');
const { CardHelper} = require('../helpers/cardHelper');

class QnADialog {

    constructor() {

    }

    async processAsync(oldState, activity){

        const defaultAnswer = `I'm sorry, I don't know how to help with that. Try asking a different question or type "Help" for options.`;
        var MINIMUM_SCORE = 50;

        var newState = null;
        var query = activity.text;
        var qnaResult = await QnAServiceHelper.queryQnAService(query, oldState);
        var qnaAnswer = qnaResult[0].answer;

        var prompts = null;
        if(qnaResult[0].context != null){
            prompts = qnaResult[0].context.prompts;
        }

        var outputActivity = null;
        if (prompts == null || prompts.length < 1) {
            if (qnaResult[0].score > MINIMUM_SCORE) {
                outputActivity = MessageFactory.text(qnaAnswer);
            } else {
                outputActivity = MessageFactory.text(defaultAnswer);
            }
        }
        else {
            var newState = {
                PreviousQnaId: qnaResult[0].id,
                PreviousUserQuery: query
            }

            outputActivity = CardHelper.GetHeroCard('', qnaAnswer, prompts);
        }

        return [newState, outputActivity , null];
    }  
}

module.exports.QnADialog = QnADialog;