字体:  增大          减小       

11-2 灵魂体构建


 “多年以后,奥雷连诺上校站在行刑队面前,准会想起父亲带他去参观冰块的那个遥远的下午。”

        ----加夫列尔·加西亚·马尔克斯《百年孤独》

 

上述文字可能是文学史中最著名也是近代被仿写次数最多的小说开头。之所以如此精彩,能够一开始就深深地打动人心,是因为作者寥寥数语就将过去与将来的时空撕裂,却又保持一种现在的平视感,既将现实魔幻化,又将魔幻现实化。

而二十一世纪初叶的我们,也将面对人工智能技术带来的“百年孤独”。

为什么会这样说?

现在的经济是互联网经济主导,未来的工业是人工智能工业掌控一切。与以往的工业革命不同,这次信息产业的工业革命,其实是一个类似莎士比亚反问类型,那种“生存还是毁灭”的终极问题。面对人工智能,人类其实只有两种选择,要么消亡,要么与其融合。

这种尴尬,这种无奈,人工智能科技工作者可能与查尔斯·狄更斯面对19世纪工业革命的冲击时有同样是感受,于是也一定会发出同样的感言:“这是一个最好的时代,这也是一个最坏的时代。”

但是不管怎样,人工智能时代终将会来临。

受制于现阶段的理论认识和技术积累,现在几乎所有的人工智能产品都是弱人工智能产品,即只能辅助决策,而不能掌控大局。

与其消极等待,不如积极进取。秉承这种精神,在弱人工智能和强人工智能之间,还应该努力创造一个中间过度层,即一种利用超大容量真人语料来“高仿灵魂”的技术手段,我们称之为“灵魂魔罐”。

 

利用“灵魂魔罐”技术思想进行构建和落地:

 

11-2-1 意图识别引擎

 

基本定义

 

怎样才能通俗地理解用户意图识别?就是让智能助理系统能够识别出与用户输入的查询最相关的信息,例如用户输入“”你好”时,识别为“礼貌交际语”,反馈“你好,有什么可以帮到您?”,当用户输入“吸烟真地能导致肺癌么?”,识别为“是否型”,回答“能”。当用户接着问“那咋回事?”,能够从闲聊模式里进行复验,回溯识别为“为什么型”,调用知识库查询引擎进行相关处理。

 

填槽:一般认为是与命名实体识别是一个意思。

注意力机制:是神经网络计算框架应用在自然语言处理中的一个核心算法思想,在机器翻译和阅读理解方面有重要的应用。

用户意图识别相对于没有细分的意图识别模块的自动问答子系统的优点就是:

1. 把大量时间和资源用在后端的模式计算中,当系统部署后,用户提问时,就会节省反馈时间。

2. 更像“人类”助理,体现其智能化与人性化的特色,能够大大提升情感体验。

3. 用户意图识别的结论可以作为问题语义识别的修正因子,提高问题回答的准度,减少召回。

总之,用户意图识别是一个人工智能产品最本质与不可或缺的重要子系统,也是第一个难点与重点所在。

 

分类算法是意图识别的细分类可行算法:

 

意图识别决策树:

 

图11-2-1 意图识别决策树层次示意图

图解说明:

这张图在理论框架上把开放领域的问题集用决策树的拓扑图的方式进行了“因式分解”,降低了系统处理的难度,引入了推理机制,为以状态机为模型的软件层实现指明了方向。

 

由于智能助理系统的核心还是一个不定任务的多轮会话子系统,因此从这个角度讲,意图分类从先验的思想考量可以按照上图的决策树进行划分:

说明,层次划分用于形象理解架构和思路,维度划分易于工程编码。

一层:

一维 闲聊与实质性问题

二层:

二维 闲聊类的细分类

三维 实质性问题的是否型与解答型划分

三层:

四维 实质性问题的“是什么”,“为什么”,“怎么做”,“指令”的子分类划分,其中“指令”,隐含了“执行”意图。

四层:

四维的指令识别处理。

五维及以下 针对第三维意图识别的跟幼细粒度划分,具体操作原则与整个智能助理的领域应用定位有关系。整个拓扑结构可以是一个异常复杂的网状网结构,这取决于系统应用的整体定位于数据集的规模与质量。本文仅以医疗抗癌助理的实例进行解释,所有的识别子模块的接口在开源代码中都有演示和调用实例。

 

多维度意图识别的标注编码的构造:

 

举一个形象的笑话:

