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