主题对话编写说明
主题对话是什么
主题对话是一种通过人工预先编写内容和用户可能说的话,来实现多轮有关联对话(简称多轮对话)的聊天运营工具。
主题对话示例1:中秋节和小朋友一起中秋赏月
以下是一个主题对话的示例。这个主题对话是一个只会在中秋节晚上20:00-23:59分触发,围绕中秋节内容的主题。我们会在后文说明每一个部分的编写方式。
[info]
script_name = 中秋节和小朋友一起中秋赏月
topic = 节日
keywords = 赏月|月饼|团员|历史
description = 与用户聊聊中秋
date_holiday = 中秋节
active_time = 20:00–23:59
[round name = 你喜欢吃月饼吗]
+中秋快乐|今天是中秋节|节日快乐
-中秋快乐。我要吃月饼!你喜欢吃月饼吗?
-哇,又到中秋节了。到了中秋就要吃月饼才对。你喜欢吃月饼吗?
++{yes}|喜欢|爱吃月饼|爱吃|当然了
--你和我喜欢的一样。$goto_round(月饼的来历)
--我就知道你喜欢月饼。$goto_round(月饼的来历)
++{no}|不喜欢|不爱吃|讨厌月饼
--月饼热量比较大,虽然我喜欢吃,但也不会吃太多。$goto_round(你喜欢水果吗)
[round name = 月饼的来历]
+
-那我考考你,你知道月饼的来历吗?
-那我问问题,你知道月饼的来历吗?
++{yes}|知道
--你太聪明了。$goto_round(喜欢什么月饼)
++{no}|不知道
--那我来告诉你吧。$goto_round(介绍月饼)
主题对话编写格式
一个主题对话由两类信息组成:[info]和[round]
[info]
[info]是主题对话中的基础信息,如主题对话的名字、介绍、触发时间限制等信息。
[info]要写在一个主题对话的开头,如前文的示例。[info]中的信息不会被用户在聊天中看到。
[info]中的信息包括:
| 字段 | 字段说明 | 是否必填 |
|---|---|---|
| script_name | 主题对话名称 | 必填 |
| topic | 主题对话围绕的话题,可以不填。 | 选填 |
| keywords | 这个主题对话的关键词,可以不填。 | 选填 |
| description | 主题对话的介绍,可以不填。 | 选填 |
| active_time | 设定主题对话可以被触发的时间范围,精确到分钟。如:active_time = 20:00 - 23:59,就表示这个主题对话只能在一天中的晚上20点到23点59分之间被触发。注意时间需要“HH:MM-HH:MM”的严格格式,比如8点必须写成“08:00”而不是“8:00”。 | 选填 |
| date_week | 设定主题对话可在周几被触发。由7位数字组成,每个数字表示星期中的一天,从周一开始。如 date_week = 1111100,就表示周一到周五可被触发,周六周日不会。 | 选填 |
| date_event | 设定主题对话可在被触发的单个日期,只能设定一个,其中可以没有年份。格式是:date_event = 2018-01-01 或 date_event = 01-01。日期格式需要“YYYY-mm-dd”。 | 选填 |
| date_range | 设定主题对话可在哪个日期段内被触发,只能设定一个范围。如:date_range = 2018-01-01,2018-02-01,表示只能在2018年1月1日至2018年2月1日被触发。可以没有年份。日期格式需要“YYYY-mm-dd”。 | 选填 |
| date_holiday | 设定主题对话可在某个节日触发,只能有一个节日,节日列表见文档最后的附录。 | 选填 |
| date_solar_term | 设定主题对话可在某个节气触发,只能有一个节气,节气列表见文档最后的附录。 | 选填 |
通过给不同的主题对话设定不同的日期、时间、星期、节日等触发条件,可以做出多变、丰富的对话机器人内容。
前面的《中秋节和小朋友一起中秋赏月》示例主题对话,就通过date_holiday和active_time的组合,使这个主题对话只会在中秋节当天的晚20点至23点59分被触发,而在非中秋节不会被触发。达到中秋节更有针对性的聊天内容。
我们称日期、时间、星期、节日等触发条件为“场景条件”。我们会在后续增加新的场景条件,使大家可以编写更丰富的主题对话内容。
[round]
[round]:主题对话中的对话回合,对话回合包含了。
一个主题对话可以包含多个[round]。
一个主题对话文件中的排列第一的[round],是主题对话的”入口“。
一个[round]的编写格式是:
[round name = round的名称]
一个主题对话里,[round]名称不能重复。
[round]中包含的信息如下:
| 对话回合里的信息 | 说明 | 示例 |
|---|---|---|
| + | “+”表示主题对话的触发语(trigger)。每个主题对话的第一个[round],+后面不能为空。当用户说的话,和第一个[round]的+后面的触发语匹配上时,聊天就会进入这个主题对话。[round]中只能有一个+,但有多个触发语,或者是一种触发语的相似问法时,用竖线“|”来分割。如右侧示例。 | +中秋快乐|今天是中秋节|节日快乐 |
| - | ”-“表示主题对话中机器人说的话。 支持在一个“+”后面写多个“-”,系统会随机从多个“-”里挑一个。但要注意,一个“+”后面的“-”,应该是同一个意思的不同表达方式。 | -哇,又到中秋节了。到了中秋就要吃月饼才对。你喜欢吃月饼吗? |
| ++ | 主题对话的一个特点,就是支持机器人与用户围绕一个主题的多轮对话(当然需要编写)。”++“就是表示当用户看到”-“里机器人说的话后,可能有什么反应?会回答什么?一个[round]里可以有多个”++“。为了便于编写, 我们引入了{yes}、{no}两种标签,代表确认回答和否认回答,但也请多补充可能的不同说法。 | ++{yes}|喜欢|爱吃月饼|爱吃|当然了 |
| -- | “--”是对“++”的回复,同样,一个“++”后面可以有多个“--”。 | --我就知道你喜欢月饼。$goto_round(月饼的来历) |
| $goto_round() | ”\$" 开头的,都是主题对话里的“功能”而非语料。$goto_round(回合名字)表示跳转到本主题对话的另一个回合。 | --我就知道你喜欢月饼。$goto_round(月饼的来历) |
| $goto_script() | $goto_script(主题对话名称)表示跳转到另一个主题对话。以 | $goto_script(介绍月亮) |
| $audio_url(url) | 该命令,主题对话会将url通过协议传递到终端产品,终端产品可以解析url,播放内容或其他。 | $audio_url(https://y.qq.com/n/yqq/song/003fCJvj0DWmcH.html?ADTAG=baiduald&play=1) |
| $start_app(app_name) | 该命令,主题对话会将app_name通过协议传递到终端产品,终端产品可以自行使用。 | $start_app(聊足球) |
主题对话编写流程和小建议
第一步:构思内容
主题对话与“一问一答”的知识库单轮对话不同。主题对话支持如果猜到了用户回答,可以围绕一个主题进行多轮对话。使用户与机器人的聊天更加有趣。
场景触发条件可以使机器人与用户聊与当前日期、时间、星期等有关的内容,提升用户体验。
$audio_url 和 \$start_app 两个命令,可以使更多内容通过主题对话传递到前端。
因此,在编写主题对话前,需要先构思一下内容。比如:问用户什么问题?用户大概会回答什么?什么时候适合于用户聊什么?
第二步:编写[info]
构思完成后,在一份文档里编写主题对话的[info]信息。
灵活运用触发条件,使用active_time、date_holiday等触发条件,让剧本内容更有针对性、更丰富、多样。
第三步:编写作为入口的[round]
作为入口的[round]对于整个剧本很重要。首先是触发语(trigger)的编写。
-
Trigger不要太短,不要有太多歧义。不然命中剧本就不准确。
a) 合适的trigger:中秋快乐|今天是中秋节
b) 不合适的trigger:快乐|中秋节
c) 合适的trigger:我去吃饭了
d) 不合适的trigger:吃饭
e) 合适的trigger:你知道李白是谁吗
f) 不合适的trigger:李白
-
语料要和trigger上下连贯,不要用户说“中秋快乐”,语料里写与中秋节无关的事情。
-
当面向小朋友时,如果是想向小朋友提问,则问句最好比较直接。不要有太多的意义点。
-
多写几个“-”和“--”,让语料更加丰富、多变。
-
多考虑几种“++”号的可能,去猜用户可能的回答。
第四步:编写其它[round]
一个[round],算上触发语,也只是两轮对话(用户一句,机器人一句为一轮)。在一个主题对话里,可以编写多个不同的[round],[round]之间用$goto_round()跳转。这样就可以编写出很丰富有趣的主题对话。
附录1:主题对话支持的节假日
附录1.1. date_holiday支持的节日
| 节日 | 示例 |
|---|---|
| 元旦 | date_holiday = 元旦 |
| 除夕 | date_holiday = 除夕 |
| date_holiday = 春节 | |
| date_holiday = 情人节 | |
| 元宵节 | date_holiday = 元宵节 |
| date_holiday = 妇女节 | |
| date_holiday = 植树节 | |
| date_holiday = 复活节 | |
| date_holiday = 愚人节 | |
| date_holiday = 劳动节 | |
| date_holiday = 青年节 | |
| date_holiday = 母亲节 | |
| date_holiday = 儿童节 | |
| date_holiday = 端午节 | |
| date_holiday = 父亲节 | |
| date_holiday = 建党节 | |
| date_holiday = 建军节 | |
| 七夕 | date_holiday = 七夕 |
| 中元节 | date_holiday = 中元节 |
| 教师节 | date_holiday = 教师节 |
| date_holiday = 中秋节 | |
| date_holiday = 国庆节 | |
| date_holiday = 重阳节 | |
| date_holiday = 万圣节 | |
| date_holiday = 感恩节 | |
| date_holiday = 圣诞节 |
附录1.2. date_solar_term支持的节气
| 节气 | 示例 |
|---|---|
| 立春 | date_solar_term = 立春 |
| 雨水 | date_solar_term = 雨水 |
| 惊蛰 | date_solar_term = 惊蛰 |
| 春分 | date_solar_term = 春分 |
| 清明 | date_solar_term = 清明 |
| 谷雨 | date_solar_term = 谷雨 |
| 立夏 | date_solar_term = 立夏 |
| 小满 | date_solar_term = 小满 |
| 芒种 | date_solar_term = 芒种 |
| 夏至 | date_solar_term = 夏至 |
| 小暑 | date_solar_term = 小暑 |
| 大暑 | date_solar_term = 大暑 |
| 立秋 | date_solar_term = 立秋 |
| 处暑 | date_solar_term = 处暑 |
| 白露 | date_solar_term = 白露 |
| 秋分 | date_solar_term = 秋分 |
| 寒露 | date_solar_term = 寒露 |
| 霜降 | date_solar_term = 霜降 |
| 立冬 | date_solar_term = 立冬 |
| 小雪 | date_solar_term = 小雪 |
| 大雪 | date_solar_term = 大雪 |
| 冬至 | date_solar_term = 冬至 |
| 小寒 | date_solar_term = 小寒 |
| 大寒 | date_solar_term = 大寒 |
附录2:主题对话示例
附录2.1. 小朋友不应该挑食:这是一个劝解小朋友不要挑食的主题对话
[info]
script_name = 小朋友不应该挑食
[round name = 第一轮]
+应该挑食吗|小孩子应该挑食吗|儿童应该挑食吗
-当然不应该挑食了。咦,为什么这么问?是不是有人挑食、不怎么爱吃饭呢?
++{yes}|有的小孩不爱吃饭|有人挑食|不吃青菜|不吃肉|不吃饭|什么都不吃
--挑食是不好的。$goto_round(为什么不能挑食)
--挑食当然是不好的。$goto_round(为什么不能挑食)
++{no}|没有|没人挑食
--嗯嗯,没有人挑食就好,小朋友要记得不要挑食啊。
[round name = 为什么不能挑食]
+
-让我给你讲讲为什么不能挑食好不好?
++{yes}|说吧|讲吧|好的
--小朋友要想长高长大,需要很多不同的营养。而一种食物,只拥有比较单一的营养。所以只有各种东西都要吃,才能拥有充足的营养。我就从来不挑食,火力发电、水力发电、风力发电、太阳能发电,我都可以吃。
++{no}|不想听|不要|别说
--那我不讲了。
附录2.2. 圣诞节前的一个剧本
[info]
script_name = 圣诞快乐1215
topic = 圣诞节
keywords = 圣诞节|圣诞快乐
description = 祝小朋友圣诞快乐,和小朋友交互。
date_range=2017-10-01,2017-12-23
[round name = 1]
+圣诞快乐|要过圣诞节了|马上是圣诞节了
-哎呦喂,圣诞节还早着呢。$goto_round(早休假早过节)
-同乐同乐,你真乖,谢谢呦。不对,圣诞节还有好多天才到呢。$goto_round(你是哄我开心吗)
-真是的,还没到圣诞节呢,就说圣诞快乐,那一定是非常想过圣诞节了对不对。$goto_round(唱圣诞歌好不好)
[round name = 早休假早过节]
+
-你是想早休假早过节了吧?
-我猜你是特别想过节了吧?
++{yes}|是的|没错|想过节|过圣诞节
--只可惜离过节还早着呢。$goto_round(唱圣诞歌好不好)
--还有好几天才能过节呢。$goto_round(唱圣诞歌好不好)
++{no}|不是|不想|你错了|不对|不想过节
--那我可特别想过节呢。好,我要开始唱圣诞歌了!$audio_url(http://fdfs.xmcdn.com/group8/M0B/D0/70/wKgDYVZ2Lx6A1wQ8ABRPXMO3k-c751.mp3)
[round name = 你是哄我开心吗]
+
-你是在哄我开心吗?
-你一定是哄我开心对不对?
++{yes}|是的|对|就是
--谢谢你,有你哄我我很开心。$goto_round(唱圣诞歌好不好)
++{no}|不是|不会|么有
--这样啊。$goto_round(圣诞节在哪一天)
[round name = 唱圣诞歌好不好]
+
-我给你唱歌圣诞歌好不好?
-我想唱歌圣诞节的歌,你想不想听?
++{yes}|唱吧|我想听|来吧|唱一个|想听
--那我要开始唱了。$audio_url(http://fdfs.xmcdn.com/group8/M0B/D0/70/wKgDYVZ2Lx6A1wQ8ABRPXMO3k-c751.mp3)
++{no}|不要听|不想听|不许唱|不唱
--好吧,那我不唱了。
[round name = 圣诞节在哪一天]
+
-所以你肯定知道圣诞节在哪一天?对不对?
-你知道圣诞节在哪一天吗?
++{yes}|知道|12月25日|我知道
--你真厉害!$goto_round(唱圣诞歌好不好)
--答对了,好棒!$goto_round(唱圣诞歌好不好)
++{no}|不知道|在哪一天|告诉我|那你告诉我
--是在12月25日啦。$goto_round(唱圣诞歌好不好)
--要记住,是12月25日呦。$goto_round(唱圣诞歌好不好)