跳转至

主题对话编写说明

主题对话是什么

主题对话是一种通过人工预先编写内容和用户可能说的话,来实现多轮有关联对话(简称多轮对话)的聊天运营工具。

主题对话示例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)的编写。

  1. Trigger不要太短,不要有太多歧义。不然命中剧本就不准确。

    a) 合适的trigger:中秋快乐|今天是中秋节

    b) 不合适的trigger:快乐|中秋节

    c) 合适的trigger:我去吃饭了

    d) 不合适的trigger:吃饭

    e) 合适的trigger:你知道李白是谁吗

    f) 不合适的trigger:李白

  2. 语料要和trigger上下连贯,不要用户说“中秋快乐”,语料里写与中秋节无关的事情。

  3. 当面向小朋友时,如果是想向小朋友提问,则问句最好比较直接。不要有太多的意义点。

  4. 多写几个“-”和“--”,让语料更加丰富、多变。

  5. 多考虑几种“++”号的可能,去猜用户可能的回答。

第四步:编写其它[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(唱圣诞歌好不好)