聊天机器人-DST模块

这部分也被称为Belief Tracking。

首先要思考为什么需要DST?

这个问题是因为我们需要一种对话状态,或者至少我们觉得对话流程有一种状态性的东西比较合适。

1. 什么是DST

对话状态追踪(Dialogue State Tracker),对DST来说包括只读部分和可变部分。DST模块以当前的用户动作U_n、前n-1轮对话状态和相应的系统动作作为输入,输出是DST模块判定得到的当前对话状态s_n

对话状态的表示(DST-State Representation)通常由以下3部分构成:

  1. 本轮对话过程中的用户动作(u_n)
  2. 目前为止的槽位填充情况(slots)
  3. 对话历史(history)

1.1 什么是对DST只读的

  • 例如用户行为是用户决定的,系统应该不改变(但是可以增强或修正),所以对DST来说就是只读的。
  • 例如系统行为是DPL发出的,是系统做过的决策,这个自然也是只读的。

1.2 什么是对DST可变的

  • 对于基于帧(Frame)的对话系统来说,可变部分基本上已经定义了帧中的内容。
  • 例如我们设计这样的一个对话帧,用来实现返回天气预报。我们假设这个系统只能回答某一天某个城市的天气,那么就有两个必要变量:城市和日期。

那么我们设计语义帧可以这么做:

{
      "city": null,
      "date": null
}

也就是说当用户inform了系统的所有必要条件,这里是city和date之后,并且DST也填充更新了语义帧,那么DPL应该就能给出对应的天气回答。

其中槽位填充情况通常是最重要的状态表示指标。

2. 槽位设计

我们知道,由于语音识别不准确或是自然语言本身存在歧义性等原因,NLU模块的识别结果往往与真实情况存在一定的误差。所以,NLU模块的输出往往是带概率的,即每一个可能的结果有一个相应的置信程度。由此,DST在判断当前的对话状态时就有了两种选择,这两种选择分别对应了两种不同的处理方式,一种是1-Best方式,另一种则是N-Best方式

  • 1-Best方式指DST判断当前对话状态时只考虑置信程度最高的情况,因此维护对话状态的表示时,只需要等同于槽位数量的空间,如图:

    1-Best

  • N-Best方式指DST判断当前对话状态时会综合考虑所有槽位的所有置信程度,因此每一个槽位的N-Best结果都需要考虑和维护,并且最终还需要维护一个槽位组合在一起(overall)的整体之心程度,将其作为最终的对话状态判断依据,如图:

    N-Best

3. 举例说明

整个问答类似这样:

- 用户:我要查天气
- 系统:好的,要查哪个城市的?
- 用户:广州
- 系统:查哪天的?
- 用户:明天
- 系统:明天广州天气是xxx

在这个过程中我们可以认为有三轮交互(用户到系统),如果写成用户行为和系统行为那么是这样的:

- User:requestWeather()
- Sys:request(city)
- User:inform(city=广州)
- Sys:request(date)
- User:inform(date=明天)
- Sys:informWeather(city=广州,date=明天)

我们分为3轮,看看语义帧的变化:

- User:requestWeather()
- State Before DST:
  - user_action_t = null
  - sys_action_t-1 = null
  - city = null
  - date = null
- State After DST:
  - user_action_t = requestWeather()
  - sys_action_t-1 = null
  - city = null
  - date = null
- Sys:request(city)

在通过DST之前,我们可以认为系统是一篇空白,都是null(空)。

在DST之后我们可以认为DST更新了user_action, 而用户行为也可以认为是自动更新的而不是DST的功劳。

- User:inform(city=广州)
- State Before DST:
  - user_action_t = requestWeather()
  - sys_action_t-1 = request(city)
  - city = null
  - date = null
- State After DST:
  - user_action_t = inform(city=广州)
  - sys_action_t-1 = request(city)
  - city = 广州
  - date = null
- Sys:request(date)

在通过DST之前,State和前一轮通过DST之后是一致的。

然后因为提供了“北京”这个信息,所以DST更新了city这个项。所以本质上DST在这里的作用只有一个,决定某个语义帧的一项,要不要更新。

我们例子比较简单,但是DST是很多不能更新的时候,例如用户输入的系统没有理解,或者理解的概率很低,那么DST就不应该被更新。当然此时应该有其他的语义帧来标识这种状态。

- User:inform(date=明天)
- State Before DST:
  - user_action_t = inform(city=广州)
  - sys_action_t-1 = request(date)
  - city = 广州
  - date = null
- State After DST:
  - user_action_t = inform(date=明天)
  - sys_action_t-1 = request(date)
  - city = 广州
  - date = 明天
- Sys:informWeather(city=北京,date=明天)

这一轮的对话基本同上。


我们假设一种情况,用户会说错,或者是一些重要选项其实可能是需要用户确认的情况。例如用户如果买票,但是要么语音识别出错,要么NLU出错,把“北京市”识别成“北海市”(广西的一个市),例如用户说:“我想去北京看北海,请问天气怎么样”,但是错误的被NLU理解成了想去北海市,或者NLU同时识别了北京市和北海市,或者这两者的置信度都比较低(NLU不确定用户想要什么),那么就应该做出一个让用户确认的操作,一般这个操作被称为confirm。我们看一下假设对话行为和状态包含了confirm会如何。

{
    "city": null,
    "city_confirmed": false,
    "date": null,
    "date_confirmed": false
}
- 用户:我要查天气
- 系统:好的,要查哪个城市的?
- 用户:我想去北京看北海
- 系统:请问是北京市吗?
- 用户:是的
- 系统:那么查哪天的?
- 用户:明天
- 系统:明天北京的天气是xxx

在这个过程中我们可以认为有三轮交互(用户到系统),如果写成用户行为和系统行为那么是这样的:

- User:requestWeather()
- Sys:request(city)
- User:inform(city=北京), inform(city=北海) # 这两个行为是并列的,但是置信度不同
- Sys:confirm(city=北京)
- User:confirm
- Sys:request(date)
- User:inform(date=明天)
- Sys:informWeather(city=北京, date=明天)

主要变化的是下面这一步:

- User:inform(city=北京), inform(city=北海) # 这两个行为是并列的,但是置信度不同
- Sys:confirm(city=北京)
- User:confirm

我们可以认为逻辑是这样的:假设NLU输出的结果,出现了太多不确定的内容,或者不确定性大于某个阈值,系统就可以反问用户来确认答案。

当然从系统设计上来说,系统反问次数越多,系统状态正确的可能性越大,但是系统反问越多,系统的可用性就越低,因为太长的对话本身会导致用户体验的下降

4. 是否可以无状态?

首先答案,基本上是可以的。

实际上在一些研究上的End-to-End系统中,DST本身只是以一种向量分布或者类似完全记忆化的形式存储在神经网络中,而不需要直接的定义。这不能算无状态,但是也可以算隐藏状态

但是缺点也是显而易见的,因为并不知道状态,至少不知道状态的实际意义(因为它可能只是一个分布),所以假设它输入DPL导致错误的系统行为,我们也很难调试

5. 实现方式

实现DST模块的方法主要有:基于条件随机场模型的序列跟踪模型、基于RNN和LSTM的序列跟踪模型等。

参考文献

  1. 自然语言处理与实践
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容