Как вызвать бота QNA в диалоге с водопадом? - PullRequest
0 голосов
/ 08 ноября 2019

Скажем, пример, когда у нас есть 3 меню (выбора) в диалоге водопада на начальном этапе, когда пользователь выбрал третий вариант, система должна перейти к форме бота qna, это возможно?

1 Ответ

0 голосов
/ 08 ноября 2019

Узлы здесь вместо C #, но, надеюсь, это укажет вам правильное направление. Вы можете сделать это, вам просто нужно создать отдельный диалог QnA и вызвать его из своего водопада через await step.beginDialog(YOUR_QNA_DIALOG_NAME). Вы хотите, чтобы это диалоговое окно запрашивало вопрос на первом шаге, предоставляло ответ на втором шаге и (при желании) запрашивало, хотят ли они задать другой вопрос, чтобы вы могли выполнить цикл через replaceDialog. Если после начального выбора меню есть шаги, вы можете захотеть cancellAllDialogs вместо endDialog при их выходе, в противном случае бот подберет то место, на котором остановился в первом диалоговом окне.

Может быть более элегантный способсделать это, не используя диалоговое окно с водопадом, но я еще не нашел его.

Я предоставил пример диалога QnA ниже, но учтите, что в этом случае я использую его как действие по умолчанию, если нет намеренияраспознается, поэтому он использует код Activity.text из ActivityHandler вместо явного запроса пользователя, и он не зацикливается. Тем не менее, я думаю, что это может быть полезно.

// 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;
...