EthanLab 软件开发 · 产品管理 · 科技评测
返回研究笔记

[对话式AI-3] Chatbot的记忆与决策–对话管理篇

更新于

聊天机器人的对话管理(Dialogue Management)是为了总结目前的对话状态,并决定系统该做些什么。通常分为两个子模块,负责更新对话状态的「对话状态追踪」(Dialogue State Tracking),其输入自然语言理解模块所得到的用户动作,以及过往的对话历史,输出对话状态;以及决定系统动作」的「对话策略学习」(Dialogue Policy Learning),其输入对话状态,输出系统动作。上述的「用户动作、对话状态、系统动作」皆可用一个意图与一组槽位值表示。

对话状态追踪(Dialogue State Tracking)

目的是通过「用户动作」及「对话历史」更新对话状态,其对话历史可能隐含着因信息不足,经过系统反问用户后,产生的「多轮对话」内容;有些需求还会参考用户画像(User Profile),以补足必要的「个性化信息」。通过推理和总结上述内容,转换成简单的对话状态(一个意图与一组槽位值),系统可以将当前的对话状态映射成更完整的表示(Representation)。为了考虑自然语言的模棱两可、语音辨识或自然语言理解模块产生的失误,根据可能正确的用户动作数量,可进一步分成只考虑置信度最高的1-Best,以及考虑多个用户动作与置信度的N-Best方法;常用CRF、RNN、LSTM模型追踪串行。

对话策略学习(Dialogue Policy Learning)

目的是通过「对话状态」决定系统该做些什么,如果对话状态的意图在系统能够提供的服务项目之内,系统会检查槽位值是否齐全,然后使用其内容查找服务API,以得到关键答案或内容;若对话状态的意图不明,或其符合特定服务但槽位值有缺失,系统应该主动向用户提问,通过多轮对话及对话状态追踪来搜集足够的信息。最后将关键答案或内容封装到系统动作中,以一个意图及一组槽位值代表,提供给自然语言生成模块(Natural Language Generation)。

对话策略的实作方法

  • 基于规则( Rule-based )的方法,通过编写明确的规则,来创建各种槽位状态下,用户动作所对应的系统动作,此种方法无法处理不确定的状态,且需要手工编写大量规则,仅适合特定领域的简单场景。
  • 基于有限状态机(Finite-State Machine, FSM),此种方法又可分为「以点代表槽位状态,以边代表系统动作」,以及「以点代表系统动作,以边代表槽位状态」两种方案;槽位状态可分为有或无,系统动作则是询问槽位或最后回答两种,为避免置信度过低,也可以增加动作请用户二次确认。由于前者在槽位增加时,会使状态数量急遽增多,只适合数据驱动的方式;若要以手工建置会建议采用后者。采用有限状态机的优点在于实作简单,且容易理解,缺点是每个状态和动作都要手工设计,不利于复杂场景。
  • 基于统计(Statistical-based)的方法,通常采用马可夫链(Markov Chain)将对话过程表示成决策过程,而系统在每个对话状态中决定下一步动作。采用马可夫链的优点在于只需要在决策过程中定义槽位状态与系统动作,就可以自动学习到状态的移转关系,也可在过程中导入强化学习(Reinforcement Learning)与在线学习(Online Learning),缺点是同样需要手工设计,不利于复杂场景。
  • 基于深度学习(Deep Learning)的方法,输入用户动作及相关特征,输出对应的系统动作,以训练深度类神经网络模型。基于深度学习的方法需要大量训练数据才能够取得效果,目前实际应用上还难以满足此须求。

对话管理的具体流程

  1. 自然语言理解模块取得用户对话「推荐我一家台北的餐厅」,此时会侦测用户意图及识别命名实体,并将结果封装成用户动作(意图=推荐餐厅, 地点=台北),得以将自然语言映射成简单的语意表示。
  2. 对话状态追踪模块通过用户动作(意图=推荐餐厅, 地点=台北)更新当前的对话状态,然后在地点填充常用的默认值,并通过用户画像补充用餐的个性化信息,最后输出对话状态(意图=推荐餐厅, 地点=台北公馆, 口味=喜欢吃辣)。
  3. 对话策略学习模块得到对话状态后,发现其意图在系统能够提供的服务项目之内,但还缺少了用餐时间,系统应该反问用户;所以输出系统动作(意图=对空白槽位提问, 地点=台北公馆, 口味=喜欢吃辣, 时间=Null)。
  4. 自然语言生成模块运行系统动作,产生问句向用户提问欲用餐的时间「你想在什么时候用餐呢?」。
  5. 自然语言理解模块取得次轮的用户对话「明天中午」,再次侦测意图及识别命名实体,得到用户动作(意图=不明, 时间=2020年3月30日12点)。
  6. 对话状态追踪模块参考用户动作及对话历史,更新当前的对话状态(意图=推荐餐厅, 地点=台北公馆, 口味=喜欢吃辣, 时间=2020年3月30日12点)。
  7. 对话策略学习模块利用对话状态及对话历史,搜集餐厅推荐服务的必要信息,通过查找服务API得到答案后,封装成系统动作(意图=推荐餐厅, 地点=台北公馆, 口味=喜欢吃辣, 时间=2020年3月30日12点, 餐厅=右手餐厅, 类型=泰式料理)。
  8. 自然语言生成模块运行系统动作,产生具体答案「建议你明天中午可以到台北公馆的右手餐厅享用酸辣的泰式料理」。

未来的发展方向

为了解决基于深度学习的对话管理方法,在训练数据上普遍不足的问题,业界已尝试使用N-Shot Learning在小样本下进行训练,或使用Zero-Shot Learning在没有任何训练数据的情况下,进行现有模型的迁移与补全,以及在马可夫链决策过程中,导入强化学习(Reinforcement Learning)与在线学习(Online Learning),创建奖惩与持续学习的机制;也有学者将生成对抗网络(Generative Adversarial Network, GAN)应用在自然语言处理上,通过结合强化学习的SeqGAN让两个模型相互博弈,以学习到最强的对话策略。

参考文献