聊天机器人

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊天机器人相关的知识,希望对你有一定的参考价值。

一、聊天机器人分类
(1)按功能分类可分为:问答型聊天机器人、任务型聊天机器人、闲聊型聊天机器人。

? ? ? 实现不同功能的聊天机器人所用技术也不尽相同,例如在做问答型聊天机器人时,我们需要提取问句中的焦点词汇,以此去三元组或知识图谱中检索,且为了提高检索的精度,常常需要对问句和关系进行分类操作。但是对于闲聊型聊天机器人则可以直接将其当做序列标注问题处理,将高质量的数据丢进深度学习模型中进行训练,最终得到目标model。

(2)按模式分类可分为:基于检索模式和生成式模式。

a.? ? 基于检索的模型,它使用预定义响应的数据库和某种启发式推理来根据输入和上下文选择适当的响应。换句话说就是构建FAQ,存储问题-答案对,之后用检索的方式从该FAQ中返回句子的答案。??这些系统不会产生任何新的文本,他们只是从固定的集合中选择一个响应。这种方法有明显的优点和缺点。 由于使用手工打造的存储库,基于检索的方法不会产生语法错误。 但是,它们可能无法处理没有预定义响应的场景。 出于同样的原因,这些模型不能引用上下文实体信息,如前面提到的名称。

b.? ? ?生成式模型,这种方法要更难一些,它不依赖于预定义的响应,完全从零开始生成新的响应。 生成式模型通常基于机器翻译技术,但不是从一种语言翻译到另一种语言,而是从输入到输出(响应)的“翻译”。

这方法有明显的优点和缺点。它可以引用输入中的实体,给人一种印象,即你正在与人交谈。 然而,这些模型很难训练,而且很可能会有语法错误(特别是在较长的句子上),并且通常需要大量的训练数据。

(3)按领域分类可分为:开放领域和封闭领域。

a.? ? 开放领域的chatbot更难实现,因为用户 不一定有明确的目标或意图。??像Twitter和Reddit这样的社交媒体网站上的对话通常是开放领域的 - 他们可以谈论任何方向的任何话题。 无数的话题和生成合理的反应所需要的知识规模,使得开放领域的聊天机器人实现相当困难。同时这也需要开放域的知识库作为其知识储备,加大了信息检索的难度。

b.? ? 封闭领域的chatbot比较容易实现,可能的输入和输出的空间是有限的,因为系统试图实现一个非常特定的目标。 技术支持或购物助理是封闭领域问题的例子。 这些系统不需要谈论政治,只需要尽可能有效地完成具体任务。 当然,用户仍然可以在任何他们想要的地方进行对话,但系统并不需要处理所有这些情况 - 用户也不期望这样做。

二、聊天机器人技术之语义相似度计算
? ? ? ?在基于检索模式的聊天机器人中,我们常需要计算问句与FAQ中的问题集合的相似度,现根据自己的经验介绍几种文本相似度计算的方法:

(1)最长公共子序列

? ? ? ?该方法思路较为简单,直接使用最长公共子序列算法,设字符串A长度为L1,字符创B长度为L2,它们的最长公共子序列为lcs,那么这两个字符串的相似度的度量为sim=2*lcs/(L1+L2)。

(2)向量相似度计算

? ? ? ? 这种方法思路同样较为简单,将两个字符串进行分词转换成空间中的向量点,计算两个文本的余弦相似度或欧氏距离即可。

(3)编辑距离

? ? ? ?编辑距离是两个字串之间,由一个转成另一个所需的最少编辑操作次数。详情可以参考链接。

(4)CNN计算文本相似度

a.? ? ?为什么用cnn进行文本相似度计算

? ? ? ?这是因为传统文本相似度算法,侧重于文本本身的相似度计算,因此需要大量的归一化的过程,例如中文数字和阿拉伯数字的归一化,中英文 单位的归一化(例如kg和千克)。但是即使通过归一化的方法,仍然有很多语义相似文本无法通过这种方法得到满意的结果。比如两道数学题, 题1 = ‘一个苹果+二个苹果等于多少个苹果?‘, 题2=‘一个香蕉+二个香蕉等于多少个香蕉’,显然这两道题语义是高度接近的,但是用传统的文本相似度计算方法,计算得到的相似度是非常低的,这不能满足现代互联网或其他领域对文本语义相似度任务的需要,于是需要使用cnn和词向量的方式来计算文本语义相似度,这是因为词向量的固有特性。换言之,文本相似度计算不仅仅计算两个字符串在物理意义上的相似度,还计算文本的语义相似度,而这时因为词向量固有的特性。

? ? ? ?简要介绍下上面的图,第一层数据输入层,将文本序列展开成词向量的序列,之后两个不同的输入流 ,这里因为有两个输入(字符串A和字符串B),垂直方向则放置了2个完全一样的层组合(卷积层、激活层、池化层的组合)。之后连接全连接层和激活层,激活层采用sigmoid并输出该文本属于某类的概率,这个输出的值是个0-1之间的浮点数,该值代表 文本A和文本B的相似程度,值越大相似程度越大。

? ? ? ?全连接层的目的是什么呢?因为传统的网络我们的输出都是分类,也就是几个类别的概率甚至就是一个数--类别号,那么全连接层就是高度提纯的特征了,方便交给最后的分类器或者回归。

