2019-06-17问答系统项目落地调研

2019-06-17问答系统项目落地调研

1 chatbot概述

1.1 行业分类及目前的应用状况

智能人机交互通过拟人化的交互体验逐步在智能客服、任务助理、智能家居、智能硬件、互动聊天等领域发挥巨大的作用和价值。因此,各大公司都将智能聊天机器人作为未来的入口级别的应用在对待。

包括Google、Facebook、Microsoft、Amazon、Apple等互联公司相继推出了自己的智能私人助理和机器人平台。

1.2 问答实现方式

目前的chatbot实现方案主要有两种,检索匹配模型和生成模型。

  • 端到端生成模型:不需要预设问题库和知识库,是通过大量的语料数据训练,以学习语言元素的组成和表达方式,再分析组合生成回答。类似于我们学习说话的方式,自然地根据对方的话,生成回答。
  • 检索匹配模型需要有一个问题库和对应的回答知识库及回答模板。在用户发出信息后,分析用户表达的内容,通过一定的匹配规则,匹配到和问题库最相近的问题,再给出相应的回答。匹配的过程中通过自然语言处理、机器学习等技术优化匹配方式,尽量给到合理的回答。检索匹配模型有两种主要实现方式:
    1. FAQ式 文本相似度计算:比如10086的在线智能客服,用户提问“如何查询话费”,那系统可以自动给出一个对应的知识“请您向10086号码发送‘HF’短信,即可查询当前话费”,而不再需要耗费高成本的人力来做解答。一般存储 问-答文本对数据。
    2. 任务式:规则模版-词槽匹配:“我想订一张明天从杭州到北京的机票” -> 进一步填充 出发地-目的地-时间。一般存储为图结构。

1.3 两种问答模式的优劣:

  • 生成模型的对话更灵活,更像人,但是依赖的语料数据的训练、生成的语言结构等不是特别完善,容易出现语言结构混乱语无伦次看不懂的问题;
  • 检索匹配式,需要更多的精力去维护问答知识库,同时也会存在意图识别不准,问东答西的情况,但由于实现逻辑相较而言容易实现,且问答是可控的,不会出现语言结构错乱的问题。

根据各自的优势,生成模型内容涉及可以很泛很广,更适用于闲聊娱乐等模式;检索匹配模型,更适用于垂直领域信息的集合和知识的汇总,在一定的领域内,建立庞大的知识体系,完成特定的业务

2 框架分析

本文将调研的chatbot系统分为三个层次:平台型;解析型;单一型。

  • 平台型:大公司成熟的chatbot集成平台,可以处理任务式闲聊式。用户只需要简单配置即可生成自己的chatbot,这也是我们未来成果的愿景。 但并没有暴露代码,目前能直接供我们学习内容的很少。(eg:Wit.ai 、DialogFlow、UNIT)
  • 解析型:成熟的平台,没有代码使用,但提供了论文详细解析自己的系统,便于我们学习形成自己的架构。(eg:阿里小蜜)
  • 单一型:暴露出代码(框架),可以用来生成我们框架中的某一种模块。(rasa、chatterbot、anyq)

2.1 平台型

大公司成熟的chatbot集成平台,往往再用交互式、傻瓜式配置。用户只需要简单自定义即可生成自己的chatbot,这也是我们未来成果的愿景。

但并没有暴露代码,目前能直接供我们学习内容的很少。

2.1.1 Wit.ai

Wit.ai 是 Facebook 推出的用于将自然语言转化为可处理指令的 API 平台,其目的是为了帮助开发者便捷的打造类 Siri 语音对话应用或设备。

  • Step 1 注册 Wit.ai 账号
  • Step 2 简单设定机器人名字描述等信息
  • Step 3 创建对话情景(story):

image

整个介面就像是一个对话视窗,左边是 User says,右边是 Bot sends, Box executes 与 Jump。

  1. User says: 顾名思义就是定义 User 会说的话,并且你可以设定 User 的句子中,有哪些关键字是你需要的、哪些文字是代表什麽含意,在 Wit.ai 的世界中,这样的东西叫做 Entity,后面会再度说明。
  2. Bot sends: 就是机器人要回覆的句子,这边可以带入一些参数,像是 user 所提及的一些关键字,或是机器人向外呼叫 API 所得到的结果。
  3. Box executes: 就是让你定义机器人要执行的 function,真正的实作不会在这边,这边只是定义名称,以及要接收的 context 与 吐回的变数名称。
  4. Jump: 则是让你能够在满足设定
  • Step 4 定义使用者语句

下来我们先定义 User 可能会对我们的机器人说的话,像是使用者可能会跟机器人打招呼,我们就可以在对话框的 User says 输入 Hello,并且 highlight 起来以后设定 Entity,Enity 在 Wit.ai 裡面,就是用来让系统判断使用者输入句子时,哪些关键字是要抽取出来做处理的,你可以依照该关键字的特型来设定相对应的 Entity 类别。
这边我们就自定义一个 Entity 名称叫做 greeting。

用户表达同一意图的说法可能是无限的。
可以在Understanding这个地方你有三种方式可以用来训练你的机器人:

  1. 定义更多keywords: 要完全符合你预先设定的关键字才会触发。

  2. free-text: 如果你想要撷取使用者句子中的某段文字,而该段文字并不是特定的关键字时,就要设定 free-text,

  3. trait: 如果你想设定的 意图 不是靠句子中几个关键字能够辨别,而是需要整个句子来判定的话,就要设定成 trait。

  • Step 5 定义机器人回覆语句

当机器人收到 greeting 的 Entity 后,可以让用相同的 entity value 回覆,并加上简单的介绍。
点选下方的 Bot sends,对话框就会出现机器人的部分,你可以在裡面输入机器人的回覆语句,想要的变数可以用{ }包起来,这边我们直接使用 greeting 这个 entity,这样就能用同样的 Entity 去回覆。

  • 多轮问答:

如果我们的机器人需要做一个包含两个问题的调查,根据第一个问题答案的不同,机器人会额外询问一个附加问题。这样的例子,就叫做基于流的对话。

我们利用 bookmark 进行处理:当第一个 intent 为 no 时,我们使用 Jump 跳转到 question-2 的 bookmark,直接开始第二个问题的询问;当第二个 intent 为 no 时,我们同样利用 Jump 跳转到 end 的 bookmark,结束询问。补全了整个对话过程。

image

参考:http://www.woshipm.com/pd/829819.html

参考:https://blog.techbridge.cc/2016/07/02/ChatBot-with-Wit/

2.1.2 谷歌Dialogflow

DialogFlow 是Google 提供的自然语言处理服务, 能够将文字转换成电脑看得懂的结构性资料, 再传递给后端介接的Web Service处理。

  • 建立一个的意图

将相关的对话都映射到这个意图上

image

DialogFlow 背后的NLP引擎, 会将我们刚刚定义的相关语句训练出一个模型, 当未来有类似的句子时, 就会分析出FindHotel的意图出来

  • 建立action

透过这个action, 当使用者没有特别表明目的地的时候呢, action就会被执行起来反问使用者 where are you looking for

2.1.3 科大讯飞AIUI平台

AIUI 是科大讯飞2015年推出的一套以语音为核心的人机交互解决方案,意在使应用和设备能够快速具备能听会说,能理解会思考的能力。

接入了 AIUI 的应用和设备 可以轻松实现查询天气、播放音视频资源、设置闹钟以及控制智能家居等能力。

成功案例:海底捞智能客服:
海底捞接入科大讯飞AIUI技术,用户可以通过电话与人工智能直接交互,高效准确的完成订餐预约,甚至点餐服务,上线后平均每家门店减少1位人工客服,节省成本1000万元/年,截止18年初已上线全国150家门店,AI客服服务占比高达85%,极大的节省了人力成本。

AIUI开放平台结构

在AIUI开放平台上,可以看做由“应用+技能”两部分组成,其中“技能”除了自己创建的外,还有一个“技能商店”,可以选中他人已经制作好的技能,添加到自己的应用中。

