关于组件和瀑布对话

适用于: SDK v4

对话有几种不同的类型。 本文将介绍组件对话、瀑布对话和提示对话。 有关对话的一般信息,请参阅对话库一文。 有关自适应对话的信息,请参阅自适应对话简介。

瀑布对话(或瀑布)定义了一系列步骤,让机器人能能够引导用户完成线性过程。 这些对话设计用于在组件对话的上下文中运行。

组件对话是一种容器对话,它允许集内的对话调用集内的其他对话,例如瀑布对话调用提示对话或另一个瀑布对话。 组件对话管理一组对话,如瀑布对话、提示等。 可以设计一个组件对话来处理特定任务,并在同一机器人或多个机器人中重复使用。

提示对话(提示)是用于询问用户特定类型信息的对话,如数字、日期或姓名等。 提示旨在与组件对话中的瀑布对话配合使用。

组件对话

有时,我们想要编写可在不同的方案中重复使用的对话,例如,编辑地址对话来请求用户提供街道、城市和邮政编码的值。

组件对话提供一种策略用于创建独立的对话来处理特定的方案,将大型对话集分解成更易于管理的片段。 其中的每个片段有自身的对话集,可避免与包含该片段的对话集发生名称冲突。 有关更多信息,请参阅组件对话操作方法

瀑布对话

瀑布对话是对话的特定实现,通常用于从用户那里收集信息或指导用户完成一系列任务。 聊天的每个步骤实现为采用“瀑布步骤上下文” (step) 参数的异步函数。 在每一步中,机器人都会提示用户输入(也可以开始一个子对话,但通常是一个提示),等待响应,然后将结果传递给下一步。 第一个函数的结果作为参数传递给下一个函数,依此类推。

下图显示一系列瀑布步骤以及发生的堆栈操作。 下面的使用对话部分详细介绍了对话堆栈的用法。

表示消息如何映射到瀑布步骤。

在瀑布步骤中,瀑布对话的上下文存储在它的瀑布步骤上下文中。 步骤上下文与对话上下文类似,可以访问当前的转向上下文和状态。 使用瀑布步骤上下文对象从瀑布步骤内通过对话集进行互动。

可以在对话的瀑布步骤内部,或者通过机器人的轮次处理程序来处理对话的返回值,不过,通常需要通过机器人的轮次逻辑来检查对话轮次结果的状态。 在瀑布步骤中,对话在瀑布步骤上下文的 result 属性中提供返回值。

瀑布步骤上下文属性

瀑布步骤上下文包含以下属性:

  • 选项:包含对话的输入信息。
  • :包含可添加到上下文,然后传递到后续步骤的信息。
  • 结果:包含上一步骤的结果。

此外,next 方法(C# 中为 NextAsync,JavaScript 和 Python 中为 next)会在同一回合内继续瀑布对话的下一步,让机器人能够在需要时跳过某一步。

提示

使用对话库中的提示可以轻松请求用户提供信息,以及评估其响应。 例如,对于数字提示,你只需指定要询问的问题或信息,提示就会自动检查是否收到有效的数字响应。 如果是,对话可以继续;如果不是,它会重新提示用户提供有效答案。

在幕后,提示是由两个步骤组成的对话。 首先,提示会请求输入;其次,它会返回有效值,或者使用重新提示从头开始。

调用提示时,为提示指定 prompt options,可在其中指定要提示的文本、验证失败时的重试提示,以及回答提示所用的选项。 一般来说,提示和重试提示属性均为活动,但不同的编程语言在处理方式上存在一些差异。

此外,在创建提示时可为提示添加某种自定义验证。 例如,假设我们想要使用数字提示获取聚会规模,但该聚会规模必须大于 2 且小于 12。 提示首先检查是否收到有效号码,如果收到,则运行自定义验证。 如果自定义验证失败,将如上所述重新提示用户。

提示完成时,会显式返回所请求的结果值。 当返回该值时,我们可以确保它已通过内置提示验证和可能提供的其他自定义验证。

有关使用各种提示的示例,请查看如何使用对话库收集用户输入

提示类型

在幕后,提示是由两个步骤组成的对话。 首先,提示会要求输入;其次,它会返回有效值,或者从头开始重新提示。 对话库提供了各种基本提示,每种提示用于收集不同类型的响应。 基本提示可以解释解释自然语言输入,例如,“ten”或“a dozen”表示数字,“tomorrow”或“Friday at 10am”表示日期时间。

提示 说明 返回
附件提示 请求提供一个或多个附件,例如文档或图像。 附件对象的集合。
选项提示 请求从一组选项中选择一个选项。 找到的选项对象。
确认提示 请求确认。 一个布尔值。
日期时间提示 请求提供日期时间。 日期时间解析对象的集合。
数字提示 要求提供数字。 数字值。
文本提示 请求提供常规文本输入。 一个字符串。

若要提示用户输入,请使用某个内置类(例如“文本提示”)定义一个提示,并将其添加到对话集。 提示具有固定的 ID,该 ID 必须在对话集中唯一。 可为每个提示创建自定义的验证程序。对于某些提示,可以指定默认区域设置。

提示区域设置

使用区域设置来确定选项确认日期时间数字提示的特定于语言的行为。 对于用户提供的任何给定输入,如果通道在用户的消息中提供了 locale 属性,则使用该属性。 否则,如果设置了提示的默认区域设置(通过在调用提示的构造函数时提供,或者在以后进行设置),则会使用该区域设置。 如果没有提供这两种本地语言,则使用英语 ("en-us") 作为本地语言。

语言区是由两个、三个或四个字符组成的 ISO 639 代码,代表一种语言或语系。

提示选项

步骤上下文的 prompt 方法的第二个参数采用了提示选项对象,该对象包含以下属性

properties 说明
提示 发送给用户的、以请求输入的初始活动。
重试提示 如果用户的第一次输入未通过验证,则为要发送给用户的活动。
选择项 供用户选择的选项列表,与选项提示配合使用。
验证 其他与自定义验证程序配合使用的参数。
样式 定义某个选择的选项如何提示或确认提示将向用户呈现。

应始终指定要发送给用户的初始提示活动,以及用户输入未验证时的重试提示。

如果用户输入无效,将向用户发送重试提示;如果没有指定重试,则使用初始提示。 但是,如果活动从验证程序内发送回用户,则不会发送任何重试提示。

提示验证

可以在将值返回到瀑布对话的下一个步骤之前验证提示响应。 验证程序函数包含提示验证程序上下文参数,并返回一个布尔值用于指示输入是否通过了验证。 提示验证程序上下文包含以下属性:

properties 说明
Context 机器人的当前轮次上下文。
Recognized 提示识别器结果,包含识别器处理的有关用户输入的信息。
选项 包含提示选项,这些选项已在启动提示所需的调用中提供。

提示识别器结果包含以下属性:

properties 说明
成功 指示识别器是否能够分析输入。
识别器的返回值。 如果必要,验证代码可以修改此值。

使用对话

可将对话视为编程堆栈(称为“对话堆栈”),可将轮次处理程序视为对话引导者,以及堆栈为空时的回退机制。 堆栈中最顶端的项目被视为活动对话,对话上下文会将所有输入导向活动对话。

当一个对话开始时,它就会被推入堆栈,现在就成为了活动对话。 它一直都是活动对话,直到它结束、被 replace dialog 方法删除,或者另一个对话被推入堆栈(由转向处理程序或活动对话本身推入)并成为活动对话。 当新对话结束时,它会从堆栈中弹出,下一个对话将再次成为活动对话。 这样就可以重复某个对话将聊天分支,详见下面的讨论。

可以使用 run 对话扩展方法来开始或继续根对话。 在机器人代码中,调用对话运行扩展方法要么继续运行现有对话,要么在堆栈为空的情况下启动一个新的对话实例。 控制和用户输入会转到堆栈上的活动对话。

Run 方法需要使用状态属性访问器才能访问对话状态。 该访问器的创建和使用方式与其他状态访问器相同,但它会根据聊天状态创建为自身的属性。 有关管理状态的详细信息,请参阅管理状态主题;有关对话状态的用法,请参阅有序聊天流操作指南。

在对话中,你可以访问对话上下文,并使用它启动其他对话、结束当前对话和执行其他操作。

启动对话

在瀑布对话,使用 begin dialogpromptreplace dialog 方法,将要启动的对话的对话 ID传递到瀑布对话的上下文中。

  • prompt 和 begin dialog 方法将把引用对话的新实例推到堆栈顶部。
  • replace dialog 方法会将当前对话从堆栈中弹出,并将用于替换的对话推送到堆栈上。 被替换的对话会被系统取消,该实例包含的任何信息都会被释放。

使用 options 参数将信息传递到对话的新实例。 传递到新对话中的选项可以在对话的任何步骤中通过步骤上下文的 options 属性进行访问。 有关更多信息,请参阅如何使用分支和循环创建高级对话流

继续对话

在瀑布对话中,使用步骤上下文的 values 属性可在各轮之间保持状态。 在上一轮次添加到此集合的任何值都可以在后续轮次中使用。 有关更多信息,请参阅如何使用分支和循环创建高级对话流

结束对话:

在瀑布对话中,使用 end dialog 方法可将对话从堆栈中弹出,从而结束对话。 end dialog 方法可以向父上下文(例如调用该方法的对话或机器人的轮次处理程序)返回一个可选结果。 往往是从对话内部调用此方法,以结束该对话自身的当前实例。

可以从具有对话上下文的任何位置调用 end dialog 方法,但对于机器人而言,该方法似乎是从当前活动对话调用的。

提示

最佳做法是在对话结束时显式调用 end dialog 方法。

清除所有对话

若要使所有对话从堆栈中弹出,可以调用对话上下文的 cancel all dialogs 方法来清除对话堆栈。

重复某个对话

使用 replace dialog 方法时,可以使用对话来替换其自身,创建一个循环。 这是处理复杂交互的好方法,也是管理菜单的一种技术。

注意

如果需要保留前对话的内部状态,则需要在调用 replace dialog 方法时向对话的新实例传递信息,然后适当地初始化对话。

将聊天分支

对话上下文维护对话堆栈,对于堆栈中的每个对话,将跟踪下一个步骤是什么。 它的 begin dialog 方法创建子级,并将对话推送到堆栈的顶层;它的 end dialog 方法从堆栈中弹出顶层对话。 通常,end dialog 是从要结束的对话调用的。

一个对话框可以调用对话框上下文的 begin dialog 方法并提供新对话框的 ID,以便启动同一对话框集中的新对话框,随后使新对话框成为当前的活动对话框。 原始对话框仍保留在堆栈中,但对对话框上下文的 continue dialog 方法的调用只会发送到位于堆栈顶层的对话框,即“活动对话框”。 将某个对话框从堆栈中弹出后,对话框上下文会在堆栈中弹出原始对话框的位置处继续执行瀑布框的下一步。

因此,可以在聊天流中创建分支,方法是在一个对话中包含一个选择步骤(该步骤可按条件从一组可用对话中选出一个要启动的对话)。

其他信息