任务型对话中,一般包含ASR、语义理解、多轮状态追踪、会话策略、自然语言生成(NLG)模块,那么任务型对话中都有哪些生成的方法呢?
基于模板
因为任务型对话中,生成任务有两个作用,1. 向用户传递信息,例如搜索到的机票信息(inform_槽位)等,提供给用户选择。2. 进行用户问询,主要是ontology中定义好的字段,比如常见的订票场景中的出发地、目的地(request_槽位)等。
因此,可以事先针对传递信息、用户问询的槽位,设计好模板,然后实际应用时,将其中的槽位使用对应的值替换即可。例如:
- Confirm ( name = Hinton , area = center),
- 模板=确认下您定的酒店是#hotel#,地点是#area#吗?
- 填充值=确认下您定的酒店是希尔顿,地点是城中心吗?
这个方法,就是需要将所有问询Action和槽位做组合,并且槽位之间可能也有组合,会有可能:
- 某些情况未覆盖,会导致生成回复出错。
- 模板拼接各种值,会带来不通顺,导致用户不理解,或者出现语义错误。
- 如果做了一个领域,迁移到其他领域,还要从头开始写模板。
因此,最近也有一些结合语言模型的能力,来将原始的策略输出生成自然语言,例如这种格式:Confirm ( name = Hinton , area = center)
利用语言模型生成
2020Few-shot Natural Language Generation for Task-Oriented Dialog 代码:https://github.com/pengbaolin/ SC-GPT
出发点是用当前流行的预训练方法去提高生成回复的质量。但是任务导向型的对话往往特别依赖具体的领域,领域之间的差别会导致生成回复之间也会存在巨大的差异。所以需要引入特定的领域信息,文章提出一种few shot方案,只需要少量领域数据微调,具体步骤为
- 预训练1:首先在大规模的无标注文本上预训练。这一步和GPT-2一致,
- 预训练2:为了让生成的文本更贴近任务导向型对话的要求,模型还进一步在标注的数据集上预训练。这里的数据来自Schema-Guided Dialogcorpus, MultiWOZ corpus, Frame corpus和Facebook Multilingual Dialog Corpus,这些都是人工标注好的人物对话型数据集,来自各个领域,共计约400K个样本。
- 微调:最后,只需要在特定领域的少样本数据集下微调即可。
其中关键就是如何将dialog Act编码,其实可以看到她的方式很简单粗暴,直接dialog act作为一个句子输入到模型,作为prompt,然后指导后续的句子生成。
另外,预训练阶段2其实也挺重要的,保证了模型能够学习到对话语料,在做具备一定通用对话的能力,在做领域迁移的时候不会太差。
从上图可以看到,整体训练的数据量还是很小的。
最后看指标,以及生成的case,还是挺靠谱的,整体方法在任务型对话的NLG任务上,应该是够用了(闲聊估计是不太够),本人也在业务中实践也是比较靠谱。
中文GPT模型:预训练一阶段目前已经有中文的gpt2模型,预训练2阶段可能需要中文的对话数据集,目前百度千言开放了一些对话数据集,可以在预训练阶段2用到。微调领域生成一些应该就可以。
https://github.com/Morizeyao/GPT2-Chinese:12层的decoder。
https://github.com/imcaspar/gpt2-ml
Reference
- Schema-Guided Natural Language Generation
- TOD-BERT: Pre-trained Natural Language Understanding for Task-Oriented Dialogue
- A Survey on Dialogue Systems: Recent Advances and New Frontiers