chatbot是最近一段时间非常火的一个词或者一个应用,不仅仅各大新闻媒体在热炒bot的概念,各大巨头也投入巨大的资源进行研发,arxiv上刷出bot相关的paper也更是家常便饭。炒作归炒作,PR归PR,不得不说一个尴尬的事实是市面上确实难以找到一个真正好用的bot。bot按照涉及的领域,分为开放域(open-domain)和面向具体任务(task-oriented)的bot。开放域要做的事情很大,更像是一个什么都能搞的平台,不管你提什么样的需求,它都能够解决,有点trueAI的意思,而面向任务的bot则专注做好一件事情,订机票,订餐,办护照等等。
说到开放域bot,大家接触最多的也就是一些回答非常无厘头的娱乐用bot,比如很多年前活跃在各大社交网站上的小黄鸡,现在市面上活跃着很多号称掌握了bot技术,在用深度学习解决bot技术的bot公司,都是这种,解决不了什么实际问题,就是能和大家聊上两句,而且很多时候回答都是牛头不对马嘴的,机器人维修,十分可笑。
再说task-orientedbot,市面上最多的就是客服机器人,银行也好,电商也罢,不想重复性地回答用户的问题,就用一个客服机器人来应对,且不说效果如何,开发一个具体task的bot需要费不少工夫,而且后期还要大量的维护,因为太多的handcraftedfeatures被用到,整个bot的框架横向扩展性相对来说较差,换一个场景基本上就需要重新开发一套,人力成本太高了。
bot的理想非常丰满,大公司描绘的场景也确实很美,但现实的bot却狠狠地浇了一盆冷水下来。期望越高,失望越大。如果媒体一味地吹捧bot,仿佛整个世界明天就会是bot的了,对bot的发展并无益处,捧杀只会带来气泡,破裂之后,一切如初。
功能强大的、开放域的bot在短期内是比较难实现的,但是如果降低期望,将bot不应当做是一种技术层面的革命,而应当做交互层面的革新才是理性的态度,bot作为一种入口,可能大家都不再需要一个随身携带的终端,只需要找到一个可以识别身份,可以联网的硬件,比如一面镜子,就可以执行很多的task,订机票、买东西等等等等。bot这个时候起到的是一个操作的入口和背后执行各种不同task的黑箱,我们不需要看到整个执行过程,也不需要知道原理是什么,通过一些简单的语言交互,就能完成一些复杂的task,终端要做的事情就是反馈结果和接收输入,执行的过程都在云端,各种bot云。
而这一切的关键是解决好task-orientedbot,用更多datadriven的解决方案来代替传统的人工features和templates。
|问题描述
bot是一个综合性的问题,涉及到下面三个主要问题:
1、responsegeneration(selection)
对话生成是最后一个步骤,是输出的部分。简单总结下,有四种solutions:
solution1直接根据context来生成对话,这方面最近的paper非常地多,尤其是seq2seq+attention框架席卷了NLP的很多任务之后,对话生成的benchmark也一次又一次地被各种model刷新着。对话生成的问题,被定义为基于某个条件下的生成模型,典型的根据context来predictwords,涉及到句子生成的问题,评价问题就会是一个比较难的问题。
solution2当然有的paper并不是将对话生成定义为语言模型问题,而是一个nextutteranceselection的问题,一个多选一的问题,给定一个context,给定一个utterancecandidatelist,从list中选择一个作为response,当然这类问题的难度会小很多,评价起来也非常容易,但是数据集准备起来要多花一些功夫,而且在实际应用中不好被借鉴。
solution3rule-based或者说template-based,response的最终形式其实是填充了一个模板而成的,大多数的东西是给定的,只有一些具体的value需要来填充。这一类解决方案很适合做task-orientedbot,但过多的人工features和templates导致了其难以移植到其他task上。
solution4query-based或者说example-based,response是来自于一个叫做知识库的数据库,里面包含了大量的、丰富的example,根据用户的query,找到最接近的example,将对应的response返回出来作为输出。这一类解决方案非常适合做娱乐、搞笑用的bot,核心技术在于找更多的数据来丰富知识库,来清洗知识库。但毕竟respnose是从别人那里拿出来的,可能会很搞笑,但大多数会牛头不对马嘴。
2、dialogstatetracking(DST)
有的paper称DST为belieftrackers,这个部件其实是bot的核心,它的作用在于理解或者捕捉userintention或者goal,只有当你真的知道用户需要什么,你才能做出正确的action或者response。关于这个部分,会有DialogStateTrackingChallenge比赛。一般来说都会给定一个state的范围,通过context来predict用户属于哪个state,有什么样的需求,是需要查询天气还是要查询火车票。
3、usermodeling
bot面向具体的业务,都是和真实的user来打交道的,如果只是简单的FAQbot,回答几个常见的问题可能不需要这块,但如果是其他更加复杂、细致的业务,都需要给用户建模,相同的问题,bot给每个人的response一定是不同的,这个道理非常简单。usermodeling,需要涉及的不仅仅是简单的用户基本信息和用户的一些显式反馈信息,而更重要的是用户的historyconversations,这些隐式的反馈信息。就像是推荐系统火起来之前,大家都是中规中矩地卖东西,但是有一些聪明人开始分析用户的行为,不仅是那些点赞行为,更多的是那些用户不经意间留下的蛛丝马迹,从而知道了用户对哪些东西潜在地感兴趣,也就是后来推荐系统在做的事情。对user进行建模,就是做一个个性化的bot,生成的每一个response都有这个user鲜明的特点。
|语料
大型的语料都是用来训练开放域bot对话生成模型的,数据源一般都是来自社交网站。而对于task-orientedbot来说,客户的数据一般规模都非常地小,这也正是难以将datadriven的方案直接套用到task-orientedbot上的一个主要原因。
[1]中给出了bot训练语料的survey,感兴趣的同学可以读一下这篇survey。
图来自文章[13],英文的语料确实比较多,SinaWeibo那个语料是华为诺亚方舟实验室release的[12]。从twitter或者微博上产生bot数据的话,conversationalinnature效果不如从ubuntuchatlogs这种聊天室产生的数据更加适合训练response生成模型,因为更加天然无公害。文章[5]也用了一个大型中文语料,数据来自百度贴吧。
|模型
研究bot的paper是在太多了,这是一个非常活跃的研究领域,细分的方向也非常的多,接下来按照所针对的研究问题来分别介绍一些模型。
seq2seq生成模型