对一个pipeline任务导向型对话系统,最重要的三个模块回顾:

  1. 自然语言理解(Natural Language Understanding,NLU)
    NLU 模块负责从用户的发言中解析出对话中包含的关键信息,如领域、意图、槽位等。在早期的对话系统中,主要依靠基于规则匹配的方式提取信息,而现代对话系统则主要采用统计机器学习模型,基于大量语料训练得到。当然,也存在混合解决方案的 NLU,如同时支持基于规则和基于语料的实体提取。
  2. 对话管理器(Dialog Management,DM)
    DM 模块为对话系统的主体,负责管理当前对话的状态 (State) 和策略 (Policy),其中State包括用户与对话代理人之间的历史聊天记录以及关键信息,Policy是根据状态输出回复的函数。 DM 由两部分构成:
    1. 对话状态跟踪(Dialogue State Tracker,DST):接收上文的对话状态以及NLU的输入,更新当前对话的状态,和背后数据库或知识库进行交互,查询满足用户条件的实体;
    2. 对话策略学习(Dialogue policy learning,DPL):根据当前对话状态,选择下一步系统需要回复的结构化信息,输出action传递给NLG/TTS模块;
  3. 自然语言生成(Natural Language Generation,NLG)
    NLG模块仍广泛采用传统的基于规则的方法,将接收的结构化信息及系统动作,并转换成自然语言,反馈给用户。

对话管理(DM)

对话管理( Dialogue Manage)简述

DM 的主要作用是根据NLU的结果来更新对话状态,并生成相应的系统动作。
image.png
首先思考一个问题,为什么一个对话系统需要对话管理,好像即使只有自然语言理解和自然语言生成也可以构成一个对话系统,确实如此,但这样的对话系统只能实现单轮对话,或者说,这样的系统是没有记忆的,比如一个订机票的系统,可能你刚告诉了系统你的目的地是北京,它下一句话又可能问你想飞去哪里,归根到底是因为你说的每一句话对系统来说都是独立来理解的,系统并没有综合分析历史聊天记录,而这就是对话管理的其中一个作用。

一般来说,对话系统具有对话状态追踪Dialogue State Tracking和对话策略学习Dialogue Policy Learning两部分。DST 做的是分析 state,而 DPL 做的是分析 action。

  • DST 在工作过程中维护了一个系统状态,记录了哪些槽位已经被填充、下一步该做什幺、填充什么槽位,还是进行何种操作,并根据每一轮对话更新当前的对话状态。一般来说通过简单的槽状态替换即可实现。

  • DPL 根据 DST 中的对话状态,产生系统行为,决定下一步应该做什么。比如缺失了某个槽位,那就应该产生一个询问的 action.

比如说”点一杯xxx咖啡”,此时系统需要弄明白是什么咖啡,甜度怎么样等等。所以会检索点咖啡所需要的槽值对,这个时候后台检索发现完成这个任务需要弄明白{咖啡类型=?,甜度=?},这个时候系统会反馈回去问用户咖啡类型是什么?甜度是多少?之后根据领域/意图分类,系统判断用户的意图是(NLU→”点咖啡”),槽位是(咖啡类型={“卡布奇诺”: 0.8, “拿铁”: 0.2}),DST需要结合当前的用户输入(即前面的槽值对)、系统上一时刻的动作(”询问需要什么类型的咖啡”)以及之前多轮对话历史来判断咖啡类型到底是哪个,最后计算得到(咖啡类型={“卡布奇诺”: 0.9}),认为是卡布奇诺的概率为90%,这是DST评估后认为咖啡类型的当前状态,之后会做一个状态更新。当然还有很多其他的槽,可能甜度还没有问过,所以{甜度=none},等待DPL去询问用户。

DST

在进一步理解DST之前,需要先理解对话状态 state的具体含义。简单来说,我们可以认为state就是输入语句的intent和slot、上一时刻的state和action(这里假设了当前对话最多和上一轮对话相关联)。一般情况下我们说要维护更新state,更多情况下是就是指更新slot-value,比如说,订机票的系统,如果订一张机票需要的三个slot{出发地=?,目的地=?,时间=?},在上一轮的对话中用户已经提供了出发地和目的地,那么这一轮系统就应该能在对话管理中及时更新相应的slot的value,同时确定当前的action是确定出时间的value,基于这个action,通过NLG模块生成这一轮系统的回复”请问什么时间出发?”

既然明确了DST的state还是指slot-value,那么对于DST其实需要做什么就不难理解了,答案就是根据 ①目前为止的槽位填充情况;② 对话历史;以及 ③ 本轮对话过程中的用户动作,来更新更新该轮的state(slot)。数学化表达:根据之前时刻 t 的状态2022-04-12-对话系统之DST - 图2,和之前时刻 t 的动作2022-04-12-对话系统之DST - 图3,以及当前时刻 t+1 对应的用户动作 (new intent 和 new slot)2022-04-12-对话系统之DST - 图4,来更新 t+1 时刻的对话状态2022-04-12-对话系统之DST - 图5,写成公式表达为:2022-04-12-对话系统之DST - 图6

至于这个action是什么,我觉得涉及的范围其实挺广的,比如说对一个订机票的系统,这个action可以是根据用户需求在数据库中查询机票信息,可以是询问用户提供订机票所需要的信息,对一个知识问答系统,这个action可以是根据用户的提问在知识库中匹配答案,所以说,对于不同的系统,根据不同的业务和实际情况这个action做的东西都有可能不同。

最后简单总结一下,对话管理主要包含两个重要模块,首先是Dialogue State Tracking,主要作用是基于当前轮和上一轮的对话,分析出当前用户真实的语义state,然后是Dialogue Policy Learning,根据state确定出系统需要处理的action,并完成这个action,把结果传给NLG模块,生成最终的回复。

参考

  1. 【DST系列】DST概述
  2. 【DST系列】DST方法分类
  3. 【DST系列】DST模型介绍
  4. 【DST系列】DST在贝壳咨询助手中的应用