/ 产品和服务

多轮对话设计器:脚本语法介绍

多轮对话设计器是设计满足业务需求的对话机器人的PC端应用程序,现已支持Windows和Mac OSX平台。多轮对话能力是聊天机器人模仿人的对话能里的一大挑战,在复杂的上下文和需要很多背景知识的前提下,现有的人工智能技术是无能为力的,在Chatopera,我们相信在企业服务中,当话术或流程固定的情况下,依赖Chatopera的产品可以输出用对话完成任务的服务,比如用对话完成点餐、报销、请假。这些对话可以在企业的聊天工具中,也可以通过智能音箱的等其他客户端。

在真正介绍脚本语法前,我们先来认识下面的术语:

  • 对话:满足设定需求的多轮对话;

42747094-7313399c-890d-11e8-85cf-997c8877ec2b

  • 输入:用户向聊天机器人发送的消息的文字形式;

  • 触发器:匹配用户输入文字的字符串,可以声明槽位,当用户的输入发生时,会按照算法顺序匹配触发器;

  • 回复:机器人回复用户输入的文字;

  • 多轮对话:根据上一次回复的状态,声明下轮对话的优先匹配规则。

  • 函数:可以从脚本中接受输入,并通过JavaScript执行任务返回结果的代码。

现在读者对这些概念有一个模糊的理解就可以,在阅读本文,在对照我们提供的多轮对话设计器:快速开始多轮对话设计器: 实现天气查询机器人的过程就可以很快掌握它们。

触发器

触发器是对话的基础,当用户向bot发送一条消息时,机器人引擎会从所有定义的触发器中找到匹配的一个。在机器人引擎中,触发器用半角字符加号( + )表示。机器人的回答用半角字符减号( - )表示。
例如,我们可以这样定义一个对话:

+ 晚饭吃什么
- 北京烤鸭

注意:这里( + )和( - )和文字之间需要隔一个空格。

槽位

为了让触发器能适应复杂的需求,机器人引擎使用槽位规则,槽位既能让规则具有更好的匹配能力,也能让回复和函数中使用不同槽位的值。

注意:下面的某些槽位带有空格,这些空格是必须的。

通用槽位

通用槽位会匹配零到无穷个字符、单词。此处的输入不会被系统捕获或者存储。

+ (*) 你好 (*)
- 欢迎光临

匹配:客服你好
匹配:你好
匹配:你好吗

确定长度槽位

如果你知道你想要的字符长度,可以试试确定长度槽位。此处的槽位可以被系统捕获,而且可以在回答中使用
语法为*n, 其中n代表长度。

+ 早安 *2
- 早安

匹配:早安北京
不匹配:早安乌鲁木齐

可控长度槽位

如果你只想匹配一些字符,可控长度的槽位是个不错的选择。
语法为*~n, n代表你想匹配的最大长度

+ 早安 *~4
- 早安

匹配:早安
匹配:早安北京
匹配:早安哈尔滨
匹配:早安乌鲁木齐
不匹配:早安一些不知道的地方

区间槽位

如果你想匹配一个确定的区间,比如2到4个字符之间,区间槽位绝对可以满足需要。
语法为*(min-max), 此槽位可以被系统捕获和用在回答中。
*(n)*n是一样的

+ 早安 *(2-4)
- 早安

匹配:早安北京
匹配:早安乌鲁木齐
不匹配:早安

必选项

必选项用在你有一系列可选项,但是必须有一个被匹配。输入中的可选项会被系统捕获和用在回答中

+ 早安(北京|上海|天津)
- 早安

匹配:早安北京
匹配:早安上海
不匹配:早安

可选项

可选项用来确定一些额外的内容

+ 早安 [美丽的] 北京
- 早安

匹配:早安北京
匹配:早安美丽的北京
不匹配:早安热闹的北京

回复

在触发器中,我们已经学到了怎么添加一个回答。事实上你可以添加任意数量的回答。这里还有一些高级功能可以帮助你完成更多的任务。

基础回复

+ 在吗
- 你好,在的

如果添加了多个回答,系统会从中随机挑选一个作为回复, 然后丢掉这个回答。

+ 在吗
- 亲,在的
- 亲,有什么需要帮助
- 你好,请问遇到什么问题了吗?

所谓丢掉这个答案,是指机器人针对同一个用户,在半个小时内再次匹配上该触发器时,选择回复时,不考虑使用过的回复。

在一个触发器中声明多个回复后,保存,逻辑中将出现分支。

42749523-86ee40a2-8916-11e8-8c25-6b4ee4dd7b2b

如果不想让系统丢掉使用过的回复,可以在回复前添加{keep}

+ 在吗
- {keep} 亲,在的
- 亲,有什么需要帮助
- 你好,请问遇到什么问题了吗?

