你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

设计和控制会话流

适用于:SDK v4

在传统应用程序中,用户界面 (UI) 由一系列屏幕组成,单个应用或网站可以根据需要使用一个或多个屏幕与用户交换信息。 在大多数应用程序启动主屏幕中,用户可以进行初始登录,该屏幕还提供指向其他屏幕以使用各种功能(如启动新的订单、浏览产品,或寻求帮助)的导航。

与应用和网站类似,机器人具有 UI,但它由消息组成,而不是由界面组成。 消息可能包含按钮、文本和其他元素,或者完全基于语音。

虽然传统应用程序或网站可以在屏幕上同时请求多条信息,但机器人将使用多条消息收集相同数量的信息。 通过这种方式,从用户处收集信息的过程成为一种积极的体验:用户可以与机器人进行活动会话。

一个设计良好的机器人将拥有一个自然的会话流。 机器人应该能够无缝地处理核心会话,并且能够从容地处理中断或切换会话主题。

程序会话流

与机器人的会话集中在机器人试图实现的任务上,这个称为程序流程。 机器人向用户询问一系列问题,以收集在处理任务之前所需的所有信息。

在程序会话流中,可以定义问题的顺序,机器人将按你定义的顺序提出问题。 可以将问题组织到逻辑组中,保持代码的集中性,同时专注于引导会话。 例如,你可能会设计一个模块,其中包含可帮助用户浏览产品的逻辑,以及一个单独的模块,其中包含可帮助用户创建新订单的逻辑。

可以按照自己喜欢的任何方式将这些模块构建到流程中,自由格式或顺序格式均可。 Bot Framework SDK 提供了对话框库,使用这些库可以构造机器人所需的任何会话流。 该库包含用于创建一系列步骤的瀑布对话框 ,并提示用户提出问题。 有关详细信息,请参阅对话框库

Diagram comparing application GUI flow against bot conversation flow.

在传统应用程序中,一切都从页面开始。 主屏幕调用新建订单页面。 新建订单页面在关闭或调用其他页面(例如产品搜索页面)之前一直处于受控状态。 如果新建订单页面关闭,用户将返回主页面。

在使用对话框的机器人中,一切都以根对话框开头。 根对话框调用新建订单对话框。 此时,新建订单对话框控制会话并保持控制状态,直到它关闭或调用其他对话框(例如产品搜索对话框)。 如果新建订单对话框关闭,对话框的控制权会返回给根对话框。

有关如何使用对话框实现对话流的示例,请参阅 实现顺序会话流

处理中断

假设用户将以整齐有序的方式逐一执行程序任务,这可能非常具有吸引力。 例如,在过程对话流中,用户将从根对话框开始,并调用新建订单对话框。 在新建订单对话框中,它们调用产品搜索对话框。 然后,在选择产品搜索对话框中列出的其中一个结果时,它们将调用新建订单对话框。 完成订单后,它们将返回根对话框。

如果用户始终能够完成这样一个线性逻辑路径,那将是再好不过了,但很少能够实现。 用户不一定按顺序进行通信。 他们往往会频繁地改变主意。 请考虑以下示例:

Example of a user asking a question in response to a question from the bot.

虽然机器人可能以程序化为重点,但用户可能会决定做一些完全不同的事情,或者询问可能与当前主题无关的问题。 在上述示例中,用户询问问题而不是提供机器人期望的是/否响应。 机器人应如何响应?

  • 坚持让用户先回答问题。
  • 忽略用户之前完成的所有操作,重置整个对话框堆栈,并从头开始尝试回答用户的问题。
  • 尝试回答用户的问题,然后返回到是/否问题并尝试从该位置继续。

此问题没有正确答案,因为最佳解决方案将取决于你的具体应用场景,以及用户如何合理地期望机器人做出响应。 请参阅如何处理用于处理某些类型的中断的机器人的用户中断

使对话失效

有时需要从头开始重新聊天。 例如,在用户有特定的一段时间后未响应时。 结束会话的不同方法包括:

  • 跟踪上次从用户收到消息的时间,如果该时间大于预配置的时长,则在收到用户的下一条消息时清除状态。
  • 使用存储层功能(例如 Cosmos DB 生存时间 功能)在预配置的时长后自动清除状态。

有关详细信息,请参阅如何使会话过期

后续步骤

在对话框中管理用户的导航,并通过使用户能够实现其目标的方式(甚至是以非线性方式)设计会话流,这是机器人设计的一个基本挑战。 设计机器人导航一文回顾了设计不良导航的一些常见缺陷,并讨论了避免这些问题的策略。