【问题标题】:Sequential Waterfall Models with Complex Dialog flows Bot Framework C# v4具有复杂对话流的顺序瀑布模型 Bot Framework C# v4
【发布时间】:2018-11-29 06:40:46
【问题描述】:

我有 3 个独立的瀑布模型,它们由使用 Luis 的意图触发。 我想按顺序链接这 3 个模型,我一直遵循 PictureBot 编码风格,每个对话框/瀑布都有它的状态属性。

三种瀑布方法如下,

  • WaterFall_1 - 根据用户提供的过滤器查询 Azure 搜索,响应是名称列表
  • WaterFall_2 - 将执行一些 REST 操作,取名 waterFall_1
  • WaterFall_3 - 将再次执行一些 REST 操作,使用 WaterFall_1 中的名称

到目前为止,我一直在通过聊天窗口传递值,因为 3 个瀑布步骤是松散耦合的,用户可以将它们作为机器人的独立组件/功能调用,所以我的问题是

  1. 如何链接3个模型,即如果用户触发了瀑布_1,并转到2或3,则询问“用户”的对话框将被跳过?我在想,每个瀑布都需要一个全局和本地 Getter 和 Setter。

  2. 在 WaterFall_1 中,最后一个响应发送来自 Azure 搜索的查询结果,即“名称”,我应该立即 endDialog 还是 WaterFall_1 调用 WaterFall_2 和/如果 WaterFall_3 然后我 endDialog 为 3, 2,1?

该图可能会提供更多上下文Simple figure

【问题讨论】:

  • 我想您是在问如何保持从 waterFall 1 到其他瀑布的状态?这正是您要的吗?

标签: c# botframework


【解决方案1】:

在您的问题 1 中,您有大致的想法。您需要的是一个“共享”或全局状态,与 Bot Framework 的 CafeBot 中展示的状态不同(查看示例 => dotnet => #50 )。

如果您有一个“全局”状态集,您可以将在 Waterfall 1 中检索到的用户名列表保存到该状态。然后,当您的第二个或第三个瀑布通过您的 LUIS 意图调用时,您将瀑布 1 结果的状态访问器传递给瀑布 2 的父类,从而使其他瀑布可以访问它们。

如果您依赖 LUIS,则无需将它们按顺序排列。您可以使用 LUIS 让“搜索用户”触发器 WF1、“对用户执行 XYZ”触发器 2 和“对用户执行 ABC”触发器 3。这将使您的机器人对您的机器人用户不那么严格,因为他们可以进行搜索,然后根据需要执行 2 或 3 (或两者)。

我可以通过简单地向 Bot Framework MessageRoutingBot 添加一个额外的、基于瀑布的类来模拟这一点(samples => dotnet => #09)

这是“最喜欢的动物”提示的瀑布设置,包括从原始示例机器人访问 greetingState:

public TestDialog(IStatePropertyAccessor<TestState> testStateAccessor, IStatePropertyAccessor<GreetingState> greetingStateAccessor, ILoggerFactory loggerFactory)
        : base(nameof(TestDialog))
    {
        TestStateAccessor = testStateAccessor ?? throw new ArgumentNullException(nameof(testStateAccessor));
        GreetingStateAccessor = greetingStateAccessor ?? throw new ArgumentNullException(nameof(greetingStateAccessor));

        // Add control flow dialogs
        var waterfallSteps = new WaterfallStep[]
        {
                InitializeStateStepAsync,
                PromptForAnimalStepAsync,
                // PromptForCityStepAsync,
                DisplayTestStateStepAsync,
        };
        AddDialog(new WaterfallDialog(ProfileDialog, waterfallSteps));

        // AddDialog(new TextPrompt(NamePrompt, ValidateName));
        AddDialog(new TextPrompt(AnimalPrompt));
    }

使用 greetingState 访问器,它允许我继续从第二个瀑布按名称呼叫我的用户,而无需再次提示:

 private async Task<DialogTurnResult> GreetUser(WaterfallStepContext stepContext)
    {
        var context = stepContext.Context;
        var testState = await TestStateAccessor.GetAsync(context);
        var greetingState = await GreetingStateAccessor.GetAsync(context);

        // Display their profile information and end dialog.
        await context.SendActivityAsync($"Hi {greetingState.Name}, who likes {testState.Animal}s, nice to meet you!");
        return await stepContext.EndDialogAsync();
    }

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 2017-07-18
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多