Skip to main content

深入理解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);

从这个代码可以看到我们调用了ConversationStateCreateProperty方法,为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 DialogCompontentDialog的父类,不直接使用。
  • ComponentDialog: 通用的Dialog类,用户自定义Dialog的入口。
  • WaterfallDialog: 用于定义一个系列的Dialog并且根据自定义的方法,循序执行。这个是一个非常重要的类。
  • PromptDialog: 用于给用户的输入类,有不少子类,例如TextPromptNumberPromptChoicePrompt等等。

另外还有一些Dialog类型,特别是Adaptive Dialog, 这个有时另外一个场景,虽然我们基于Code的场景也可以使用这个类。

注意
每个Dialog都时使用dialog id来引用的,这也是为什么每次顶一个Dialog类,都要加上`:base(nameof(yourdialogclassname))

到这里我们基本介绍完了Dialog库的基本原理,你可以结合之前的那篇文章尝试一下Dialog