腾讯课堂、企鹅辅导、ABCmouse吸引了多种多样的用户,其中不止有熟悉互联网的95后、00后,也有很多70后、60后的学员、家长和老师。每天有大量的客服咨询的需求。为了保证给用户更及时的回复,更快的解决用户的问题,在线教育部引入了智能对话客服的技术。
一、对话中台产生的背景
1.1 产品需求
在线教育产品面对学员的大量重复性问题,为了减轻人工客服的压力,并且给学员及时的回复,解决学员的问题,需要引入智能客服。
1.2 常见在线智能客服功能
问答系统
面向任务
闲聊
问答系统:基本为"一问一答"的交互模式,因此构建问答系统时一般不会涉及对话管理相关的技术。在自然语言理解层面,问答系统偏重于问句分析,旨在获取问句的主题词、问题词、中心动词等。目前,问句分析主要采用模板匹配和语义解析两种。
面向任务:其目的是解决用户的明确需求。面向任务的对话系统通过对话管理跟踪当前的对话状态,进而明确用户的目的和需求,因此对话管理是面向任务的对话系统的一个技术侧重点。面向任务的对话系统中的自然语言理解技术聚焦于将用户输入的自然语言映射为用户的意图和相应的槽位值。
闲聊:针对用户没有特定目的、没有具体需求情况下的多轮人机对话,构造过程需要同时注意对话管理和自然语言理解两个模块的构建。
二、对话中台的架构
对话中台 由以下部分组成:
在线流程NLU后台
在线流程对话逻辑
管理后台
离线训练
在线流程NLU后台 包含 FAQ问答匹配 和 意图分类 两部分。
FAQ问题匹配是根据用户的Query问题从预先配置的语料库中选择与Query相似度最高的语料,并返回语料答案。FAQ问题匹配采用了百度开源的AnyQ,进行用户Query与语料库问题匹配。
意图分类是将用户的Query进行意图识别,并将意图分类到预先训练的类别中的某一类。获取用户的Query意图,并根据意图类别返回相应的回答。意图分类使用了开源Rasa Nlu, 进行意图分类的训练,并将用户Query分类到某一类意图。
在线流程对话逻辑包含人工流程的处理,以及问题回答的补充等。
管理后台包含语料库的增删改,意图的增删改,词典的增删改以及线上用户对话数据的分析查看。
离线训练则是FAQ问题匹配和意图算法的离线训练。
三、对话中台NLU层的处理流程
3.1 FAQ问答处理流程
FAQ语料库的格式如下:
问题 | 回答 |
---|---|
已申请加群 | 申请后等待老师通过,即可进群哦 |
申请加群了,怎么进不去了? | 申请后等待老师通过,即可进群哦 |
咨询群从哪加 | 可以先加群管理员好友,然后让管理员老师拉你进群哈 |
用户Query问题处理流程如下:
用户Query问题
怎么才能进去QQ群啊
(1)Query分词
怎么 才能 进去 QQ群 啊
(2)停用词去除
怎么 才能 进去 QQ群
(3)Solr搜索引擎召回的候选问题
怎么登录不进去
QQ怎么进去呀
QQ群怎么加不了?
要密码才能进
QQ群吗
QQ群进不去
我要通过邀请才能进群
我进不去QQ群
进去了
加不进去
(4)候选问题与Query问题的相似度计算
候选问题 | SimNet相似度 | Jaccard相似度 | Cosine相似度 |
---|---|---|---|
怎么登录不进去 | 0.664544 | 0.363636 | 0.500000 |
QQ怎么进去呀 | 0.736764 | 0.555556 | 0.500000 |
QQ群怎么加不了? | 0.838040 | 0.333333 | 0.408248 |
要密码才能进 | 0.809723 | 0.272727 | 0.250000 |
QQ群吗 | 0.840319 | 0.222222 | 0.353553 |
QQ群进不去 | 0.836673 | 0.444444 | 0.250000 |
我要通过邀请才能进群 | 0.815510 | 0.285714 | 0.204124 |
我进不去QQ群 | 0.816130 | 0.400000 | 0.223607 |
进去了 | 0.812667 | 0.222222 | 0.353553 |
加不进去 | 0.795519 | 0.200000 | 0.288675 |
(5) 候选问题相似度综合排序
综合排序后TOP1候选问题 :QQ群怎么加不了?
匹配度分值:0.744590
(6)返回候选问题及候选问题答案
Q:QQ群怎么加不了?
A:可以先加群管理员好友,然后让管理员老师拉你进群哈
3.2 意图分类处理流程
目前由于 意图分类 的槽位提取和分类准确率不高, 意图分类 的处理流程放在 FAQ问答处理 之后。
3.2.1 意图训练过程
(1)意图训练数据准备
Rasa提供了数据标注平台: rasa-nlu-trainer
标注好的语料存储在json文件中,具体格式如下所示,包含text, intent,entities,实体中start和end是实体对应在text中的起止index。
{
"text": "可以回听吗?",
"intent": "how_to_class",
"entities": []
},
{
"text": "我想学播音主持类的课程,有推荐的吗",
"intent": "findCourse",
"entities": [
{
"start": 3,
"end": 8,
"value": "播音主持类",
"entity": "coursename"
}
]
}
(2) 意图训练pipeline设置
Rasa Nlu 支持不同的 Pipeline,其后端实现可支持spaCy、MITIE、MITIE + sklearn 以及 tensorflow,实验使用的是 MITIE+Jieba+sklearn
。
language: "zh"
pipeline:
- name: "nlp_mitie"
model: "data/total_word_feature_extractor_zh.dat"// 加载 mitie 模型
- name: "tokenizer_jieba"// 使用 jieba 进行分词
- name: "ner_mitie"// mitie 的命名实体识别
- name: "ner_synonyms"
- name: "intent_entity_featurizer_regex"
- name: "intent_featurizer_mitie"// 特征提取
- name: "intent_classifier_sklearn"// sklearn 的意图分类模型
3.2.2 意图识别过程
用户Query问题 :
我想要学Java的课程,能不能推荐吗
(1)分词
我 想要 学 Java 的 课程 ,能 不能 推荐 吗
(2)命名实体提取
实体名:coursename 实体值:Java
(3)特征获取
获取分词后的词语特征向量
(4)意图分类
计算用户Query对于每种意图分类的概率
意图 | 置信度 |
---|---|
findCourse | 0.5013075344320349 |
howtoclass | 0.10829378601540043 |
howtostudy | 0.09924787448352104 |
refund_money | 0.09164237851722101 |
send_goods | 0.0847599257229149 |
cannotgetin_qun | 0.08022905731343917 |
order_number | 0.01787893377632859 |
download_resource | 0.016640509739140313 |
(5)输出意图分类结果和实体
意图:findCourse
实体 :
实体名称:coursename 实体值:Java
四、NLU后台技术
4.1 NLU相关知识
4.1.1 自然语言理解模块的功能
实体识别
用户意图识别
用户情感识别
指代消解
省略恢复
回复确认
拒识判断
实体识别:又称命名实体识别,指识别自然语言中具有特定意义的实体,如人名、时间、地名及各种专有名词。
用户意图识别:需要识别的用户意图包括显式意图和隐式意图。
指代消解和省略恢复:聊天主题背景一致的情况下,人们在对话过程中通常会习惯性地使用代词指代已经出现过的某个实体或事件,或者为了方便表述省略句子部分成分的情况。自然语言理解模块需要明确代词指代的成分及句子中省略的成分。
回复确认:当用户意图、聊天信息等带有一定的模糊性,需要智能对话客服主动向用户询问,确认用户的意图。
拒识判断:智能对话客服系统应当具备一定的拒识能力,主动拒绝识别及回复超出自身理解/回复范围或者涉及敏感话题的用户输入。
4.1.2 自然语言理解基本技术
词法分析
句法分析
语义分析
分词:汉语分词主要采用的有基于词表匹配的方法和基于统计模型的方法。
词性标注:主要分为基于规则的方法和基于统计模型的方法。
句法分析:对输入的句子进行分析得到句子句法结构。
语义分析:运用各种机器学习方法,让机器学习与理解一段文本所表示的语义内容。
4.1.3 自然语言表示
1.词袋模型(BOW)
词袋模型基于文本中的每个词的出现都不依赖与其他词是否出现的假设,忽略文本的词序、词法和句法,而将文档看作词组成的集合。
2.TFIDF
TFIDF(词频-逆文档频率)是一种基于统计的加权方法,用具体词汇在文档中出现的次数和该词汇在语料库中出现的次数两个值评估该词汇对相关文档的重要程度。
3.各种深度学习的自然语言表示,如word2vec, bert 等
4.2 对话平台的FAQ问答处理算法
FAQ 匹配算法使用的是百度开源AnyQ。
AnyQ的处理流程包含以下几步:
用户问题分析
分词
检索召回
开源倒排索引solr , 添加了百度开源分词
计算匹配相似度
-
字面匹配相似度:
cosine 相似度
Jaccard相似度
BM25
语义匹配相似度:
SimNet语义匹配
实验过程中,在分词之后添加了停用词去除,减少用户Query中无效信息的干扰,提高问题匹配的准确度。
语义匹配相似度Simnet 原理
(1)输入层
该层通过 look up table 将文本词序列转换为 word embedding 序列。
(2)表示层
该层主要功能是由词到句的表示构建,或者说将序列的孤立的词语的 embedding 表示,转换为具有全局信息的一个或多个低维稠密的语义向量。
(3)匹配层
该层利用文本的表示向量进行交互计算。
4.3 对话平台的意图识别算法
意图分类部分使用的是Rasa Nlu算法。
Rasa NLU 是一个基于 pipeline 的通用框架。这样可以获得最大的灵活性。
pipeline 定义了各个组件之间数据的前后流动关系,组件之间是存在依赖关系的,任意一个组件的依赖需求没有被满足都将导致 pipeline 出错(Rasa NLU 会在启动的时候检查是否每一个组件的依赖都被满足,如果没有满足,则终止运行并给出相关的提示消息)。具有以下特征:
组件之间的顺序关系至关重要,比如 NER 组件需要前面的组件提供分词结果才能正常工作,那么前面的组件中有必须有一个分词器。
组件是可以相互替换的,比如同样是提供分词结果,同时有几个 component 可以选择,比如中文的可以选择清华的分词器、北大的分词器的。
有些组件是互斥的,比如:分词器是互斥的,分词结果不能同时由两个组件提供,否则会出现混乱。
有些组件是可以同时使用的,比如:提取文本特征的组件可以同时使用基于规则的和基于文本嵌入向量的。
一个 NLU 应用通常包括命名实体识别 和意图识别两个任务。为了完成这些任务,一个 典型 的 Rasa NLU pipeline 通常具有以下的流程:
初始化类组件:为了加载模型文件,为后续的组件提供框架支持
分词组件:将文本分割成词语序列,为后续的高级 NLP 任务提供基础数据
提取特征:提取词语序列的文本特征,通常采用 Word Embedding 的方式,提取特征的组件可以同时使用,同时搭配的还可能有基于正则表达式的提取特征的方法。
NER 组件:根据前面提供的特征对文本进行命名实体的识别
意图分类:按照语义对文本进行意图的分类,也称意图识别
五、业内实现方案
5.1 架构层面
从阿里小蜜和微软小冰的架构图里面可以看到,除了服务的接入层外,他们都会包含两层。一个是算法技术层,另一个是后端数据层。
算法技术层:都包含对话管理,闲聊,任务型,问答,推荐预测功能。
数据层:都包含知识图谱,问答数据库,小冰还包含人设数据维护,小蜜则包含线上数据回流和分析,以不断提高小蜜智能客服的准确度。
5.2 算法层面
目前我们对话平台主要是解决用户的FAQ问答问题,因此算法层面的优化先聚焦于FAQ问答匹配的提高,主要分为以下几方面:
Query预处理
问题改写
分词
句法分析
拼写纠错
实体识别
指代消解
省略消解
匹配算法(问题重排序)
LTD-BERT
LTD-BERT 是 PCG 智能应用组在 Google 发布的 BERT 模型上,使用LSTM等网络对BERT模型效果进行拟合,将算法计算效率进行了优化。
融合排序算法
RF
GBDT
LTR
DNN