深入理解Bot Framework SDK Dialog系统
分类: Azure机器人 ◆ 标签: #Azure Bot Framework SDK #Azure Bot Service #机器人 ◆ 发布于: 2023-08-07 22:59:56
为了让大家能快速了解Bot Framework SDK中的Dialog库,我们写了一个快速的Demo, 大家可以查看之前的这一篇文章: https://www.azuredeveloper.cn/article-use-dialog-control-chat-bot-session-flow 复习一下,本章我们深入的学习一下Dialog的架构。
第一个需要明确的概念就是Dialog的组件是一个有状态的系统,因此我们必须在启用聊天机器人的状态管理器,并将代表Dialog系统的状态变量存入到Bot的状态管理器中。
Dialog State
管理Dialog系统状态的类是DialogState, 为了管理状态在启动Dialog时就必须将DialogState的实例放入到状态管理器中,例如:
await _mainDialog.RunAsync(turnContext, _conversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
从这个代码可以看到我们调用了ConversationState的CreateProperty方法,为DialogState在状态管理器中创建了一个属性存取器。
回顾一下基本的理论,就是聊天机器人的工作原理是回合制,也就是用户发起一个会话,机器人回复一个会话,这就是一个Turn, 那么DialogState的作用就是在机器人和用户对话的多个Turn中保持会话的状态,这些状态包括:
- 所有激活的
Dialog - 当前运行的
Dialog和它的逻辑方法。
有了以上的信息之后,Dialog才可以根据规则跳至某一个步骤,或者循环执行等等。
我们来看一下其他的一些基本概念:
Dialog的基础设施
我们要理解微软在设计Dialog时的一些基础设施:
Dialog Set: 每一个Dialog应用,可能会包括多个主要的运行入口的Dialog, 同时每个入口Dialog会包含一个或者多个的Dialog, 那么在入口的Dialog需要一个属性来管理这些包含在它内部的激活的Dialog, 这个集合就是Dialog Set.- Dialog Context
: 这个够形象了,就是上下文,它提供所有激活的Dialog的信息,意义通过该接口对所有激活的Dialog`进行查询和操作。 Dialog instance: 激活的dialog实例,有影响的方法可以调用。Dialog Turn Result: 包含Activity的信息,最主要是可以用每个Dialog运行后返回的值,这些值可以用于操作或者判断。
Dialog的类型
常用的类型有这样几种:
Dialog: 根类。Container Dialog:CompontentDialog的父类,不直接使用。ComponentDialog: 通用的Dialog类,用户自定义Dialog的入口。WaterfallDialog: 用于定义一个系列的Dialog并且根据自定义的方法,循序执行。这个是一个非常重要的类。PromptDialog: 用于给用户的输入类,有不少子类,例如TextPrompt,NumberPrompt,ChoicePrompt等等。
另外还有一些Dialog类型,特别是Adaptive Dialog, 这个有时另外一个场景,虽然我们基于Code的场景也可以使用这个类。
注意
每个Dialog都时使用dialog id来引用的,这也是为什么每次顶一个Dialog类,都要加上`:base(nameof(yourdialogclassname))
到这里我们基本介绍完了Dialog库的基本原理,你可以结合之前的那篇文章尝试一下Dialog。