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

How to call a QNA bot with in a waterfall dialog?

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

此处使用 Nodejs 而不是 C#,但希望这会为您指明正确的方向。你可以做到这一点,你只需要创建一个单独的 QnA 对话框并通过 await step.beginDialog(YOUR_QNA_DIALOG_NAME) 从你的瀑布中调用它。您可能希望该对话框在第一步中提示问题,在第二步中提供答案,并且(如果需要)提示他们是否想问另一个问题,以便您可以通过 replaceDialog 循环。如果初始菜单选择后有步骤,您可能希望在它们退出时取消所有对话框而不是结束对话框,否则机器人会从第一个对话框中断的地方继续。

可能有更优雅的方法可以在不使用瀑布对话框的情况下执行此操作,但我还没有找到它。

我在下面提供了一个示例 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;