三、聊天机器人技术之序列标注问题
? ? ? ?聊天机器人的生成时模型可以看成机器翻译的序列标注问题,即将问句encode之后得到隐状态h,将这个隐状态作为decode的输入,最终返回问句的答案。下面介绍一下seq2seq的原理,该模型最早出现在2014年发表的论文Sequence to Sequence Learning with Neural Networks。模型图:?:

? ? ? ?可以看到该模型从输入到输出有一条完整的流,:ABC为encoder的输入,WXYZ为decoder的输入。将encoder最后得到的隐藏层的状态ht输入到decoder的第一个cell里,从整体上看,从输入到输出像是一条“线性的数据流”。本文的论文也提出来,ABC翻译为XYZ,将encoder的input变为“CBA”效果更好。即A和X的距离更近了,更有利于seq2seq模型的交流。

? ? ? ??具体来说,encoder的过程如下图,是基于LSTM的,当然也可以基于RNN。

decoder的阶段:

? ? ? ?得到encoder的最后一个时间步长的隐层ht以后,输入到decoder的第一个cell里,然后通过一个激活函数和softmax层,得到候选的symbols,筛选出概率最大的symbol,然后作为下一个时间步长的输入,传到cell中。(即当前的输出作为下一个状态的输入)这样,我们就得到了我们的目标(1)。

seq2seq with attention

? ? 我们前面提到,距离decoder的第一个cell越近的输入单词,对decoder的影响越大。但这并不符合常理,这时就提出了attention机制,对于输出的每一个cell,都检测输入的sequence里每个单词的重要性。即论文NEURAL MACHINE TRANSLATION?BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。attention在NMT基于seq2seq的改进模型再进行改进,原理如下:

? ? ? 上图中,encoder和decoder都发生了变化。首先说encoder,使用了双向RNN,因为希望不仅能得到前向的词的顺序,还希望能够得到反向的词的顺序。使用hj→hj→代表hj前向的隐层状态,hj←hj←代表hj的反向隐层状态,hj的最终状态为将两者连接(concat)起来,即hj=[hj→;hj←]hj=[hj→;hj←]。详情请参考链接。

三、聊天机器人技术之其他问题汇总
? ? ? ? 在参加了2018中文信息学会ATT前沿技术暑期班时,有幸听到了香侬科技的李纪为老师的讲座,现就讲座内容做简单的整理:

(1)针对于检索模型的聊天机器人,当FAQ中没有合适的答案,我们返回的是FAQ中与问句最相近问句-答案对中的问句,而不是答案,这样做的目的是为了从提问者处得到更多的问句信息,便于返回给其正确的答案。

(2)互信息解决泛化回答,当用seq2seq训练聊天机器人模型的时候,会产生很多无聊的信息,其原因可能是训练预料多为电影对话集合,质量不高。例如

机器总会回答一些“万能文本”,不利于聊天的开展,解决这些问题,人为添加规则的效果不大,现阶段大多用强化学习来解决这一痛点,也就是开放域多轮对话中每一轮回复的选择,不仅需要考虑是否能够有效回复当前输入,更需要考虑是否有利于对话过程的持续进行,让聊天持续更久一些,我们可以采用互信息的方式来解决这一痛点。

? ? ? ? 第一种思路,seq2seq框架解决。改变在于,从传统的最大似然法的优化目标函数(^R = arg max_R{log p(R|M)})改为最大互信息的目标函数(^R = arg max_R{(1-lambda)log p(R|M) + lambdalog p(R|M)}),其中R和M分别代表Response和Message。新的目标函数除了最大化从Message生成Response的概率,也加入了反向优化目标,即互信息,这个目标函数不仅要考虑哪个R出现概率更大也要考虑M和R的密切相关,从而降低常见回答的生成概率【还是得实际看看效果】。

(3)用户一致性问题(同样的问题,不同的回答),

? ? ? ?对于个性化问题比如爱好,年龄可能多次提问回答不同,这就是个性信息的一致性问题。经典的seq2seq模型训练的聊天机器人就有这样的问题,因为seq2seq模型训练用的是单句的Message和单句的Response的映射关系,没有统一维护个性信息。此外,每个用户喜欢的聊天机器人的聊天方式可能不同,也就是说不同个性的用户可以使用与之聊天方式类似的聊天助手。

? ? ? ?一种思路,seq2seq的结构,但是每种身份对应一种word embedding,把聊天助手的个性信息导入到解码decoder的过程中(每个t时刻,LSTM除了标准的输入,也将身份个性化的word embedding信息输入,得到的生成结果就会倾向于符合身份特征的个性化信息。

? ? ? ? 总之,核心思想是把个性信息在decoder阶段加入体现出来,维护个性一致。

(4)问句长连接

? ? ? ?我们回答一个问句的时候,可能需要考虑其上面n次交互信息,那么这就需要神经网络模型能够记录其历史问答信息。解决这一问题的常见思路是在seq2seq模型中,加入Attention机制。

(5)聊天机器人循环体

以上是关于聊天机器人的主要内容,如果未能解决你的问题,请参考以下文章

自动聊天机器人项目班 [一门课搞定聊天机器人]

自动聊天机器人项目班 [一门课搞定聊天机器人]

ChatGPT-聊天机器人

如何优雅的用Python玩转语音聊天机器人

自己动手做聊天机器人教程

ChatGPT 多个可用的聊天机器人