也可以在触发器前添加{keep},就不用在每个回答中都添加了

+ {keep} 在吗
- 亲,在的
- 亲,有什么需要帮助
- 你好,请问遇到什么问题了吗?

如果回答很长,可以通过^分割以方便可读性。可以通过/n实现换行

+ 在吗
- 你好,这里是客服中心,\n
^ 请问遇到什么问题了吗?

等价于

+ 在吗
- 你好,这里是客服中心,请问遇到什么问题了吗?

槽位取值

有些时候,你希望在回答中使用输入中的内容。可以使用<cap>达成目的。

+ 我是 *~3
- 你好,<cap>

如果用户输入,我是张三,那么系统将回复,你好,张三
当有多个捕获时,你可以使用多个<cap>

+ *2 比 *2 高
- 你确定<cap1>比<cap2>高吗?

匹配:小明比小红高
回答:你确定小明比小红高吗?

在对话中,我们有时候会需要以前的捕获,看一下下面这个例子

+ 我叫 *~3
- 你好,<cap1>

    + 你猜我叫什么?
    % 你好,<cap1>
    - 你刚说了,你叫<p1cap1>

<pNcapM>代表了以前的捕获。其中N代表在在对话中之前的问答,M代表捕获的位移。

42750387-b02e0864-8919-11e8-8d34-9cb472ba6dfe

此处,还有一个重要语法:%。(%) 开头的句子代表触发器“你猜我叫什么?”只服务于“你好,”作为回复时,它会被优先匹配。上一轮对话的回复通过(%)的方式指定了接下来的逻辑,形成多轮对话。 关于(%)的用法,后文还会进行详细介绍,此处,读者只需要掌握从上下文的槽位取值便可。

另外,(+, %, -) 前的空格不是必须的,在多轮对话中,空格可以增强脚本的可读性,但是系统是忽略的。

重定向 {@reply}

有些时候,在问答对中重用一些回复能使编写脚本效率更高,这时可以定义一个问答对,并在脚本其它位置引用它。

+ 在吗
- {@__greeting__} 请问有什么能帮助您?

+ __greeting__
- 亲,在的。
- 你好,客服小美为您服务
- 亲亲,稍等,客服马上就到

引用的方式就是 “{@触发器}”,触发器中的下划线不是必须的,但是它能增强脚本的可读性。

多轮对话

在实际应用中,和机器人聊天时,很可能要通过多轮对话完成一个任务。我们用(%)来定位之前回复,声明新的触发器,(%)后的内容是和某个回复内容一样的字符串。

+ *
- 您身高多少

  + *(3-5)
  % 您身高多少
  - 我的身高也是<cap>

让我们一起看看这个例子:

  1. 当用户输入任何文字,我们用通用槽位触发回答,然后系统回复“您身高多少”。
  2. 当用户继续输入时,系统会先从历史中查看之前的回复中是否有对应的上下文,在这里指的是% 您身高多少
  3. 最后,如果用户输入3到5个字符,系统匹配触发器+ *(3-5), 并且回复我也是<cap><cap>代表的就是用户输入的内容 。

函数

函数是一个强大而有趣的设计。在回复中,可以使用函数来获取整条消息对象,用户对象或者其它资源,比如数据库。把槽位值当做变量传给函数,例如下面这个例子:

+ 我的用户名是 *(2-10)
- ^getUserAccount(<cap>)

所以,调用函数的方式就是使用“^”。在函数的编辑窗口中,可以这样定义:

exports.getUserAccount(account, cb) {
  cb(null, "对不起,系统没有找到" + account);
}

函数的声明中,参数列表首先是槽位的值,可以传多个,然后最后一个参数始终是回调函数(cb),cb的参数列表为(error, text)。text作为文本添加到回复中。

复合函数

在回复中,可以添加任意多的函数,比如

+ ...
- 联合 ^callFunction1() 和 ^callFunction2()

嵌套函数

在函数的回调函数中,函数名会被解析成对应的函数,所以放心的在回复中添加任意合法的函数,比如在脚本中这样写:

+ ...
- ^nestedAFunction()

然后,在函数中,定义如下:

exports.nestedAFunction = function(cb) {
  cb(null, "张三 ^nestedBFunction()");
}
exports.nestedBFunction = function(cb) {
  cb(null, "和李四");
}

以上是多轮对话设计器 v1.x 版本中支持的脚本语法,这些语法能够保证业务人员实现满足需求的聊天机器人。多轮对话设计器将在2018年07月21日发布,如果您想参加这两个产品的发布会,请报名Chatopera产品发布会:追求高度智能化和自动化的企业服务

多轮对话设计器:脚本语法介绍