【问题标题】:Waterfall dialog prompts not working in bot framework瀑布对话框提示在 bot 框架中不起作用
【发布时间】:2019-10-11 16:22:07
【问题描述】:

我仍在尝试掌握机器人框架 v4 和对话框的概念。我正在尝试创建一个与 QnAMaker 和 LUIS 集成的简单机器人。两种集成都单独工作,但我无法将它们都集成。我也是第一次使用 ASP.NET Core。所以我的问题也可能与此有关。

所以我创建了一个基于this sample 的机器人。

我有一个继承 Dialog 类的基本对话框。基类公开了一个子对话框类继承的抽象函数。子类称为 RootDialog。

FunctionDialogBase:

    public FunctionDialogBase(string dialogId, IConfiguration configuration, ILogger logger) : base(dialogId)
    {
        Configuration = configuration;
        Logger = logger;
    }
    public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext dialogContext, object options = null, CancellationToken cancellationToken = default(CancellationToken))
    {   
        return await RunStateMachineAsync(dialogContext, cancellationToken).ConfigureAwait(false);
    }
    public override async Task<DialogTurnResult> ContinueDialogAsync(DialogContext dialogContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        return await RunStateMachineAsync(dialogContext, cancellationToken).ConfigureAwait(false);
    }

    //abstract method
    protected abstract Task<(object newState, IEnumerable<Activity> output, object result)> ProcessAsync(object oldState, 
        Activity activity,
        DialogContext dialogContext,
        SPEntityDetails spEntityDetails,
        CancellationToken cancellationToken);

    private async Task<DialogTurnResult> RunStateMachineAsync(DialogContext dialogContext, CancellationToken cancellationToken)
        {
            var (newState, output, result) = await ProcessAsync(oldState, dialogContext.Context.Activity, dialogContext, spEntityDetails, cancellationToken).ConfigureAwait(false);     
            //do some more logic here
        }
    }

RootDialog 从它的抽象方法实现中调用另一个名为 CreateSiteDialog 的对话框,如下所示:

根对话框:

    protected override async Task<(object newState, IEnumerable<Activity> output, object result)> ProcessAsync(
    object oldState, 
    Activity activity,
    DialogContext dialogContext,
    SPEntityDetails spEntityDetails, 
    CancellationToken cancellationToken)
    {
        dialogContext.Dialogs.Add(new CreateSiteDialog());
        await dialogContext.BeginDialogAsync(nameof(CreateSiteDialog),spEntityDetails, cancellationToken);
        return (null, new Activity[] { activity.CreateReply("Site created successfully.") }, null);
    }       

最后是有问题的 CreateSiteDialog。此对话框遵循瀑布模型,理论上应该从一个瀑布步骤移动到下一个瀑布步骤直到结束。这没有发生。当我在第一步中使用提示时,它会执行并退出瀑布对话框。下一个瀑布步骤永远不会执行。

创建站点对话框:

public class CreateSiteDialog : CancelAndHelpDialog
{
    public CreateSiteDialog() : base(nameof(CreateSiteDialog))
    {
        AddDialog(new TextPrompt(nameof(TextPrompt)));
        AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
        {
            ConfirmStepAsync,
            FinalStepAsync
        }));

        // The initial child Dialog to run.
        InitialDialogId = nameof(WaterfallDialog);
    }

    private async Task<DialogTurnResult> ConfirmStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        var spEntityDetails = (SPEntityDetails)stepContext.Options;
        var msg = @"Creating site: http://yoursiteurl/"  + spEntityDetails.SiteName + ". Confirm Yes/No.";          
        return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text(msg) }, cancellationToken);        
    }
    private async Task<DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        //handle propmt result from user action
    }
}

也没有错误。所以我假设我在使用对话框时做错了什么。请。任何帮助将不胜感激。

我正在使用 Visual Studio 2017、Bot Framework Emulator、Bot framework V4 和 Core Bot 项目。

【问题讨论】:

标签: c# asp.net-core botframework dialog-framework


【解决方案1】:

在我的一生中,我无法让瀑布对话框以该样本为基础工作(基本上不重写整个内容)。我建议您将您的机器人基于 11.qnamaker13.core-bot 的组合(它使用 LUIS,是 ComponentDialogs 的一个很好的例子)。我提出这个建议有两个原因:

  1. 您链接的示例是“实验性的”,这意味着它不仅没有准备好投入生产,而且可能永远不会。
  2. 您链接的示例使用状态机设计,任何其他机器人示例都没有使用过,也没有使用过,因此很难获得良好的支持。

为了让 QnAMaker 和 LUIS 协同工作,流程实际上将基于您的用例。我无法从您包含的代码中看出您要做什么。所以,这个答案主要是为了让瀑布对话框工作。

【讨论】:

  • 感谢 mdrichardson。在一些严重的头疼之后,我意识到样本的组合。我现在走在正确的轨道上。我确实偶然发现了一些可以解决这个问题的东西,但是如果没有更多的研究,我还没有资格将此称为答案。因此,如果我使用“await dialogContext.BeginDialogAsync”来调用瀑布对话框,则提示不起作用(不执行进一步的瀑布步骤)。但是如果我使用“return await dialogContext.BeginDialogAsync”,那么它们会按预期工作。可能更有经验的开发人员可以理解它。
  • @Surya 我知道不返回经常会导致瀑布对话框出现问题。不幸的是,实验样本太新了,我对它们不是很熟悉;它们甚至没有真正在内部使用,但在创作它们的 1-2 人之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多