所以 ,应用可以理解为技能的一个壳,应用装上了不同的技能,就能实现不同的能力

技能是AIUI开放平台的核心,这里先简单带下,下面细讲

技能能实现不同的功能,实际是识别出了用户不同的意图,然后根据不同的意图做出不同的反应。

AIUI开放平台优点

  • 优点1:模块化逻辑清晰
  • 优点2:针对狭隘的封闭域对话,可快速搭建

  • 缺点1: 模糊匹配,而非真“学习”,效果不佳

  • 缺点2:人力成本高

参考1:https://www.jianshu.com/p/3e9f5a223cbc

参考2:https://www.jianshu.com/p/b548671e0541?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

参考3:https://doc.iflyos.cn/studio/guide/create.html#%E5%88%9B%E5%BB%BA%E6%8A%80%E8%83%BD-2

2.1.4 百度UNIT平台

要在百度的UNIT创建一个可用的chatbot,主要有6大步骤

  1. 创建场景:根据业务需要创建场景,一个场景即一个可对外输出使用的功能例如“控制电视场景”、“办理信用卡场景”等
  2. 创建技能:技能是功能的最小单位,用于识别用户意图。例如“控制电视”的场景中,技能(或意图)可以是“切换频道”,“调整音量”,“开关机”

    • 添加词槽的过程:
  3. 准备训练数据:技能创建好之后,只是一个空壳还是“控制电视”的场景,我们只是脑中想好了一个功能是“切换频道”,但是需要准备好数据,让machine去学习,什么是“切换频道”

  4. 训练技能:当技能空壳创建好后,数据也准备好了,扔进去一锅乱炖即可,训练技能
  5. 验证技能:当machine训练好后,我们要看下machine学的好不好,需要考考他,互动下例如发出“切换CCTV5”,结果执行了“关机”,你就一脸懵逼了,这时候就要再调整,再训练……

    • 验证技能有“体验模式”和“学习模式”两种
    • 体验模式就是和chatbot瞎聊,对话内容不会加入到“对话样本集”中的“默认集”
    • 学习模式,即与chatbot对话内容会加入到“对话样本集”中的“默认集
  6. 发布场景:训练好技能,就可以发布上线了。可以通过百度云调用,也可以使用DuerOS使用。

优点:

  1. “真·Machine Learning”:使用对话样本集训练数据,真正的使用NN去train,最终表现结果不错.
  2. 支持多轮对话,操作简单:通过响应条件与或非的设定,再加上词槽的澄清,使得创建一个多轮对话变得很简单。
  3. 支持企业自研模式:

参考:https://www.jianshu.com/p/a1111e2a00c2

参考:https://www.jianshu.com/p/c5be75ef9420?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

2.2 解析型

2.2.1 阿里小蜜

https://www.alixiaomi.com/

2015年7月,阿里推出了自己的智能私人助理-阿里小蜜,一个围绕着电子商务领域中的服务、导购以及任务助理为核心的智能人机交互产品。

在去年的双十一期间,阿里小蜜整体智能服务量达到643万,智能服务在整个服务量(总服务量=智能服务量+在线人工服务量+电话服务量)占比达到95%,成为了双十一期间服务的绝对主力。

2018年初, 阿里公开展示了自己的智能助手小蜜的设计结构。《AliMe Assist: An Intelligent Assistant for Creating an Innovative E-commerce Experience》 作为类似客服助手的大型对话问答系统, 小蜜整合了任务型模块与开放聊天模块, 并围绕自身的应用场景, 构建了的工业级智能对话系统.

意图识别:识别语言的真实意图,将意图进行分类并进行意图属性抽取。意图决定了后续的领域识别流程,在阿里小蜜的对话体系中我们按照业务场景进行了3种典型问题类型的划分,并且依据3种类型会采用不同的匹配流程和方法:

  • 问答型:例如“密码忘记怎么办?”→ 采用基于知识图谱构建+检索模型匹配方式
  • 任务型:例如“我想订一张明天从杭州到北京的机票”→ 意图决策+slots filling的匹配方式
  • 语聊型:例如“我心情不好”→ 检索模型与Deep Learning相结合的方式

