K.1 对话行为与对话状态
前面介绍的朴素槽位抽取系统能够处理简单对话,但我们经常需要更复杂的交互。例如,系统可能需要确认自己已经理解用户,或请用户重复一遍。借助对话行为(dialogue act)和对话状态(dialogue state),可以构建更复杂的系统。
K.1.1 对话行为¶
对话行为是言语行为的推广,它还表示对话中的落地(grounding),即参与者确认彼此已经理解的过程。对话行为集合既可以是通用的,也可以专门针对特定对话任务设计。
标签 | 说明 |
|---|---|
| 开始对话,并给出信息 |
| 给出信息 |
| 在给定 的条件下请求 的值 |
| 请求满足 的其他选项 |
| 显式确认 |
| 隐式确认 ,并请求 的值 |
| 请用户在 与 之间选择 |
| 肯定,并进一步给出信息 |
| 否定,并给出修正值 |
| 否认 |
| 结束对话 |
图 K.4 Young 等人(2010)的 HIS 餐厅推荐系统所用的对话行为。原表还分别标出了哪些行为可由系统输出、哪些可由用户输入。
图 K.4 给出餐厅推荐系统的一组标签;图 K.5 则用这些标签标注 HIS 系统的一段示例对话(Young et al., 2010)。该示例还展示每个对话行为的内容,即行为所传递的槽位填充值。例如,用户可以用 INFORM 告诉系统自己想在博物馆附近吃意大利菜,也可以用 CONFIRM 向系统确认价格是否适中。
| 话语 | 对话行为 |
|---|---|
| 用户:你好,我在找吃饭的地方。 | hello(task=find, type=restaurant) |
| 系统:您在找餐厅。喜欢哪种菜? | confreq(type=restaurant, food) |
| 用户:我想吃博物馆附近的意大利菜。 | inform(food=Italian, near=museum) |
| 系统:Roma 是博物馆附近一家不错的意大利餐厅。 | inform(name="Roma", type=restaurant, food=Italian, near=museum) |
| 用户:价格适中吗? | confirm(pricerange=moderate) |
| 系统:是的,Roma 的价位适中。 | affirm(name="Roma", pricerange=moderate) |
| 用户:电话号码是多少? | request(phone) |
| 系统:Roma 的号码是 385456。 | inform(name="Roma", phone="385456") |
| 用户:好的,谢谢,再见。 | bye() |
图 K.5 HIS 系统的一段对话,使用图 K.4 中的对话行为(Young et al., 2010)。
K.1.2 对话状态跟踪¶
对话状态跟踪器(dialogue-state tracker)的任务,是确定框架的当前状态——即每个槽位的填充值——以及用户最近一次对话行为。对话状态不只是当前句子中的槽位填充值,还包含此刻整个框架的状态,并概括用户到目前为止提出的全部约束。图 K.6 摘自 Mrkšić 等人(2017),展示每一轮之后的对话状态。
检测对话行为与领域或意图分类的方法相同:让输入句子通过编码器,再添加一个行为分类器。把前一个对话行为也作为输入,往往能提高分类效果。由于对话行为会对槽位及其取值施加一定约束,对话行为检测和槽位填充经常联合执行。状态跟踪器可以在每句话后直接接收槽位填充序列模型(K.0.1 节)的输出;也可以采用更复杂的方法,例如训练分类器来判断某个值是否发生了改变。
| 轮次与话语 | 对话状态或行为 |
|---|---|
| 用户:我想找一家便宜些的餐厅。 | inform(price=cheap) |
| 系统:好的。想吃哪种菜,位置在哪里? | price=cheap |
| 用户:泰国菜,市中心的某个地方。 | inform(price=cheap, food=Thai, area=centre) |
| 系统:The House 提供便宜的泰国菜。 | price=cheap, food=Thai, area=centre |
| 用户:它在哪里? | request(address) |
| 系统:The House 位于 Regent Street 106 号。 | inform(address="106 Regent Street") |
图 K.6 每轮对话之后对话状态跟踪器的输出(Mrkšić et al., 2017)。
一种特殊情况是检测纠正行为(correction act)。对话系统错误识别或误解一句话后,用户会重复或换一种说法。检测这种用户纠正行为非常重要,对口语尤其如此。颇具讽刺意味的是,纠正语句实际上比普通语句更难识别(Swerts et al., 2000),因为受挫的用户会调整说话方式,而这种方式恰恰令语音识别器难以处理(Goldberg et al., 2003)。例如,说话者纠正错误时经常采用一种称为过度清晰发音(hyperarticulation)的韵律风格:话语音量更大、时长更长,或音高更夸张,如 “I said BAL-TI-MORE, not Boston”(我说的是“巴—尔—的—摩”,不是 Boston)(Wade et al., 1992;Levow, 1998;Hirschberg et al., 2001)。纠正行为可以由通用的对话行为分类器检测,也可以利用词语之外的专门特征,例如下表所列特征(Levow, 1998;Litman et al., 1999;Hirschberg et al., 2001;Bulyko et al., 2005;Awadallah et al., 2015)。
特征 | 示例 |
|---|---|
语义 | 纠正语句与用户上一条话语之间的嵌入相似度 |
语音 | 候选纠正行为与用户上一条话语之间的语音重叠,例如 “WhatsApp” 可能被误识别成 “What’s up” |
韵律 | 过度清晰发音、基频 范围增大、停顿时长增加以及词时长增加 |
ASR | ASR 置信度、语言模型概率 |
K.1.3 对话策略:生成哪一种行为¶
早期商业框架式系统的对话策略(dialogue policy)很简单:不断提问,直到所有槽位均已填满;查询数据库;然后把结果报告给用户。更复杂的对话策略可以帮助系统决定何时回答用户的问题、何时改为向用户提出澄清问题等。因此,对话策略决定系统接下来要生成何种对话行为。选择要生成的对话行为及其论元,有时称为内容规划(content planning)。
下面用几种重要的对话行为说明这一过程。对话系统,尤其是语音系统,经常会误识别用户的词语或意思。为确保系统与用户具有共同基础(common ground),系统必须向用户确认自己的理解,或拒绝处理自己未能理解的话语。系统可以使用显式确认行为,例如以下对话中的 “Is that correct?”:
用户:I’d like to fly from Denver Colorado to New York City on September twenty first in the morning on United Airlines.
系统:Let’s see then. I have you going from Denver Colorado to New York on September twenty first. Is that correct?
使用隐式确认行为时,系统会以更不显眼的方式建立共同基础,例如在提出下一个问题时顺带重复自己的理解。下面的例子在提问中确认了 Shanghai:
用户:I want to travel to Shanghai.
系统:When do you want to travel to Shanghai?
两种方式之间存在权衡。显式确认使用户能够仅用 “no” 回答确认问题,从而更容易纠正误识别;但它既耗时又显得生硬(Danieli and Gerbino, 1995;Walker et al., 1998)。我们可能还需要表达未能理解的行为,即拒绝(rejection),例如提示 “I’m sorry, I didn’t understand that.”。为了在这些行为之间作出选择,可以利用 ASR 系统通常会计算转写置信度这一事实;该置信度经常基于系统赋予句子的对数似然。于是,系统可以只对低置信度句子进行显式确认。系统也可以设置四个置信等级,并使用三个阈值 、 和 :
< α 低置信度:拒绝
≥ α 超过阈值:显式确认
≥ β 高置信度:隐式确认
≥ γ 极高置信度:完全不确认K.1.4 自然语言生成:句子实现¶
recommend(restaurant name=Au Midi, neighborhood=midtown, cuisine=french)
1 Au Midi is in Midtown and serves French food.
2 There is a French restaurant in Midtown called Au Midi.图 K.7 NLG 句子实现阶段的示例输入。内容规划器预先指定对话行为和属性,句子实现器则可以生成两种不同的输出句。示例来自 Nayak 等人(2017)的餐厅推荐系统。
选定对话行为后,还需要生成向用户作答的文本。这一生成过程称为句子实现(sentence realization)。图 K.7 给出句子实现阶段的一个输入/输出示例。内容规划器已经选定对话行为 RECOMMEND,以及若干槽位(名称、街区、菜系)和填充值。句子实现器通过在带标签对话语料库中的“表示—句子”样例上训练,生成第 1 行或第 2 行那样的句子。
由于每一种表达方式的训练数据中不可能出现所有餐厅或属性,我们可以进行去词汇化(delexicalization):把训练集中表示具体槽位值的词替换成代表该槽位的通用占位词元,从而推广训练样例。图 K.8 展示图 K.7 中句子的去词汇化形式。
recommend(restaurant name=Au Midi, neighborhood=midtown, cuisine=french)
1 restaurant_name is in neighborhood and serves cuisine food.
2 There is a cuisine restaurant in neighborhood called restaurant_name.图 K.8 可用于生成许多不同再词汇化句子的去词汇化句子。示例来自 Nayak 等人(2017)的餐厅推荐系统。
我们可以使用编码器—解码器模型,把框架映射为去词汇化句子(Mrkšić et al., 2017 等);模型在 MultiWOZ(Budzianowski et al., 2018)等手工标注的对话语料库上训练。编码器的输入是词元序列 ,表示对话行为(如 RECOMMEND)及其论元(如 service:decent、cuisine:null)(Nayak et al., 2017),如图 K.9 所示。

图 K.9 编码器—解码器句子实现器,把槽位/填充值映射为英语句子。
解码器输出去词汇化的英语句子 “name has decent service”,随后可对它进行再词汇化(relexicalization),即重新填入正确的槽位值,得到 “Au Midi has decent service”。