转载于:https://blog.csdn.net/u010159842/article/details/80759428
原文链接:http://t.cn/RE0FkgD
跳槽,吐槽,匹诺曹都听过,这个填槽,emmmm,黑人问号脸???
写到这吐槽下,本来只是想写下填槽的过程,后来发现这东西不理解chatbot的对话系统的话,没法讲,看的人很容易一头雾水。
还是先简单讲下对话系统,然后再细讲填槽。
所以不知道填槽是啥往下没事,先往下看。
一、Chatbot对话系统的过程
对话系统还有很多要讲,但是今天的主角是填槽,所以初略过下。
首先,来看一个老奶奶和机器人的对话
这是一个聊天机器人在对话过程中识别出了用户意图后,帮助用户打车的case
我们来细致拆解下整个过程。
1)开放域多轮对话
这里引入一个概念——开放域对话
不太严谨的定义可以理解为 ,在不确定用户意图前的各种瞎聊,你不知道用户会问什么样千奇百怪的问题,但是chatbot都能接住,然后和用户进行对话,这种就是开放域的对话。
这里奶奶说“天气不错”,实际machine是不知道奶奶要干什么的,于是为了避免尴尬,让对话能继续下去,machine就要制造话题啦,这里machine回复了“适合去市区走走”,制造了一个新话题出来。
即使在开放域聊天的过程中,也存在着填槽的过程。
好了,引出本文主角——填槽(Slot filling)。
填槽指的是为了让用户意图转化为用户明确的指令而补全信息的过程。
例如在之前文章中提及的小爱的例子
设定闹钟这个行为,需要两个关键信息,一个是行为,一个是时间。
这两个信息可以理解为“设闹钟”行为的前置条件,就好像事有个槽空缺在那,需要先补充完整了这个槽,完成这个条件后,触发新的副本,才能继续后续的行为。
继续回来“和奶奶对话”的例子中,即使是在开放域对话过程中,用户和你聊天的内容,有一些是之后用的上的,例如对话中machine回复的“是的,奶奶”
这个“奶奶”也是一个槽,是用户称呼的槽,只不过这个槽在之前的对话中已经填过了,然后machine就一直使用。
总之,记住在没明确意图前的聊天可以看做是开放域的对话,开放域对话中也能填槽。
2)准入条件
紧接着,奶奶说天气很好,想出去走走,“帮我叫个车!”
然后话风一改,machine不再瞎聊了,直接问了一句“奶奶打算几点出发?”
machine问奶奶出发时间的时候,实际已经是转入了一个封闭域对话(具体概念下面再解释)了,从开放域转入到封闭域,中间隔着的就是准入条件了。
介绍本文的第三个概念——准入条件
从一个开放域转入到封闭域,或者从一个封闭域转入到另一个封闭域,中间的跳转是需要逻辑判断的,而这个逻辑判断就是准入条件。
当满足了准入条件后即可进入到对应的封闭域对话中,如果把封闭域对话理解为一个大门的话,那么准入条件就是钥匙啦,通过这个钥匙进入到封闭域内。
准入条件的构成由条件组和条件构成
准入条件通过条件组和条件形成了一套与或非
- 条件组和条件组是或关系
- 条件组内的条件是与的关系
- 条件本身可以是非的关系
所以,machine通过识别出有一个条件组是“用户叫车”的条件组,所以进入了用户叫车的封闭域对话中。
3)封闭域多轮对话
因为满足了准入条件,所以machine进入了叫车的封闭域对话
本文第四个概念——封闭域对话
封闭域对话是指识别用户意图后,为了明确用户目的(或者称为明确任务细节)而进行的对话
封闭域对话有很明显的两个特征
1. 输入和输出是可枚举的
例如和奶奶对话这个case中
打车必须的必填的input有3个(这3个也是槽位,需要填槽),output是两个结果,成功或失败
2. 对话有明确的目的,且有流程
在和奶奶的对话过程中,由于必填的槽有三个
其中出发时间并不知道,所以machine接着问了“奶奶打算几点出发?”
这个过程称之为澄清话术
当用户的需求中缺乏一些必要条件时,需要对话系统主动发问,把必要条件全部集齐之后再去做最终的满足执行。
这里的必要条件就是时间槽还没有填充,后续的选择快车还是顺风车也是一种澄清。
如果把打车简化为三个槽的话,那么填槽过程如下
大家会发现,machine并没有问奶奶从哪里出发地点,因为可能在历史的对话中已经获取到了奶奶的住址,或者通过GPS定位,也能获取到出发点,这时候就没有必要再问奶奶了。
最终响应结果,machine跑去滴滴下单,成功后回来告诉奶奶“好的,已为您预约了宝安中心到深圳湾公园9点的滴滴顺风车。”
以上就是整个对话系统的流程
1. 开放域多轮对话,瞎聊,识别用户意图
2. 准入条件,根据设定好的准入条件,进入封闭域对话
3. 封闭域对话,填槽,必填槽不完整就要澄清让用户填完整,最终执行
二、细讲填槽
通过上述的例子,明白了对话过程,接着细讲下填槽这件事情。
1)槽
1. 定义
上文中我们提到了填槽指为了让用户意图转化为用户明确的指令而补全信息的过程
填槽的专业表述:从大规模的语料库中抽取给定实体(query)的被明确定义的属性(slot types)的值(slot fillers)——网络文章定义
所以这里槽可以理解为
实体已明确定义的属性
例如打车中的,出发地点槽,目的地槽,出发时间槽中的属性分别是“出发地点”、“目的地”和“出发时间”
2. 槽与槽位
槽是由槽位构成的,举个例子
出发地点槽,是打车必填的,要填充这个槽,可以通过历史对话取得值,也可以通过询问用户取得值,还可以通过GPS定位取得值等等。
这里的必填是槽的属性,而不同的取值方式是不同槽位的属性
先来讲讲槽的属性
3. 槽的属性:可默认填写/不可默认填写
有些槽是不可默认填写的,不填没办法继续下去,有些即使不填,有默认值也可。
例如machine在刚开始和你对话的时候,称呼你为“主人”,但你觉得不够逼格,于是你让他叫你“女王大人”。
这里的用户昵称槽就是用户没有指定,可默认填写的
4. 槽的属性: 澄清话术
当槽不可默认填写同时又没有填写的时候,就要进行澄清
为了澄清而表达的内容,就是澄清话术
不同槽的澄清话术不同,例如打车三槽中,目的地的澄清话术可能是“请告诉我您的目的地”,而出发时间的槽可能是“请告诉我您的出发时间”
5. 槽的属性:澄清顺序
当有多个槽需要澄清的时候,就存在先后顺序的问题,所以需要一个澄清顺序,先问什么,再问什么。
6. 槽的属性:平级槽或依赖槽
根据槽和槽之间是否独立,后续的槽是否依赖前面槽的结果。
可以将槽之间的关系分为
- 平级槽,槽与槽之间没有依赖,例如打车中的三槽
- 依赖槽,后续的槽是否依赖前面槽的结果,例如手机号码槽,不同国家手机号码格式不同(槽的属性不同),所以国家槽会影响选择哪个手机号码槽。
7. 槽的能力:多轮记忆状态
槽还有记忆的能力,先再看个例子
这里Julian先要预约打车,进入封闭域A,machine进行打车填槽
槽内已经填充了2个信息。
出发地:西丽
目的地:空(缺乏)
时间:明天上午9点30分
machine进行澄清,要求填槽目的地。
但是这时候突然Julian要求设定提醒事件,machine响应设定提醒事件。
Julian再继续回到原有的打车事件中,仅说了目的地,machine没有再次询问出发地和时间,直接完成打车填槽。
这里所使用的就是多轮记忆状态,它能在对话的过程中,在被打断回到之前的封闭域对话后,能记住原有填槽的内容,减少重复填槽。
2)槽位
上面我们提到槽是由槽位构成的,一个槽位就是一种填槽的方式
1. 槽位的属性:接口槽与词槽
- 词槽,通过用户对话的关键词获取信息的填槽方式
- 接口槽,通过其他方式获取信息的填槽方式
2. 槽位的属性:槽位优先级
当有多个槽位的时候,槽该采用那个信息,这时候有个优先级。
还是之前的出发地点槽,如果用户通过词槽指定了出发地点是A,优先级就应该是最高的,其次才是通过不同的接口槽获取的B,C等
PS:本文可能存在概念错误,或逻辑错误,欢迎斧正,我也还在学习:)