几年前,我跟一个寡妇结了婚,她有一个已成年的女儿。后来我父亲跟我妻子的女儿结了婚。我女儿就成了我的继母,我父亲成了我的女婿。两年后我妻子为我生了个儿子,他是我后母同母异父的弟弟,我儿子管我叫爸,我管我儿子叫舅。我女儿又为我父亲生了个儿子,他是我的弟弟,但他又必须得管我叫外公,同时我是我妻子的丈夫,我妻子又是我后母的母亲也是我的外婆,所以我是我自己的外公。

 

貌似很荒谬,但是你用多维度身份定义就很好解释:[自己,丈夫,新生男孩的哥哥,新生男孩的外公……]

类比上文,“某某指标高是肺癌么?”问句的意图识别,可以这样标定:[实质性问题,0,是否型,0,诊断型]五个维度,即每个维度都成立,逻辑判别是即是……也不是……又是……还不是……也是……

 

启发点:在深度学习分类器处理时,人工标注分类时需要给予数字化,因此可以借鉴整数的权的思想,例如:128即是百位数,也是10位数,也是个位数。

因此分类编码为 10102,权重编码表见下:

说明:在此维度无定义用0编码

数字

 

 

位数(左数)

1

2

3

4

5

6

7

8

9

第一位

实质型

闲聊型








第二位

礼貌语

情感的交流

情感的关怀







第三位

是否型

解答型








第四位

是什么

为什么

怎么办

指令






第五位

常识

诊断

治疗

生存期

花费

其它医疗问题




11-2-1 五维意图识别编码解释表

 

类似哈夫曼树的构造,这样做的好处有:

一,            整数编码不象哈希编码那样长,便于处理,存储,节省硬件资源;

二,            将决策树型逐层二分类转化为整数编码的多分类,只需要训练一个模型;

三,            使用时解码简单,可以直接用于中控程序里不同分析模块调用的决策树。

 

值得商榷的地方:

训练集的对人工标注要求比较高,每一个问题实质上要做5次分类识别,极易出错,就需要多一步校验,因此数据处理成本较高。

每一个维度抛除0,最多可以再细分为9个子类,想要进一步细分意图会增加整体维度。


实战技巧:

 

1 意图识别是否看成是多分类问题?

答:可以。

 

2 工程角度讲,能否把复杂多分类分解成决策树型若干二分类问题?

答:可以。

 

3 从工程角度提速的角度讲,能否在只降低几个百分比的情况下,尽可能采用简单分类器,如LRXGboost快速融合模型?

答:可以。

 

4 意图分类器的测试标准是什么?

答:召回率与查准率。

 

5 意图分类怎么和多轮对话的状态(如话语权在谁手,判别本轮对话是否结束)相结合?

答:需要额外的话语权识别器和反问生成器,结合中控系统的问答回溯模块,新增特征因子,递归识别意图。

 

6 如何提高意图分类得查准率?

 

1、数据集

意图识别离不开数据,搜索领域的意图识别用到的数据通常就是用户的搜索日志了。一般一条搜索日志记录会包括时间-查询串-点击URL记录-在结果中的位置等信息。

2、数据清洗

拿到日志数据,一般是不能直接用的,里面会包含很多的噪声数据,无用信息,我们都需要把它给清洗掉。

3、查询扩展

上面提到,意图识别可以看成是文本分类的问题,但是只依赖查询串是肯定不行的,提供的信息太少太少,所以常做的就是考虑利用先前的搜索日志信息,例如历史查询串对应的标题、时间、近义词等信息。有的场景下还会加入地点信息,例如地图搜索。

一些可以用来扩展的信息有:

1)点击标题。通常在搜索日志中,会以一个session为单位,一个session中保存的是一个时间段内的相关搜索信息,我们可以用的信息字段是查询串-点击标题-点击次数-时间等,在不同session的同一查询可能对应的点击记录不一样,我们可以把它们合并起来,将标题放到查询文档中;

2)相似查询串。同样,同一点击记录的不同查询我们也可以拿来用的;

3)此外,同义词词林、利用word2vec得到的近义词集合都可以扩展进来。

这样我们就可以得到一个信息比较丰富的查询文档了。值得注意的是,同一session下的不同查询,如果有递增关系,说明用户在根据搜索结果进行修正查询,那么新增的词应该对意图分类作用很大。

 

4、特征工程

把上面扩展得到的查询文档利用tfidf向量化,就可以得到一个特征向量,一般情况下,这个特征向量维度会非常高,我们可以利用词频、卡方、互信息等方法进行特征选择,保留更有用的特征信息。

我们还可以加入一些数字特征在里面,例如:

1Query的长度

2Query的频次

3Title的长度

4Title的频次

5BM-25

6Query的首字、尾字等

 

5、分类器训练

在完成特征任务后,接下来就是选择合适的分类器进行训练了,因为意图识别可以看作是一个多分类任务,所以通常可以选择SVM、决策树等来训练分类器。

 

 

11-2-2填槽机制的多轮对话

 

11-2-2-1基础知识

 

 

图11-2-2 标准多轮对话语料示意图

 

如果用有限状态机来处理多轮对话,就必须对话语权方(即谁说出的话,必须被对方回答,则这方为对话话语权方)的每一个token语句进行意图识别,引入意图队列,对队列进行基于规则的推理机处理或基于深度学习的预测,例如:(寒暄 > 查订单 > 确认退款 > ? )正常情况 ? == 再见结束本轮对话。

当然也可以用seq2seq的方法,将整个对话过程,抽象成一个session。输入若干个相关句子,解码成一个句子,即答案。

多轮交互的一个重点问题是:如何根据上下文理解当前的意图,而不仅仅是针对单轮进行一个分析,从而能够使得对话在一个连续的语境下,是具备session粒度理解能力的。

以下方案,均假设有一个已经做得比较好的单轮理解以后的情况:

尝试方案1:

最简单粗暴地,把多轮query,融合成一个单轮的query,进行一次性的解析.

直接将多轮交互的意图理解问题,转换成一个单轮的意图理解问题,从而复用原有的单轮理解效果。

例如:我想看电影--周星驰演的--喜剧片,三个query合并以后,解析到实际用户的需求,是周星驰主演的喜剧电影。

优点:简单,粗暴,易于实现,几乎服用了单轮解析能力

缺点:简单,粗暴,易于出错,几乎没有任何实质性的多轮解析能力,纯粹靠运气

优化方向:可以加入一些query拼接的限制,提高拼接的准确率,从而在运用到单轮解析能力的同时,不至于在准召上偏离得太离谱(如:只拼接两轮的、三轮及以上拼接,考虑拼接后的意图变化情况等)

 

尝试方案2:

不是简单拼接,而是结果和query的识别过程拼接:

单轮已经解析出了一个意图和某些槽位,将此意图及槽位存储起来。

遇到query的时候,判定该意图下,这个query能否纳入同样的意图中,抽取出对应的槽位。

如果可以,则更新意图的槽位内容。

如果不可以,则抛弃当前意图,以query作为单轮解析,得到新的意图。

例如:我想看电影--要免费的,第一轮意图为电影,第二轮在电影这个意图下,发现“免费”这个槽位,是符合电影意图描述的,所以,为该意图的槽位新增一个“免费”

例如:我想看爱情电影--能给我讲个笑话吗,第一轮意图为电影,而第二轮在电影这个意图下,发现query并没有任何跟电影相关的槽位信息,所以,抛弃第一轮的电影意图,直接将第二轮query当成单轮的,直接解析得到新的意图--笑话。

优点:基于意图来进行判定,比拼接更准确,也更广泛地识别当前query是否仍在同一个意图中,递归地实现多轮意图解析,避免了拼接过长,拼接过于粗暴带来的误召回和欠召回

缺点:存储下来的是意图和槽位,然后再基于此进行新的query解析,判定是否槽位能够纳入原有意图范围内,这种递归一旦有某一步除了问题,后面的每一步,基本上都挂掉了,解析错误的传播深度和广度,都会很大

优化方向:前面几步,可以辅助以方案一的拼接,来提高意图的正确性,保证后续的方向,都是正确的

 

尝试方案3:

以对话管理过程中增加一些冗余性来对方案2进行扩充,提高召回率。

多轮交互一旦进入了某个意图,即开始该意图的满足,而当其第一次多轮解析未能命中该意图,也无法命中任何其他意图(纯属闲聊)的时候,可以跳过该轮的意图解析,而继续进入下一轮,检测该意图是否涵盖了当前query中的槽位,是则可以继续该意图的满足,不至于轻易断开多轮对话流(此处的冗余轮数可以根据实际情况自行调整,一轮、两轮均可)。

例如:给我推荐个餐厅--有川菜口味的吗--咦,还蛮多嘛(冗余跳过)--找个最便宜的吧

优点:可以一定程度上缓解方案二递归性带来的意外跳出意图的问题,提高每个意图的服务整体性,保证多轮的延续性。

缺点:因为原理上跟方案二是一致的,所以还是会存在方案二的缺点,并且冗余跳过有可能是未能识别到具体的意图,从而令本该跳出对话的多轮,多停留了一两轮在了当前意图,才能跳出去,会降低交互的智能性。

优化方向:尽可能提升多个意图的覆盖面,从而减少切换意图的误判为聊天,提升冗余的准确性

 

上述三个方案,都是可以直接通过比较简单的框架设计来实现的,而读者可以发现,可能最关键的还是这些方案的前提:【假设有一个已经做得比较好的单轮理解】。

 

可以看到,单轮理解是所有意图识别的基础,只有做好单轮的理解,才可能做好多轮,当然,做好了单轮,不一定就能做好多轮。

对话系统的分类及方法:

按照对话答案的生成方式大致可以分为以下几种:

1.  规则依存系统(Rule-based system):对话经过预定义的规则(关键词、if-else、机器学习方法等)处理,然后执行相应的操作,产生回复。(ELIZA系统,如果输入语句中没有发现预定义规则,则生成generic的响应)。缺点是规则的定义,系统越复杂规则也越多,而且其无法理解人类语言,也无法生成有意义的自然语言对话。处在比较浅层的阶段;

2.  检索依存系统(IR-based Systems):信息检索或者最近邻方法,要求生成的响应与对话存在语义相关性(VSM、TF-IDF、page-Rank、推荐等排序方法)。有点是比生成模型简单,直接从训练集中选择答案,且可以添加自定义规则干预排序函数较为灵活;缺点是无法应对自然语言的多变性、语境解构、连贯性等,对语义的细微差别也无法识别;

3.  自生成依存系统(Generation-based Systems):将对话视为input-output mapping问题,提出了MT-based方法(SMT统计机器翻译、IBM-model、phrase-based MT等),这种方法复杂且无法很好的解决输入输出的对应关系(尤其是当句子较复杂的时候,只适合单词级别)。但是NN、seq-to-seq等方法很好地解决了这些问题,可以生成更加丰富、有意义、特别的对话响应。但是还存在许多问题,比如沉闷的回应、agent没有一个固定的风格、多轮对话槽填充等等。

4.  框架依存系统(Frame-based Dialogue Systems):定义一个对话的框架,及其中所涉及的重要元素。优点是目标明确框架对对话指导意义明显,适用于飞机票、餐馆等预定领域。缺点是框架设计需要人工成本,且无法迁移到别的领域,并未涉及到人类语言的理解层面。

按照对话的应答方式大致可以分为以下几种:

1.  有限状态机系统(Finite-State Machine Systems):(用户使用预定义的模板提问,系统之响应能力范围之内的问题),这种方法的缺点是完全依赖于对框架slot的填充,而无法决定对话的进程和状态(用户接受建议、拒绝等)

2.  纯粹的多轮对话依存系统(State-based Systems):主要包含系统状态(上下文信息、用户意图、对话进程等)和系统行动两(基于state采取action)个部分。MDP、POMDP等模型。

3.  纯粹的单轮对话(Question-Answering -QA)系统(Based Dialogue Systems):factoid QA-based,个人助手,需要回答各种各样的问题并且进行交互式对话。目前的研究点主要包括,bot如何通过对话进行自学习、对于out-of-vocab的词汇应该学会问,即学会与人交流、如何通过在线反馈学习(犯错时调整、正确时加强)

 

11-2-2-2综合落实实施方案:

 

图11-2-3 多轮对话流程示意图

 

用“灵魂魔罐”技术思想构造一个最简单得人工智能灵魂体机器人核心是一个可变任务的多轮对话系统。这其中可以划分为两个简单子系统

 

情感类虚无问题处理子系统,包括以下两个孙系统:

闲聊=礼貌语言,心理交流=提供情感关怀

 

实质性问题处理子系统,包含两个孙系统:

知识检索=授道解惑

命令处理=祈使,代办服务

 

这种落地实现的系统架构,源于二叉决策树,可参照数据结构类书籍深入了解。用于工程上是源于一个基本原理假设:无论多么复杂的问题都可以分解成一个二叉树决策森林。

 

现在已有的助理系统,在这个架构解析上,未必是清晰的。就造成了整体架构的混乱,泛化能力差,反应慢和系统资源浪费严重。


上一章          下一章

相关内容     系统首页