通过一系列判别策略串联.分配到哪个服务中.

下面分别介绍,三种模式:

2.2.1.1 任务型:意图决策+slot filling的匹配方式

任务型属于 助手服务(assistance service) 该模块用于处理”用户目标明确, 属性固定“的任务。

此类任务一般只需要用户确定类型的信息, 如”订飞机票”只要用户给出<出发地, 目的地, 时间>此类属性.

对用户输入的处理也只需要识别出用户需求所含的属性, 并让用户补充属性的值填充即可.

针对应用场景, 小蜜团队设计了基于字典(dictionaries)和样式(patterns)的填槽模块(slot-filling engine), 可以识别出15种不同的属性.

技术:意图决策+slot filling

流程:

  • 首先按照任务领域进行本体知识的构建,例如机票的领域本体知识场景如下:

  • 在问答匹配过程中结合上下文模型和领域数据模型不断在Query中进行slot属性的提取,并循环进行本体意图树的不断填充和修改,直到必选意图树填充完整后进行输出

image

2.2.1.2 问答型:基于知识图谱构建+检索模型匹配方式

用户服务(customer service) 如果用户需要的是寻找某种信息或某种解决办法, 比如”忘记登陆密码怎么办”. 此类需求的核心是知识图谱技术, 通过抽取实体, 关系查询等技术找到需求对应的答案.

  1. 提问预处理:分词、指代消解、纠错等基本文本处理流程;
  2. 检索召回:通过检索的方式在候选数据中召回可能的匹配候选数据;
  3. 计算:通过Query结合上下文模型与候选数据进行计算,采用文本之间的距离计算方式(余弦相似度、编辑距离)以及分类模型相结合的方式进行计算;
  4. 最终根据返回的候选集打分阈值进行最终的产品流程设计

image

2.2.1.3 语聊型:检索模型与Deep Learning结合

以上两个模块能覆盖绝大多数的用户请求(95%), 但出现特殊情况, 比如知识图谱中不含盖的实体时, 系统就需要调用聊天服务处理了.

智能聊天的特点:非面向目标,语义意图不明确,通常期待的是语义相关性和渐进性,对准确率要求相对较低。

面向open domain的聊天机器人目前无论在学术界还是在工业界都是一大难题,通常在目前这个阶段我们有两种方式来做对话设计:

一种是学术界非常火爆的Deep Learning生成模型方式,通过Encoder-Decoder模型通过LSTM的方式进行Sequence to Sequence生成。另外一种方式就是通过传统的检索模型的方式来构建语聊的问答匹配。

  • 生成式模型

优点:通过深层语义方式进行答案生成,答案不受语料库规模限制

缺点:模型的可解释性不强,且难以保证一致性和合理性回答

  • 检索模型

优点:答案在预设的语料库中,可控,匹配模型相对简单,可解释性强

缺点:在一定程度上缺乏一些语义性,且有固定语料库的局限性

因此在阿里小蜜的聊天引擎中,我们结合了两者各自的优势,将两个模型进行了融合形成了阿里小蜜聊天引擎的核心。

流程:

  • 先通过传统的检索模型检索出候选集数据
  • 然后通过Seq2Seq Model对候选集进行Rerank,重排序后超过制定的阈值就进行输出,不到阈值就通过Seq2Seq Model进行答案生成

image

2.2.1.4 小蜜的整体流程

  1. 首先, 用户输入q(text/voice)被传给规则解析模块(business rule parser), 规则解析模块是由大量的样式(patterns)组成的前缀树匹配结构(trie-based), 用于判断q是否能被助手服务处理. 如果能匹配出确定的样式, 则传给填槽模块处理。输出答案。
  2. 如果规则解析模块没有检查到样式, 则进入意图分类模块(intention classifier), 该模块由FastText+单层CNN这种相对简单的深度网络模型构成。 这里判断用户是否需要直接连接人工服务(service staff), 若不需要则进入下面的用户服务判别处理流程.
  3. 这部分先由语义解析模块处理, 由语义匹配寻找知识图谱(KG)中的实体(entity), 由KG中的实体关系寻找用户问题q对应的回答(answer)并返回; 假如没找到回答, 可以检查该问题q之前的上下文信息(context), 与q合并后再传给语义解析模块循环执行;
  4. 如果匹配不到KG实体, 就将q传给聊天服务中的检索模块, 检索到匹配度高于threshold的回复就返回, 否则就接人工服务. 此外, 如果语义解析模块找不到语义标签, 就直接转到聊天服务部分.

