任务型对话系统简介
任务型对话系统简介
1 三种对话系统概览
对于一个对话机器人而言,常见的对话形式有三种,分别是问答型(QA)、任务型(Task)和闲聊型(Chat):
- 问答型(QA):简单的一问一答的形式,机器人对用户提出的问题进行解析,在知识库已有的内容中查找并返回正确答案。对于机器人而言,每次问答均是独立的,与上下文信息无关。
- 任务型(Task):主要指机器人为满足用户某一需求而产生的多轮对话,机器人通过理解、澄清等方式确定用户意图,继而通过答复、调用 API 等方式完成该任务。在该任务内,机器人需要理解上下文信息并作出下一步的动作。
- 闲聊型(Chat):闲聊型对话大多为开放域的对话,主要以满足用户的情感需求为主,通过产生有趣、富有个性化的答复内容,与用户进行互动。
对于一个对话机器人而言,并非只包含一种类型的对话,通常是多种对话类型的组合。1
2 任务型对话系统(Task-Oriented Dialogue System)
对话系统的具体实现一般分为两种,一种是端到端的(End-to-End),即从用户的输入到系统的输出均由一个神经网络实现,好处是结构简单,但是需要大量的训练数据支持,另一种是我们接下来将要介绍的模块化任务型对话系统。
任务型对话的框架图如下所示2:
以一个做咖啡的对话场景为例解释以上过程:
User 1:I would like a cup of coffee.
Assistant 1:What coffee would you like?
User 2:What coffee do you serve?
Assistant 2:We serve Espresso, Americano, Latte, Mocha, etc.
User 3:I would like a cup of Latte.
Assistant 3:Hot Latte or Iced Latte?
User 4:Hot Latte.
Assistan 4t:What cup size do you want?
User 5: Tall.
...
2.1 SLU
把自然语言转换成机器可以处理的领域(domain)/意图(intention)和槽值对(slot-value pairs),他的输入是代表用户输入的 \(X_n\),输出是 \(U_n\)
- \(X_n\):用户的输入
- 输出 \(U_n = (I_n, Z_n)\),\(I_n\) 是意图,\(Z_n\) 是槽值对
- \(I_n=f(X_n)\):\(f(X)\) 是意图分类,一般分类方法都行,也可采用 DBN、DCN 等方法
- \(Z_n=g(X_n)\):\(g(X)\) 是槽值对构建方法
在多轮对话过程中,系统为完成任务而需要获取的关键信息我们称之为槽位,例如“订机票”这个意图所包含的槽位就是[出发地]、[目的地]和[出发时间];而槽位内的信息我们称之为槽值,在“订机票”这个例子中,[出发地]这一槽位内的槽值可以是用户说的“上海”;而系统把“上海”这两个字填充到[出发地]这个槽位的过程,则被称之为“填槽”,即 Slot filling。[^1]
Input:\(X_3\) = “I would like a cup of Latte.”
Output:\(U_3=\{I_3, 3\}\),\(I_3=\rm{Order}\),\(3: \rm{\{CoffeeType=Latte\}}\)
...
2.2 DST
作用是根据领域(domain)/意图(intention) 、槽值对(slot-value pairs)、之前的状态以及之前系统的 Action 等来追踪当前状态。它的输入是 \(U_n\)、\(A_{n-1}\) 和 \(S_{n-1}\),输出是 \(s_n\)
- 输出 \(S_n = \{G_n,U_n,H_n\}\)
- \(G_n\) 是用户目标
- \(U_n\) 是 SLU 的输出结果
- \(H_n\) 是聊天的历史,\(H_n= \{U_0, A_0, U_1, A_1, ... , U_{n-1}, A_{n-1}\}\)
- \(G_n = f(S_{n-1},A_{n-1},U_n)\)
Input:
- \(U_3=\rm{\{ Intention=Order, \{CoffeeType=Latte\} \}}\)
- \(A_2=\rm{\{Action=Inform, \{CoffeeType=Espresso, Americano, Latte, Mocha\}\}}\)
- \(S_2 =\{G_2, U_2, H_2\}\)
- \(G_2=\rm{\{CoffeeType=?, Size=?, Temp=?\}}\)
- \(U_2=\rm{\{Intention=Ask, {CoffeeType=?}\}}\)
- \(H_2=\{U_1, A_1\}\)
Output:
- \(S_3 = \{G_3, U_3, H_3\}\)
- \(G_3 = \rm{\{CoffeeType=Latte, Size=?, Temp=?\}}\)
- \(U_3 = \rm{\{ Intention=Order, \{CoffeeType=Latte\} \}}\)
- \(H_3 = \{U_1, A_1, U_2, A_2\}\)
2.3 DPL
基于当前状态(state)决定系统需要采取的 action。它的输入是 \(S_n\),输出是 \(A_n\)
- \(A_n\) 是系统的 Action,\(A_n =\{D_n, \{Attr_i, V_i\}\}\),\(D_n\) 是对话类型,\(Attr_i\)、\(V_i\) 是第 \(i\) 轮对话的 attribute 和其 value
Input:
- \(S_3 = \{G_3, U_3, H_3\}\)
- \(G_3 = \rm{\{CoffeeType=Latte, Size=?, Temp=?\}}\)
- \(U_3 = \rm{\{ Intention=Order, \{CoffeeType=Latte\} \}}\)
- \(H_3 = \{U_1, A_1, U_2, A_2\}\)
Output:
- \(A_3=\rm{\{Action=Ask, \{CoffeeType=Latte, Temp=?\}}\)
2.4 NLG
把系统的 Action 转换成用 \(Y_n\) 表示的自然语言形式的系统 response。它的输入是 \(A_n\),输出是 \(Y_n\)
Input:\(A_3=\rm{\{Action=Ask, \{CoffeeType=Latte, Temp=?\}}\)
Output:\(Y_3\) = "Hot Latte or Iced Latte?”