首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有复杂对话框流Bot框架C# v4的序贯瀑布模型

具有复杂对话框流Bot框架C# v4的序贯瀑布模型
EN

Stack Overflow用户
提问于 2018-11-18 14:21:11
回答 1查看 781关注 0票数 3

我有三个独立的瀑布模型,这是由意图使用路易斯。我想按顺序链接这三个模型,我一直遵循PictureBot编码风格,每个对话框/瀑布都有状态属性。

3种瀑布方法如下,

  • WaterFall_1 - Query搜索,基于用户提供的过滤器,响应是一个名称列表。
  • WaterFall_2 -将执行一些REST操作,取自waterFall_1的名称
  • WaterFall_3 -将再次执行一些REST操作,取自WaterFall_1的名称

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

  1. 如何链接这3种模型(如果用户已经触发了waterfall_1,然后转到2或3,就跳过了“用户”被问到的对话框?)我在想,我需要一个全局和本地的获取器和设置为每个瀑布。
  2. 在WaterFall_1中,最后一个响应发送来自Azure搜索的查询结果,即“名称”,是在endDialog之后还是WaterFall_1调用WaterFall_2和/if WaterFall_3,然后i endDialog为3,2,1?

这个数字可能会提供更多的上下文简单图形

EN

回答 1

Stack Overflow用户

发布于 2018-11-28 22:40:46

在问题1中,您有了大致的想法。您需要的是一个“共享”或全局状态,这与Bot的CafeBot中所演示的状态没有什么不同(参见示例=> dotnet => #50)。

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

如果你依赖路易斯,你就不需要把它们按顺序排列。您可以使用LUIS来让‘搜索用户’触发器WF1,‘对用户的触发器2执行XYZ,以及’对用户执行ABC‘触发器3。这将使您的bot对您的bot用户来说不那么严格,因为他们可以进行搜索,然后根据需要执行2或3 (或两者兼用)。

我能够通过在Bot中添加一个额外的基于瀑布的类来模拟这个过程(示例=> dotnet => #09)

下面是“最喜欢的动物”提示的瀑布设置,包括从原始示例bot访问greetingState:

代码语言:javascript
运行
复制
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访问器,我就可以继续从第二个瀑布调用用户的名字,而不需要重新提示:

代码语言:javascript
运行
复制
 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();
    }

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53361886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档