这个图非常重要,也是区别于阿里与其他妖艳贱货的地方,公开了详细的整体问答架构流程,而不是对一个小细节繁复讲解。 可供我们学习的地方很多。

参考:https://zhuanlan.zhihu.com/p/46457853

2.3 单一型(本文重点)

调研了一些暴露出代码的开源框架(基于python),可以用来生成我们框架中的某一种模块。

2.3.1 ChatterBot ❤❤❤

8K+ star: https://github.com/gunthercox/ChatterBot

ChatterBot是一个Python库,使用一系列机器学习算法来生成不同类型的回答。 (主要是 匹配式

1
pip install chatterbot

程序通过搜索与输入匹配的最接近的匹配已知语句来选择最接近的匹配响应,然后从选择对该语句的已知响应中选择响应。

image

每个部分都设计了不同的“适配器”(Adapter)。

  • 机器人应答逻辑 => Logic Adapters
  • Closest Match Adapter 字符串模糊匹配(编辑距离)

  • Closest Meaning Adapter 借助nltk的WordNet,近义词评估

  • Time Logic Adapter 处理涉及时间的提问
  • Mathematical Evaluation Adapter 涉及数学运算

可以同时使用多个逻辑适配器来处理,机器人将返回最高计算置信度值的回应;如果多个适配器返回相同的置信度,那么选择适配器列表中第一个适配器。 同样,也可以定义自己的逻辑适配器,通过继承LogicAdapter基类,重写相关方法返回指定的值就可以实现。

经过实验,这个框架主要对问题文本 使用相似度匹配,找出库中预定好的答案。 比较适合,知识问答类的情形。

参考:https://kantai235.github.io/2017/03/16/ChatterBotTeaching/

参考:https://cloud.tencent.com/developer/article/1337627

参考:自定义适配器:https://zhuanlan.zhihu.com/p/35066208

2.3.2 rasa ❤❤❤

使用rasa_nlu 理解用户的意图(预定义好) ,纯任务型对话。

  • 意图识别
  • 实体识别

参考:https://www.jianshu.com/p/7f8ca4ac16e7

使用rasa_core 根据模版回答问题:(可以填槽)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class ActionSearchConsume(Action):
def name(self):
return 'action_search_consume'

def run(self, dispatcher, tracker, domain):
item = tracker.get_slot("item")
item = extract_item(item)
if item is None:
dispatcher.utter_message("您好,我现在只会查话费和流量")
dispatcher.utter_message("你可以这样问我:“帮我查话费”")
return []

time = tracker.get_slot("time")
if time is None:
dispatcher.utter_message("您想查询哪个月的消费?")
return []
# query database here using item and time as key. but you may normalize time format first.
dispatcher.utter_message("好,请稍等")
if item == "流量":
dispatcher.utter_message("您好,您{}共使用{}二百八十兆,剩余三十兆。".format(time, item))
else:
dispatcher.utter_message("您好,您{}共消费二十八元。".format(time))
return []

这个框架的主要优点:

  • 便捷的意图识别。(预定好意图类别)
  • 便捷的训练数据生成工具。(根据你给的例子,自动生成训练数据!超级好用)❤❤❤
  • 可以识别填槽类问题,用于任务式问答(订票之类的)

对话管理:https://www.jianshu.com/p/515385a7c7f0

rasa中文:https://jverson.com/2018/09/11/rasa-nlu/

2.3.3 DeepQA ❤

DeepQA项目试图重现神经会话模型的结果(又名谷歌聊天机器人),它采用了RNN(seq2seq模型)判刑预测,使用Python和TensorFlow实现。

如果需要自研 闲聊对话系统,可以参考这个。 但是需要大量中文对话数据,在数据来源方面,没有调研。

2.4 DeepPavlov❤❤❤❤

3.2K star https://github.com/deepmipt/DeepPavlov

开源的对话 AI 库,建立在 TensorFlow 和 Keras 上。
DeepPavlov框架层次:

  • Agent
    同用户直接交互的代理,直接接收用户输入的纯文本信息(raw text)
  • Skill
    领域技能,如基于意图-词槽的任务型技能,基于Seq2Seq的闲聊技能,基于知识图谱的知识问答技能;
  • Skill Manager
    确定用户query,选择使用哪些skill,并确定将哪一个skill的召回结果作为最终的回复;
  • Component
    Skill实现的组成部分,如针对任务型技能,包括数据预处理component、意图识别component、slotfilling component等;

DeepPavlov内置的skill主要包括:

  1. 任务型skill(Goal-Oriented Dialogue Bot)
    基于意图/词槽/对话管理等component实现的问答skill。
  2. 规则型skill(Pattern Matching)
    基于自定义规则实现问答skill。
  3. Seq2Seq skill(Sequence-To-Sequence Dialogue Bot)
    基于Seq2Seq实现问答skill。
  4. 阅读理解skill(Open-Domain Question Answering)
    基于阅读理解实现问答skill。相对于阅读理解component(Context Question Answering),skill还包含在多个召回结果中进行排序的能力。

DeepPavlov内置的基本能力主要包括:

  • 数据预处理component(Data processors)
    主要提供包括分词、嵌入向量化等预处理能力(主要基于俄文和英文)。
  • 阅读理解component(Context Question Answering)
    相对于阅读理解skill(Open-Domain Question Answering),component不包含对多个召回结果进行排序(rank)的能力。具体的处理场景示例如下,
  • 分类component(Classification)
    分类组件,可以用来做场景和意图的分类。

  • 命名实体识别component(Named Entity Recognition)
    NER能力组件。

  • 相似度计算component(Neural Ranking)
    通过基于孪生网络完成相似度计算,实现在标准问答库中标准答复的查找。
  • 词槽填充component(Slot filling)
    在NER的基础上,增加了词表限制。
  • *拼写纠错component(Spelling Correction)
    提供了两种纠错方法: levenshtein_corrector :基于编辑距离;brillmoore:基于统计模型
  • TF-IDF排序component(TF-IDF Ranking)
    基于TF-IDF的文档召回排序。

按照介绍所说,这个框架可以覆盖任务式(填槽skill)、问答式(相似度计算skill)、闲聊式(端到端训练技术)。直接就是一个复合框架。

下一步计划是对这个项目试用调研。

参考:https://zhuanlan.zhihu.com/p/58133705

3 总结

3.1 希望达到了效果

我们客服的问答系统 需要达到的效果:

  • 能简单闲聊,比如:你好,有什么可以帮你?(占比10%)
  • 能回答知识性问题,比如:怎么修改云闪付手机号?(占比40%)
  • 能回答规则类问题,比如:我云闪付电费交不了怎么办?需要填槽省份信息、错误代码信息等。(50%)

3.2 需要的模式

因此,我们的系统需要像阿里的架构一样,包含多种问答模式,满足不同需求。

  1. 首先使用 规则模版 解决规则类问题。(使用rasa填槽)
  2. 解决不了的,使用相似度匹配的完成知识类问答。(可以使用chatterbot)
  3. 相似度信度低于 阈值,可以使用谷歌DeepQA生成式、可以使用RASA闲聊意图、可以自己配置一些问答数据在chatterbot中。

3.3 集成的方法

如何将三种问答模型 结合起来? 可行的办法:

  1. 单独编写一个框架,把上述三种QA封装成三个模块。
  2. 利用chatterbot,可以自定义模块的特性。 把 rasa(结构化QA)和 闲聊(Seq2Seq生成式) 封装为两个接口。
  3. 使用DeepPavlov 直接包含三种模式。

下一步计划,调研DeepPavlov的可用性。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×