开源专题五:Botpress 对话机器人引擎Dialog Engine

Botpress使用我们所谓的对话引擎来处理对话。对话引擎负责与机器人的每次互动。它处理用户输入和机器人响应。但是在两者之间,发生了很多事情。

Overview

对话引擎使用代表机器人总体对话逻辑的流程,流程由执行一系列指令的节点组成。指令是Node生命周期的一部分,可以执行Actions。Actions通常是您自己编写的代码,是由Botpress或其他人提供的代码(稍后会详细介绍)。

Flows

较复杂的机器人通常分为多个较小的Flow,而不只是一个较大的流程。将漫游器分解为多个流的原因是为了简化可维护性和可重用性。

Flow Lifetime

Flow总是startNode从其*.flow.json文件的开始。起始节点指示开始节点的名称。一旦选择了节点,对话引擎将使活动节点的指令排队。然后它将顺序处理指令。

对话引擎是基于事件的,默认情况下是非阻塞的,这意味着流将执行它可以执行的所有操作,直到需要等待为止。

注意:目前有两个原因导致Flow“等待”:

* 节点被标记为等待用户输入

* 一个节点无法满足转换到另一个节点的条件

处理完第一个节点后,对话框引擎将继续执行Flow中的下一个节点,直到到达最后。

节点也有自己的生命周期,节点在Flow中负责执行具体的工作,而Flow仅是用于编排它们。这个有点类似操作系统的Process和Thread。

Storage

流作为JSON文件存储在机器人的源文件中。在本教程的上下文中,流存储在data/bots/trivia-bot/flows/文件夹中。每个流都分为两个文件:逻辑(*.flow.json)和特定于视觉的属性(*.ui.json)。拆分这些内容是为了使维护和检查更改更加容易。

  • *.ui.json 文件几乎总是可以从代码审查中忽略,因为它们不影响机器人的功能。
  • *.flow.json从理论上讲,文件也可以由开发人员手动创建,而不是使用GUI。技能就是这种情况,我们将在后面介绍。

Nodes

Node是机器人对话逻辑的主要单元。一个活动对话(我们称为“ 会话 ”)始终只有一个活动节点

。一个节点通常过渡到另一个节点或流。如果没有,则对话结束。然后,来自用户的下一条消息将成为一个全新会话的一部分。

甲节点被分离成三个不同的阶段:的OnEnter(A),的onReceive(B)和onNext(C)。

开源专题五:Botpress 对话机器人引擎Dialog Engine

Node Lifetime

onEnter

onEnter进入节点时将执行的指令列表。如果定义了多个动作,则将依次执行所有动作。

onReceive

onReceive是当节点成为活动节点时收到消息时将执行的指令列表。一旦定义了动作,该节点将自动等待用户输入(橙色节点)。

保留该属性不使用时,该节点将处于非阻塞状态(黑色),这意味着它将直接从流动onEnter到onNext。


开源专题五:Botpress 对话机器人引擎Dialog Engine


全流程onReceive

您可以定义一个onReceive指令,该指令将始终在每个节点的onRecieve之前执行。

示例:接收时全流程

Audit Trail:记录在此特定流范围内接收到的消息的特定日志

Authentication Gate:运行一些验证

Sentiment Analysis:确保对话情绪保持健康

要定义新的“new Flow-wide On Receive Actions”,请导航至相关Flow,然后双击方格背景上的任意位置以显示“Flow Properties Pop up”。您也可以单击Flow编辑器左上角的链接。在“ On Receive”部分下,单击“ Add Action ”按钮以添加新操作。


开源专题五:Botpress 对话机器人引擎Dialog Engine


onNext

onNext(也称为Transitions)与Flow-wide Transitions完全相同,除了条件仅在执行之后onReceive或onEnter已执行的情况下进行评估。

特殊情况:如果未定义任何条件,则默认行为是对话结束。如果定义了条件但不匹配,则什么也不会发生,即当前节点保持活动状态,并且当条件匹配时它将流动。默认情况下,onNext仅在onReceive重新调用后才会重试。

目标:转换始终有一个目标,我们称之为目标。有可能:

  • 不同的节点
  • 不同的流程
  • 上一个流程(请参阅流程堆栈)
  • 自身(回过头来)
  • 对话结束

全流程onNext

当条件成功时,使用Flow-wide onNext指令可以覆盖节点转换。

示例:全流程onNext

身份验证门:如果用户未通过身份验证,则将其重新路由到登录流程情感分析:如果会话质量下降,则将用户重新路由到人工后备节点匹配流范围内的意图,例如“ cancel”等。

State

每个对话都有一个与之关联的State。状态在会话会话开始时创建,并在会话结束时销毁。

在本教程的上下文中,这意味着将在输入“ entry ”节点之前和执行“ over ”节点之后立即创建状态。

开源专题五:Botpress 对话机器人引擎Dialog Engine

注意:状态是对话的全局状态,因此,如果对话跨越多个流,则该状态将为所有流共享

Session Timeout

当对话框引擎正在等待非活动用户的输入时,一段时间后会话将超时。超时允许您根据需要优雅地结束对话。在删除会话之前进行一些处理也很有用。例如,您可以将用户联系信息保存到外部数据库,或者告诉用户如何与您联系,或者通知用户其会话已超时。

Timeout Flow

您可以使用超时流来处理超时逻辑。它就像常规流程一样工作。您要做的就是向timeout.flow.json您的漫游器添加一个Flow ,并指定一个起始节点。对话框引擎将在用户下一次超时时检测您的超时流。

Timeout Node

与超时流非常相似,应该调用超时节点,该节点timeout应该属于当前流。您不必将其链接到任何其他节点。对话框引擎将根据其名称检测节点。

Timeout Transition

另一个需要一些编码的选项是将属性添加timeoutNode到*.flow.json文件中,并将其分配给应处理超时的节点的名称。它可以是任何节点,不需要称为特定方式。

重要说明:对话引擎处理完超时后,将删除会话。

Actions

一个行动是在Node.js的虚拟机执行JavaScript代码。可以是您想要的任何东西。调用API,将某些内容存储在数据库中或将某些内容存储在键值存储中。操作由onEnter和onReceive指令调用。有两种类型的动作:

  • 脚本:用户定义的操作,用于运行自定义代码。
  • Output:一个输出动作,用于使机器人输出一些东西。

要了解有关操作的更多信息,请参阅“ 自定义代码”部分。

Skills

构建了几个流程/机器人之后,您会很快注意到,有一些常见的模式会一遍又一遍地实现。技能可以解救。

技能是在流程之上的更高层次的抽象。实际上,技能是动态生成器。

它们可以看作是多个流甚至多个漫游器之间的可重用组件。

Install Skills

每个技能都必须由一个模块公开。模块可以承载许多技能。您所要做的就是安装所需的模块,您将可以使用其技能。

Use Skills

Botpress Flows GUI应该使用技能。安装技能模块后,在“图形流程编辑器”中导航至流程,然后在顶部工具栏中找到“插入技能”下拉菜单:


开源专题五:Botpress 对话机器人引擎Dialog Engine


填写表单后,您将能够单击流中的任何位置以插入其他节点要使用的技能。

Persistence

技能以流的形式存储在该data/bots/your-bot/flows/skills文件夹下。

您还可以通过GUI可视化生成的技能:


开源专题五:Botpress 对话机器人引擎Dialog Engine


Editing skills

生成技能节点后,您可以单击该节点,然后单击左侧面板上的“编辑”以编辑该节点,这将在后台自动更新生成的流程。


开源专题五:Botpress 对话机器人引擎Dialog Engine


分享到:


相關文章: