Botframework 如何处理对话结束以在QnA multi turn中启动另一个对话框-Microsoft.Bot.Builder.AI.QnA.Dialogs.QnAMakerDialog

Botframework 如何处理对话结束以在QnA multi turn中启动另一个对话框-Microsoft.Bot.Builder.AI.QnA.Dialogs.QnAMakerDialog,botframework,azure-bot-service,qnamaker,Botframework,Azure Bot Service,Qnamaker,我已经在我们的bot中实现了多回合QnA,并使用了这个类 现在,我想扩展它的功能,以便在多人交谈之后,bot可以询问用户对话是否有帮助?如果没有,则bot将要求向帮助台记录问题 通过重写dialog.EndDialogAsync方法,我可以捕获多回合对话的结束,但无法从那里启动另一个对话。请帮忙 public class QnAMultiTurnBase : QnAMakerDialog { // Dialog Options parameters public readonly

我已经在我们的bot中实现了多回合QnA,并使用了这个类

现在,我想扩展它的功能,以便在多人交谈之后,bot可以询问用户对话是否有帮助?如果没有,则bot将要求向帮助台记录问题

通过重写dialog.EndDialogAsync方法,我可以捕获多回合对话的结束,但无法从那里启动另一个对话。请帮忙

public class QnAMultiTurnBase : QnAMakerDialog
{
    // Dialog Options parameters
    public readonly string DefaultNoAnswer = Configuration.Messages("Troubleshoot", "NoAnswer");//"No QnAMaker answers found.";
    public readonly string DefaultCardTitle = Configuration.Messages("Troubleshoot", "DidYouMean");//"Did you mean:";
    public readonly string DefaultCardNoMatchText = Configuration.Messages("Troubleshoot", "NoneOfTheAbove");//"None of the above.";
    public readonly string DefaultCardNoMatchResponse = Configuration.Messages("Troubleshoot", "Feedback");//"Thanks for the feedback.";

    private readonly BotServices _services;
    private readonly IConfiguration _configuration;
    //private readonly IStatePropertyAccessor<Dictionary<string, string>> troubleshootQuery;
    private readonly Dictionary<string, string> qnaPair = new Dictionary<string, string>();
    private readonly string qnAMakerServiceName;

    /// <summary>
    /// Initializes a new instance of the <see cref="QnAMakerBaseDialog"/> class.
    /// Dialog helper to generate dialogs.
    /// </summary>
    /// <param name="services">Bot Services.</param>
    public QnAMultiTurnBase(BotServices services, IConfiguration configuration, string qnAMakerServiceName) : base()
    {
        this._services = services;
        this._configuration = configuration;
        this.qnAMakerServiceName = qnAMakerServiceName;
    }

    protected async override Task<IQnAMakerClient> GetQnAMakerClientAsync(DialogContext dc)
    {
        return this._services?.QnAServices[qnAMakerServiceName];
    }

    protected override Task<QnAMakerOptions> GetQnAMakerOptionsAsync(DialogContext dc)
    {
        return Task.FromResult(new QnAMakerOptions
        {
            ScoreThreshold = DefaultThreshold,
            Top = DefaultTopN,
            QnAId = 0,
            RankerType = "Default",
            IsTest = false
        });
    }

    protected async override Task<QnADialogResponseOptions> GetQnAResponseOptionsAsync(DialogContext dc)
    {
        var noAnswer = (Activity)Activity.CreateMessageActivity();
        noAnswer.Text = this._configuration["DefaultAnswer"] ?? DefaultNoAnswer;

        var cardNoMatchResponse = MessageFactory.Text(DefaultCardNoMatchResponse);

        var responseOptions = new QnADialogResponseOptions
        {
            ActiveLearningCardTitle = DefaultCardTitle,
            CardNoMatchText = DefaultCardNoMatchText,
            NoAnswer = noAnswer,
            CardNoMatchResponse = cardNoMatchResponse,
        };

        return responseOptions;
    }

    public override Task EndDialogAsync(ITurnContext turnContext, DialogInstance instance, DialogReason reason, CancellationToken cancellationToken = default(CancellationToken))
    {
       try
       {
           // end of multi turn convversation
           // ask if conversation helped the user or not
       }
       catch (Exception)
       {
           turnContext.SendActivityAsync(MessageFactory.Text(Configuration.Messages("UnknownError"))).Wait();
           throw;
       }

       return base.EndDialogAsync(turnContext, instance, reason, cancellationToken);
    }
}
公共类QnAMultiTurnBase:QnAMakerDialog
{
//对话框选项参数
公共只读字符串DefaultNoAnswer=Configuration.Messages(“疑难解答”、“NoAnswer”);/“未找到QnAMaker答案。”;
公共只读字符串DefaultCardTitle=Configuration.Messages(“疑难解答”、“DidYouMean”);/“您的意思是:”;
public readonly string DefaultCardNoMatchText=Configuration.Messages(“疑难解答”、“非上述”);/“上述内容均无效。”;
公共只读字符串DefaultCardNoMatchResponse=Configuration.Messages(“疑难解答”、“反馈”);/“感谢您的反馈。”;
专用只读BotServices\u服务;
专用只读IConfiguration\u配置;
//专用只读IStatePropertyAccessor疑难解答查询;
专用只读词典qnaPair=新词典();
私有只读字符串qnAMakerServiceName;
/// 
///初始化类的新实例。
///对话框帮助器以生成对话框。
/// 
///机器人服务。
公共QnAMultiTurnBase(BotServices服务,IConfiguration配置,字符串qnAMakerServiceName):base()
{
这是。_服务=服务;
这个。_配置=配置;
this.qnAMakerServiceName=qnAMakerServiceName;
}
受保护的异步重写任务GetQnAMakerClientAsync(DialogContext dc)
{
返回此。_services?.QnAServices[qnAMakerServiceName];
}
受保护的覆盖任务GetQnAMakerOptionsAsync(DialogContext dc)
{
返回Task.FromResult(新的QnAMakerOptions
{
ScoreThreshold=DefaultThreshold,
Top=DefaultTopN,
QnAId=0,
RankerType=“默认”,
IsTest=假
});
}
受保护的异步覆盖任务GetQnaResponseOptions同步(DialogContext dc)
{
var noAnswer=(Activity)Activity.CreateMessageActivity();
noAnswer.Text=this.\u配置[“DefaultAnswer”]??DefaultNoAnswer;
var cardNoMatchResponse=MessageFactory.Text(DefaultCardNoMatchResponse);
var responseOptions=新的QnADialogResponseOptions
{
ActiveLearningCardTitle=DefaultCardTitle,
CardNoMatchText=DefaultCardNoMatchText,
NoAnswer=NoAnswer,
CardNoMatchResponse=CardNoMatchResponse,
};
返回响应选项;
}
公共覆盖任务EndDialogAsync(ITurnContext turnContext,DialogInstance实例,DialogReason原因,CancellationToken CancellationToken=default(CancellationToken))
{
尝试
{
//多回合谈判结束
//询问对话是否有助于用户
}
捕获(例外)
{
turnContext.SendActivityAsync(MessageFactory.Text(Configuration.Messages(“未知错误”))).Wait();
投掷;
}
返回base.EndDialogAsync(turnContext、实例、原因、cancellationToken);
}
}
您可以参考文档,其中指定了如何创建自己的提示以收集用户输入。机器人和用户之间的对话通常涉及向用户询问(提示)信息、解析用户的响应,然后根据该信息采取行动

对话框操作–能够控制对话框、开始对话框、重复对话框、结束对话框等

请按照下面的指示进行多次转弯


添加一个新对话框,并启动使用BeginDialogAsync添加的对话框:

AddDialog(新建MoreHelp())


return await stepContext.BeginDialogAsync(nameof(MoreHelp)、UserInfo、cancellationToken)

你能分享你正在尝试的代码吗?代码分享!请检查EndDialogAsync方法。