基本概念
什么是对话?
- 我:你好!
- 机器人:你也好!
多轮对话呢?
- 我:你好!
- 机器人:你也好!
- 我:吃饭了伐?
- 机器人:当然没有
(来回好几回合)
任务导向多轮对话呢?
- 我:帮我订一张机票!
- 机器人:哪里呢?
- 我:北京的。
- 机器人:订好了。
(不是闲聊,有目的性的对话)
跨领域任务导向多轮对话呢?
- 我:帮我订一张机票!
- 机器人:哪里呢?
- 我:北京的。
- 机器人:订好了。
- 我:再在附近订个五星酒店。
- 机器人:北京饭店你看可以吗?
(用户有两个以上目的(订机票和酒店)要通过对话实现)
中文?突出中文是因为之前的大规模开源多轮对话数据集MultiWOZ是英文的。MultiWOZ在推动英文多轮对话诞生了很多研究。因此这次清华大学计算机系制作了中文的数据集以填补中文任务导向对话数据的空白。
论文地址:https://arxiv.org/pdf/2002.11893.pdfhttps://arxiv.org/pdf/2002.11893.pdf
1.CrossWOZ大规模跨领域中文任务导向多轮对话数据集
数据集参数
CrossWOZ包含 6K 个对话,102K 个句子,涉及 5 个领域(景点、酒店、餐馆、地铁、出租)。平均每个对话涉及 3.2 个领域,远超之前的多领域对话数据集,增添了对话管理的难度。
特点
- 用户在某个领域的选择可能会影响到与之相关的领域的选择,在跨领域上下文理解更有挑战。
- 第一个大规模中文跨领域任务导向数据集。
- 在用户端和系统端都有详细的对话状态记录,标注信息全面。
与其他数据集的对比
跨领域对话的数据样例
表 2:MultiWOZ、Schema 和 CrossWOZ 中的跨域对话示例。 跨域约束(粗体)的值带有下划线。 为了节省空间,省略了一些轮次。 为简单起见,酒店名称由 A、B、C 代替。 跨域约束在 MultiWOZ 和 Schema 中预先指定,而在 CrossWOZ 中动态确定。 在 CrossWOZ 中,在一个域中的选择将极大地影响相关域。
数据标注方法
1 基础数据库的构建。通过爬虫从网络上获取了北京市的酒店/旅游景点/饭店以及地铁和出租车信息。
表 3:数据库统计信息。 ∗ 表示有 37 个二进制槽用于酒店服务,例如叫醒服务。 最后三行显示了每个实体附近景点/餐厅/酒店的平均数量。 我们没有收集酒店域的附近酒店信息。
2 目标构建。论文通过算法自动生成标注人员的对话目标。
表 4:用户目标示例(翻译成英文)。 带有粗体/斜体/空白值的槽是跨域可通知槽、普通可通知槽和可请求槽。 在此示例中,用户想要查找一个景点及其附近的酒店之一,然后预订出租车在这两个地方之间通勤。
上面的id1,2,3就是自动生成的目标。标注人员要以完成这三个目标(寻找免费旅游景点和订附近酒店以及出租车)作为目的和系统进行对话。
3 数据标注。论文雇佣大量工人分别充当用户和系统。用户向系统订酒店景点,然后系统回复用户预约的相关信息。所有的对话数据都是用户生成的。同时用户在对话过程中还需要对用户状态和系统状态进行标注。具体的过程如下图。
图 1:对话示例。 用户状态由用户目标初始化:找到一个景点及其附近的酒店之一,然后预订出租车在这两个地方之间通勤。 除了表达预先指定的可通知槽和填充可请求槽外,用户还需要考虑和修改通过对话而变化的跨域可通知槽(粗体)。 我们只显示了几个回合(左边的回合数),每个回合都有当前域的用户或系统状态,显示在每个话语上方。
常见任务
有了多轮对话数据集,而且标注这么详细,我们就有研究多轮对话的条件了。
多轮对话有以下五个研究方向:
- 多轮对话下的自然语言理解(Natural Language Understanding)
- 对话状态追踪(Dialogue State Tracking)
- 对话策略学习(Dialogue Policy Learning)
- 自然语言生成(Natural Language Generation)
- 用户模拟器(User Simulator)
多轮对话下的自然语言理解(NLU)
多轮对话下的NLU通常是针对用户的输入语句让模型填满这样一个四元组
(intent=Inform, domain=Attraction, slot=fee, value=free)
通过意图识别和ner我们就可以完成nlu。本文提出了一种BERTNLU-context的模型来做多轮对话下的nlu。BERTNLU不必多说,就是把bert作为encoder对输入文本进行编码。然后为了利用上下文信息,BERTNLU-context会把对话历史的之前三句话用sep分割作为文本输入另一个BERT模型,取出那个模型的cls位置变量作为上下文表征。然后把该上下文表征和用户输入的语句的特征向量一一concat再进行ner和文本分类,效果很好。
对话状态追踪(DST)
DST的目地是根据用户和系统的对话历史,动态识别出用户的目地,并转为预先定义好的格式。
本文介绍了两种方法做DST
- RuleDST。设计一些规则动态识别用户状态,比如识别到用户说任意一个槽就给它填上。
- TRADE。TRADE模型需要专门的篇幅来介绍它。
TRADE模型
首先它要解决的问题是如何在一个涉及多个领域的对话中利用跨领域(domain)的信息来完成一个综合的任务。
举个例子:吴先生要去一家餐厅约会,使用智能助手订好了餐厅,其中收集了 餐厅名 时间 这些信息(slot),而之后吴先生还需要预约一辆出租车回家,那么此时他会期望智能助手明白上车点就是餐厅。那么问题来了,在传统的基于一个个独立领域的对话系统中,两个不同领域之间相互独立,不共享信息,你订你的餐厅,订完了说一句“我要订餐馆回家的出租车”,好嘞进入到订车的领域,从头开始问”您从哪出发呀“。显然不够聪明。TRADE就是试图所有的domain使用同一个模型,并利用起前面几句对话历史,来预测出当前吴先生说的这句话的 状态(state):(domain,slot,slot value)。就能判断这是【订出租车】的domain,slot是出发点,
还能从之前吴先生确认的餐馆名知道出发点就是XX大酒店。
那么,这么聪明的性能要如何做到呢?
TRADE由三部分组成:
Data
A piece of dialogue: (Names of hotels are replaced by A,B,C for simplicity.)
In data/crosswoz
directory. Data statistics:
Split | Train | Valid | Test |
---|---|---|---|
# dialogues | 5,012 | 500 | 500 |
# Turns (utterances)话语 | 84,692 | 8,458 | 8,476 |
Vocab词汇 | 12,502 | 5,202 | 5,143 |
Avg. sub-goals平均 子目标 | 3.24 | 3.26 | 3.26 |
Avg. semantic tuples平均 语义元组 | 14.8 | 14.9 | 15.0 |
Avg. turns平均轮次 | 16.9 | 16.9 | 17.0 |
Avg. tokens per turn | 16.3 | 16.3 | 16.2 |
According to the type of user goal, we group the dialogues in the training set into five categories:
- S: 417 dialogues have only one sub-goal in HAR domains.
- M: 1573 dialogues have multiple sub-goals (2-3) in HAR domains. However, these sub-goals do not have cross-domain informable slots.
- M+T: 691 dialogues have multiple sub-goals in HAR domains and at least one sub-goal in the metro or taxi domain (3-5 sub-goals). The sub-goals in HAR domains do not have cross-domain informable slots.
- CM: 1,759 dialogues have multiple sub-goals (2-5) in HAR domains with cross-domain informable slots.
- CM+T: 572 dialogues have multiple sub-goals in HAR domains with cross-domain informable slots and at least one sub-goal in the metro or taxi domain (3-5 sub-goals).
Statistics for dialogues of different goal types in the training set:
根据用户目标的类型,我们将训练集中的对话分为五类:
S:417 个对话在 HAR 域中只有一个子目标。
M:1573 个对话在 HAR 域中有多个子目标(2-3)。 然而,这些子目标没有跨域可通知槽。
M+T:691 个对话在 HAR 域中有多个子目标,在地铁或出租车域中至少有一个子目标(3-5 个子目标)。 HAR 域中的子目标没有跨域通知槽。
CM:1,759 个对话在具有跨域信息槽的 HAR 域中具有多个子目标 (2-5)。
CM+T:572 个对话在 HAR 域中具有多个子目标,具有跨域可通知时隙,并且在地铁或出租车域中至少有一个子目标(3-5 个子目标)。
训练集中不同目标类型的对话统计:
Goal type | S | M | M+T | CM | CM+T |
---|---|---|---|---|---|
# dialogues | 417 | 1573 | 691 | 1759 | 572 |
NoOffer rate | 0.10 | 0.22 | 0.22 | 0.61 | 0.55 |
Multi-query rate | 0.06 | 0.07 | 0.07 | 0.14 | 0.12 |
Goal change rate | 0.10 | 0.28 | 0.31 | 0.69 | 0.63 |
Avg. dialogue acts | 1.85 | 1.90 | 2.09 | 2.06 | 2.11 |
Avg. sub-goals | 1.00 | 2.49 | 3.62 | 3.87 | 4.57 |
Avg. semantic tuples | 4.5 | 11.3 | 15.8 | 18.2 | 20.7 |
Avg. turns | 6.8 | 13.7 | 16.0 | 21.0 | 21.6 |
Avg. tokens per turn | 13.2 | 15.2 | 16.3 | 16.9 | 17.0 |
We also provide database in data/crosswoz/database
.
Data format
- task_id: dialog
- sys-usr: system annotator ID and user annotation ID.
- goal: list of tuples, includes:
- sub-goal id
- domain name
- slot name
- constraint if filled, else requirement
- whether be mentioned in previous turns
- message: dialog turns. Each turn contains
- content: utterance
- role: user or system side
- dialog_act: list of dialog act tuples, includes:
- domain
- intent
- slot
- value
- user_state: same format as "goal", can be viewed as dynamic goal
- sys_state_init: the first db query emitted, records user constraints faithfully. If the system find no result that matches, he/she may relax the constraints manually and search db multiple times.
- domain: slot-value pairs
- selectedResults: db search result that would be used in this turn
- sys_state: the final db query emitted, records the db used by the system in this turn. Note that this may not satisfy all user constraints.
- final_goal: user state/goal at the end of dialog
- task description: natural language description of the user goal.
- type: dialog type.
Code:
- BERTNLU:
convlab2/nlu/jointBERT/crosswoz
- RuleDST:
convlab2/dst/rule/crosswoz
- TRADE:
convlab2/dst/trade/crosswoz
- SL policy:
convlab2/policy/mle/crosswoz
- SCLSTM:
convlab2/nlg/sclstm/crosswoz
- TemplateNLG:
convlab2/nlg/template/crosswoz
- User simulator:
convlab2/policy/rule/crosswoz
- Evaluate with user simulator:
convlab2/policy/mle/crosswoz/evaluate.py
Annotation Platform
We also release our annotation platform (Sep 10, 2021), supporting two annotators converse synchronously and make annotations online. Please refer to the web
directory.
标注平台
我们还发布了我们的注释平台(2021 年 9 月 10 日),支持两个注释者同步对话并在线进行注释。 请参考网页目录。
https://github.com/thu-coai/CrossWOZ/tree/master/web
操作指南
启动服务器以后,可以使用默认管理员账户登录。
用户名:root
密码:root
若要进入普通用户界面,请点击注册链接,使用邀请码注册。
当前邀请码为 959592
,可以修改 data_labelling/app.py
的 invitation_code
。
普通用户登录后,进入对话匹配界面,匹配需要至少有一人选择系统端,一人选择用户端,此时系统会自动完成匹配,两人进入对话界面。
提示:如果在本地测试功能,可以使用 Chrome 的无痕窗口同时登录两个用户。
在对话界面,用户端先开始对话,以一问一答的方式进行。某一方发送消息后,另一方可以立即看到,但是只有当前者完成必要的信息标注后,后者才可以发送消息。
对话页面相关逻辑参见 templates
目录下的文件。
管理员可以在后台导入预先定义的任务,导出对话数据。
导入任务的步骤是:在 Result Files 选项卡下,进入 inputs 目录,上传任务定义文件 tasks.json,再回到管理首页,点导入按钮。导入成功后,系统会告知导入成功的任务数量。此时也可以到 Task 选项卡查看详情。
导出数据直接在管理首页点下载全部即可。