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