任务型chatbot的基本流程
-
NLU
识别Intent和Entity,不同的intent可以设计不同的slot,讲 Entity填充到slot中 -
DST
(对话状态跟踪)负责监视对话的状态,同时进行多轮对话来填充完整slot,也起到了上下文对话的影响。DST包含不同的方法包括有限状态机, 也可以使用增强学习和强化学习的方法做DST。 -
DPL
在后端定义出很多的规则,利用当前的intent和slot进行相应的操作(比如订机票操作),当当前状态的slot被填充满会出发DPL调用相应的API,为了可靠性,在正式调用在之前会向用户确认。 -
NLG
部分使用规则定义的模板进行相应的回复 -
TTS
进行语音合成(使用)
NLU
-
意图识别
这是一个分类的问题,可以使用规则的任务,也可以使用深度学习的方法。 -
实体识别
识别出intent之后进行实体的识别,填充slot。(但是RASA可以intent和entity同时进行…),使用biLSTM-CRF进行。也可以使用RASA开源模工具进行NLU的操作。
DST
用一个slot表示当前状态, 根据当前的intent1进行填充。但是可能我们在填充当前slot的过程中还没有填充完毕,就进入下一个intent2,所以我们需要记录存储在内存的当中没有释放的出来的intent1。
DPL
根据当前的状态进行相应的动作
f: 分类, 基于状态,RL
基于状态的转移可以使用FSM
工具,它可以根据当前的状态对应的位置输出一个action
比如对于的询问订机票的问题,我们可以这么设计状态转移:
假设slot为【time:[],locations:[]】
那么我们就有4个状态——S=(0,0),S = (0,1), S=(1,0), S=(1,1)
回复的时候采用template
action | text template |
---|---|
ask | “请问……” |
ask time | “please ……” |
ask locationi | “please ……” |
但是这样会套路一样,失去个性化,所以又可以对于同一个actio定义多个template ,回复的 时候随机使用一个template。
-
但是使用这个FSM会遇到这样的问题
-
- 当一直没有得到想好的回答的时候会一直ask again。所以我们要定义其他的规则,一直问就进入一个Exception阶段进行特殊的处理。
-
- 对于2个槽就有始终状态,通常我们需要的槽位是很少的。但是当存在多个槽,我们的状态就会指数级增长,这个问题就怎么解决呢↓↓↓
刚才我们是使用节点对应状态,边对应action,现在我们用边对应状态,用节点对应action。 像下面: