此公开课为极客公园策划的「极客公开课·Live」第八期。三角兽首席科学家王宝勋将为大家教授聊天机器人的两种技术路线及对比,自动聊天系统中的主要问题及解决方案(短文本语义关系计算、基于 IR 自动聊天框架下的上下文相关模型、聊天系统评价方法等),还有目前聊天机器人面临的主要挑战(公开数据集和评测方法、聊天过程中的主题切换、与用户的情感沟通)。
什么是「极客公开课」?
1 位技术产品大牛和 10 位优秀技术产品人围绕技术产品相关话题,面对面深度分享和讨论,共同创造更优的知识与更高的学习效率。
而现在,这种深度的交流方式属于每一个人,知乎 Live 同步线上实时问答,随时随地参与提问互动,与数百人共创一本知乎 live 版的「课堂笔记」
每周 1 次,全年 50 场,极客公开课,推动产品人的自我迭代
以下为本期课堂笔记精华摘要:
背景介绍
聊天机器人应该有的基本的能力和状态是什么样子的。
第一,它应该能够跟人进行持续的聊天对话,它对应的是后面面临的几个关键的问题。
第二,我们需要在用户可能任何的 query,有一个合理的回答,你不能要求一个用户说,你只能跟我聊这个话题,不能聊别的,我可以跟聊天机器人说任何东西,你都能接住,理想的情况是这样。最后,最好是能考虑到用户的个体差异,至少说,年轻的女孩聊的时候是什么状态,跟成年大叔聊的是什么状态,或者跟比较高的教育背景的人应该聊什么。对于同一个 query 来了之后,你的回复最后能不同。
这里面有几个重点的地方,一个是持续,接下来是对于任何 query 都要有合理的回复,最后要考虑个体差异。对于一个实际能力影响的产品或者系统来说,我们认为,这也是三角兽在这么长时间的商务的沟通和合作过程中,我们认为自动聊天应该是一个很基本的模块,任何一个产品,只要是提供对话接口的话,免不了做一些聊天,因为你很难保证用户说了什么。比如说,我的产品只做天气预报,你就只问我天气,用户是不会那么听话的,我就跟你聊一点人生,你如果接得不好的话,你对我的产品印象就会差,所以说,它是一个基本的模块。
对于一个单纯的聊天系统来说,它的用户黏性是有问题的。一般来说,最好它能完成一些任务,能配合着聊天做一些事情,达到一些目的。这样的话,这里面存在了对话协作,这两个模块,一个是任务对话,一个是聊天,之间能够自由切换。详解请见知乎 Live
聊天机器人的主要技术路线
第二个大的部分,聊天机器人主要的路线。在这之前,我们要讨论一个很重要的问题,就是自动聊天系统的技术基因。它是从一个实际应用的聊天系统来说,是从哪些问题或者技术里面借用的概念和方法?来看一下聊天机器人典型的技术路线,也是现在大家比较能接受的技术路线。
自动聊天系统的发展得益于以下的研究和发展。
第一,非事实类的问答。就是外号这种问答,这跟我的博士课题是完全一样的,我当时就是做这个方向。
第二,CQA、百度知道,典型的为代表,英文的可能有更多。CQA 他们的发展主要提供了足球的语料、数据资源。
第三,从在线的比如说像论坛、或者 SNS,我们去挖问答对,这也是一个方向,这个方向的发展有助于自动聊天系统的推进。这其实也是一个方向,FAQ 的应用。这个大概是 2010 年左右,ACL 一个重要的研究方向。
这些研究的共同出发点,或者说他们理想的 idea 是这样的,如果我的 QA 数据,一来一回的数据足够多,多到能足以 cover 用户所有的可能的 query 的话,我们再配合以足够好的匹配能力、算法和答案排序算法,那么问答系统是可以实现的,再推广的话,聊天系统无非也就是这样的。
所以,在早期的研究里面,我们得到了一些重要的结论,这些结论其实现在来说,也非常重要。
第一,文本语义的相似性和相关性,实际上是完全不同的两个需求。就是说,很多时候,我们说相似文本实际上不对,很多时候我们需要量化的并不是相似,而是相关。为什么这么说?两句话可能完全在句子层面或者是在词法层面完全不相似,没有任何相似性,但是他们的语义是相关的。那这种情况下,你进行相似的量化,这个方法不适用于相关性的量化。
第二,对于短文本来说,相关性的计算非常难,难到什么程度?这两句话通常来说,所有 NLP 方向的同学,你们计算一下两个文本的关联。对于短文本来说,你会发现,首先这个词极少,一个几十万维的词语空间、特征空间,一句话里面其实只能包含 10 个以下的词语,那这 10 个以下的词语,两句话,很有可能没有任何一个词是重复的。所以,你做这个事情,就会算出一个 0 出来,那这两句话完全不相关,显然是不对的。
我下面举个例子,比如他说,你今天心情怎么样?有人很文艺地说,就像外面的天一样阴沉。这是一个很好的恢复,如果我们用传统的方法是做不到这个事情的,做相关性度量是没有办法的。
还有一种,ThinkPad 是最好的笔记本吗?他说,反正我是小黑的铁粉。这里面实际上存在一个关联,ThinkPad 和小黑的关系,是不是能事先拿到。
所以说,对于短文本的语义相关,这个事情本身是一个非常大的难题。现在也没有得到完美的解决。
接下来又说,我们在最开始初始的时候,一穷二百的状态下的时候,我们希望从哪些研究里面,学到知识得到经验,来构建一个聊天机器人?至少有这几个方向,虽然说词语贡献没有什么用,但是词语贡献的信息还是要有的,所以,最简单的还是贡献的统计。详解请见知乎 Live
聊天机器人的两种技术路线,打一个简单的比方,我们要爬一座山,这作山有两条路,喜马拉雅山也是这样,一个好走,一个不好走。但是看起来好走,也不是说谁都可以上去,可能里面还是有坑,只是说没有发现,或者真正走的时候,才会发现,这条路未必那么容易,看起来很难的路,应该是很难了,否则的话,大家都走那条路了。但是沿途可能会有很美的风景,我们收获的东西会很多。
但是,对于聊天来说,我认为从学术上讲,不管从那一条路上走,其实你都只是在山脚下,你连山腰都没有上去,我们所有的工作其实都是很基础的,当然可能会有一些所谓的技术发展很好的公司,可能实际上也需要在这个方向上再仔细地打磨一下。
它的技术路线,第一:基于检索的技术路线,我之前已经铺垫地非常多了,如果我有足够的问答对,聊天的对,一来一回,我建一个索引,那我们要做的是什么?来一个 query 的话,我做好问答库里面问题的匹配,但是这个匹配其实不容易,两句话未必完全相同,这是文本相似的问题,不是相关。做完匹配以后,我们会捞到大量的侯选答案,然后我们把侯选答案再跟实际的 query 做相关的计算,然后把最相关的东西排序,得到最相关的回复,然后返回给用户。就是这么简单,很容易想到,其实说白了就是一个检索系统,其实跟现在的搜索引擎的技术框架是比较相似的。这里面用到的方法其实是跟搜索引擎会差得也有一点多,但是框架上会非常一致。
这里面给出了一个这个图的细化的结构,其实这是一个三层的逻辑架构。
第一层,我们要解决的是一个问题来了以后,我们约定一下这里面的一些词语,用户输入 query,我手里的是 question 和 reply,我们首先要计算的是 query 和 question 的关系,找到一些跟用户的 query 最相关的,最相似的,找到了这些问题之后,我再通过这些问题找到这些问题存的答案。
第二层,要进行 query 到 reply 的相关性的排序或者分类,当然分类模型也可以做排序。在这两步过程中,我们要考虑的是单轮的语义相关性,多轮的语义相关性,以及在主题上的相关性,以保证聊天顺畅。但是可以想见,不管是第一层的匹配也好,第二层的排序也好,以致于多轮的关联、建模也好,其实都非常难,都没有完全解决。
第三层,假如我知道一些用户的个人信息,以及一些其他方面的非文本相关层面的需求,我要对这个答案,再进行第三层的排序,以使得我们可以考虑到用户的 profile 信息,其他的特征。整个这一套的系统构建得益于下面这些数据源,公开和访问的数据源。首先要爬下来,然后做清洗,建成一个语料库。详解请见知乎 Live
两种技术框架的对比
下面我们对比一下这两种技术框架,基于检索的技术框架,它的好处是什么呢?
第一,我能保证每一个答案都可读性比较好,它自己至少可以撑一句,这个句子因为客观存在,必然合理,因为我是从网上挖的,所以说这句话可能是可读性可以保证的。
第二,因为我们有大量的数据源,只要你能控制得了,你能索引,没问题的话,我对于任何一个问题都能保证回复的多样性,至少不只是一个了。
第三,这个模型因为结构非常清晰,每一个模块拆解得比较细,debug 起来就很容易了。也就是说一个产品出了问题,我能相对比较快地定位到具体是哪个模块吃了问题,具体到哪个代码出了问题,这都比较容易。
对它来说,很难做的是什么呢?就是我刚才说的,你要让开,你要找问题和答案,然后重新排序,这个事情不像大家想象得那么简单,不像 IR 检索系统那么简单。详解请见知乎 Live
自动聊天系统中的主要问题及解决方案
其实在这个之前,我们铺垫一下,深度学习对于聊天系统来说意味着什么?深度学习现在是一个显学,就是好像大家都挺懂深度学习的,包括可能会有一些之前不知道是干什么的人现在也很懂深度学习,很奇怪。
聊天机器人中我们可以认为是深度学习一个非常好的实验场所,这里面我们实验了很多方法确实行之有效,而且我们清楚地知道有效的点是什么。但是也有一些方法看起来有效,其实并没有那么简单,我们需要做很多的事情,让它真的像传说中的那么有效。
这里面从浅到深,我们列了这么一个关系。比如说最浅层的就是词向量。比它深一层的是各种 NN,CNN、RNN 等等这些东西。刚才说的代表着第二个技术框架的生成序列的方法,还有交换学习,以及还有很多,最近比较火的是对抗学习,可能还有别的。反正深度学习各种方法,就和锤子一样,我拿了就砸一下,看看能不能砸开,砸得开是好东西,砸不开不一定是因为你的模型不好,可能是因为你对模型的理解不够。
第一,生成的答案和回复应该是能够引申出更多的聊天的轮数的,也就是说,在它这个基础上,更有可能用户回复说,我不知道,或者是随便,就是这样没有什么影响下一轮的对话的话,那这一轮的生成就是失败的。
第二,生成的东西,要能推动聊天的进展,而不是重复前面的内容,所以说,它要跟前面的信息有一个趋重的关系在。
第三,更重要的是说,生成的回复应该是语义上强相关于 query 的,强相关到什么程度,应该是反向也能生成回去。它把这三个 reward 加在一起,加权平均一下,就是最后定义的 reward,剩下的东西就是故事了,大家都比较熟悉了。详解请见知乎 Live
目前面临的主要挑战
最主要的其实是目前的数据集不统一,训练数据还好一点,测试集非常不统一。公开的训练集有这么几个,一个是从无关图下来的很大的数据集,在这里面,也是我们做了一个它的子集,这个字迹在主题性上,以及整个对话质量上更高一些,现在也是有好几个论文在用这个集合。
接下来的挑战就是说,机器人自主聊天、基础聊天、主题聊天、以及任务型对话无缝切换。你不能要求人就跟我聊这个,你切换了以后得告诉我一下,不能这样的。所以说,他在无缝切换的时候,机器是否能判断,也实现无缝的切换,这是一个很难的点。详解请见知乎 Live
以上就是本次公开课的所有关键内容。
本次课程完整音频与 PPT,请点击「极客公开课·Live」第八期或扫描下方二维码查看获取: