聊天机器人:理论与实践

聊天机器人周围有很多毛茸茸的东西,所以我写了这篇文章来介绍基础知识。 我首先回顾一下对话理论,以使我们对目标明确。 然后,我讨论三类聊天机器人。 最简单的类是无目的的模仿代理,它仅提供对话的幻觉。 该课程的成员包括ELIZA和基于深度学习序列到序列模型的聊天机器人。 第二和第二最高级的类别包括基于意图的代理,例如亚马逊的Alexa和苹果的Siri。 这些代理人了解得很简单,可以做些真正的事情,但是他们通常不能进行多轮对话。 第三类也是最复杂的类,是对话代理,可以跟踪对话中所说的内容,并可以在人类用户需要时切换主题。

对话始于共享参考。 我们指向世界上的对象,以便我们和我们的对话伙伴知道我们在谈论相同的事情。

除了单词和句子的含义外,对话本身也有自己的规则。 考虑一下格莱斯(1975,1978)的对话格言:

数量格言 :仅说没有暗示的内容。 是:“将积木带给我。”否:“将积木运送到我的位置,将积木带给我。”

质量准则 :只讲真实的话。 是:“我讨厌携带积木。”否:“我喜欢携带积木,尤其是当它们被火蚁覆盖时。”

相关性格言:只说重要的事情。 是:“给我带来障碍。”否:“给我带来障碍,鸟儿会唱歌。”

格言格言 :以一种易于理解的方式讲话。 是:“将砖块带给我。”否:“用个人强力将砖块悬浮起来并将其运输给我。”

打破这些规则不仅是传达单词含义的一种方式。 Wikipedia在这里有一个不错的摘要。 当我们打破格言时,可以认为这是出于某种目的。 例如,当我说“我喜欢携带积木,尤其是当它们被火蚁覆盖时”时,我打破了用讽刺来传达我不喜欢携带这些积木的质量准则。 再举一个例子,如果有人问我鲍勃作为一名员工有多好,并且我回答说他的头发很漂亮,我正在通过打破相关准则来传达一个想法。

用于将语音转换为文本的系统最近变得非常好,例如在这里和这里,我们将在本文中很大程度上忽略这一方面,但是有时含义甚至不在文本中而是在单词的发音方式(称为韵律 )。 考虑以下三个示例,这些示例取自Giangola和Balogh(2004)的“ 语音用户界面设计” 。 强调斜体字。 基于重点,每个示例都表示不同的内容(随后说明)。

  1. 你懂。 不知道 [所以不要问我。]
  2. 你懂。 我不知道 [事实上,我确实没有。]
  3. 知道我不知道 。 [你知道我不知道。]

对话真的很难。 尤瓦尔·诺亚·哈拉里(Yuval Noah Harari)在他的《 人类报》(Homo Deus )中辩称,我们的合作能力使人类得以占领地球。 能够与机器对话将使我们能够进一步与我们创建的这种新型智能进行合作。 现在让我们将注意力转移到最新技术上。

我们将依次研究聊天机器人的三类:无目的模仿代理,基于意图的代理和会话代理。

无目的模仿剂

无目的的模仿代理人看上去很不了解谈话内容。 我们都听说过ELIZA。 ELIZA由简单的替换规则组成,以模仿1960年代的心理学家。 这是行为主义之后出现的心理学,通常被表征为让治疗师重复病人的话。 如果患者说:“我母亲要我买火箭筒。”治疗师可能会回答:“告诉我为什么你母亲要你买火箭筒。” ELIZA可以进行这种交谈。 您可以在此处找到ELIZA的Python实现。

现代模仿者使用深度学习从示例对话中学习。 他们在一系列对话框上进行训练,并根据给定的最后一条语句学习生成下一条语句。 那里有很多对话框数据集。 您可以使用来自电影和电视字幕的对话框示例,例如OpenSubtitles。 还可以使用Ubuntu Dialog Corpus,这是需要技术支持的人们的对话。 或者可以使用Twitter挖掘Twitter并寻找对推文的回复。

用于此鹦鹉的深度学习方法通​​常是序列到序列模型。 序列到序列模型由编码器和解码器组成。 编码器将一系列标记(例如由单词标记组成的句子)转换为单个向量。 解码器从此向量开始,并一直生成令牌,直到生成特殊的停止符号。 请注意,源序列和目标序列的长度不必相同。 编码和解码都是使用递归神经网络(RNN)完成的。

序列到序列模型的最初大应用是语言翻译(Cho等,2014)。 例如,一个人将拥有一组英语来源句及其相应的西班牙语翻译。 然后,该模型将学习将英语中的源句子编码为向量,然后将该向量解码为西班牙语中的相应句子。 为了生成对话,序列到序列模型将语句作为源语言,例如“您好吗?”,并将响应作为目标语言,例如“我很棒!”,如下所示。

序列到序列模型的问题在于它们没有意义。 它们可以解决将序列转换为另一序列时可能遇到的任何类型的问题,但是它们不会使用任何特殊的机制或知识来进行语言理解。 对聊天机器人使用序列到序列模型(对于聊天机器人通常使用深度学习)的另一个问题是它们对细节不敏感。 如果我要它给我买14只鸡,它并没有把14号鸡当成特殊鸡,它可能也可以给我买140鸡。

最新的序列到序列聊天机器人使用生成对抗网络(GAN)。 GAN具有一个鉴别器,该鉴别器试图辨别所生成的响应是来自真实对话还是由模型生成。 GAN在图像处理中风靡一时,但对于语言而言,它们仍在进行中。

基于意图的代理

基于意图的代理将语言理解为命令,并且他们利用这种理解来执行任务。 基于意图的代理的示例包括亚马逊的Alexa,Google Home,苹果的Siri和微软的Cortana。 理解我们所说的命令语言需要解决两个问题:

  1. 识别用户希望机器做什么(“意图”)。
  2. 弄清楚意图的细节,以便机器可以采取措施。

例如,如果我们要求助手播放史蒂夫·温伍德,则助手首先需要了解我们希望它播放音乐(意图),然后它必须了解尤其是我们想听到史蒂夫·温伍德(细节)。 )。

考虑下面有关确定意图的示例。 当用户询问鸡肉时,机器必须确定其四种功能中的哪一项与人的意图相符。

助手可以使用关键字或基于文本的分类来确定意图。 要使用关键字,您只需将单词和短语与意图相关联。 要进行基于文本的分类,请使用正确的意图标记一堆语句,然后在它们之上训练分类器。 您可以在Python库scikit-learn中使用词袋表示来训练分类器,如此处所述。 如果您有大量标记数据,则学习意图的另一种选择是将TensorFlow中的深度学习与卷积神经网络(CNN)结合使用。 可以在此处找到实现。

代理确定意图后,在我们的示例中是订购杂货,它需要将语句详细信息转换为机器可读的形式,例如Python字典,如下所示。

具有这种字典形式的命令称为框架和插槽语义,其中框架是主题,插槽是各个功能和值。 一旦有了机器可读的表格,计算机就可以按照其所需的方式进行处理,就像其他任何指令一样。 这是自然语言的理解。

进行自然语言理解的一种方法是使用无上下文语法(构成语义)。 上下文无关文法由生产规则组成,生产规则的左侧有一个非终结符,而右侧的字符串则可以由终结符和非终结符组成。 对于每个生产规则,我们都添加一个语义附件。 下面显示了一组示例规则。

非终结符以“ $”开头。 第一条规则说,订单包括购买意向以及该商品的数量和金额。 该规则的语义通过$ Purchase(s [0])的语义与$ ItemAmount(s [1])的语义的字典联合来组合。 下一条规则表明购买意图由is_purchase函数确定,如下所示。 (当然,这是描述一组规则的一种紧凑方式。即,一个在右侧带有“让我来”,另一个在带有“购买”时在另一个,而“请给我一些”。)

下一条规则说$ ItemAmount由$ Amount和$ Item组成,它们在以下两个规则中定义。 这两个规则使用了get_item和get_number函数,如下面的示例形式所示。

这些规则中的每一个都在末尾具有关联的语义。 我们使用解析将这些生产规则应用于文本以获取语义。 使用自底向上的动态编程进行解析。 动态编程包括解决子问题,然后一次又一次地重复使用这些解决方案。 解析过程通过查看单词对来建立解析,对于每对单词,解析过程循环遍历它们之间的所有n个可能的单词。 由于解析算法处理成对的子解析,因此上面的每个生成规则在右侧具有单个终端或两个非终端。 如果您的语法不是这样(但在每个生产规则的左侧仍然有一个非终结符),这不是问题。 您始终可以将无上下文语法转换为这种形式(称为Chomsky普通形式)。

下图显示了解析算法考虑单词对时的顺序:从“获取”到“获取”,然后从“我”到“我”,然后从“获取”到“我”,然后从“十四” ‘到’十四’等。

下两个图分别显示了在每个时间点调用的生产规则和语义。 例如,在方框8中,我们正在查看从“十四”到“鸡”的单词。 这对应于左侧带有$ ItemAmount的规则,该规则来自框4(“十四”的解析)和框7(“鸡”的解析)。 框9将框8和框3组合在一起,以调用$ Order在左侧的规则。

当然,解析器还会尝试许多不符合任何规则的其他组合。 通常,如果句子中有n个单词,语法中有R个生成规则,它将尝试n * n个框,并在每个框之间查找n个框,从而尝试应用R个规则中的每一个。 总的来说,运行时间约为n * n * n * R。 通常,可以有许多有效的解析,并且可以使用评分算法来选择要使用的解析。

作为SippyCup库的一部分,Python中提供了用于创建语法和运行解析器的代码。

对话代理

对话代理在基于意图的代理上进行扩展以进行多轮对话。 为此,他们必须跟踪对话的状态,并知道该人何时想谈论其他事情。

对话式代理尚未普及,但可以想象像我在此描述的那样一种代理。 代理人将一生陪伴一生。 当一个人还是个孩子的时候,它就开始作为伴侣,它将作为父母设备上的手机应用程序生活。 它会有一张卡通脸,可以了解孩子并教给她有关世界的知识。 例如,如果探员知道孩子喜欢长颈鹿,可以用它来教她的数学。 “如果您有7头长颈鹿,又购买了3头长颈鹿,那么您将拥有几只?”它还可以帮助消除认知偏差和低估未来。 “如果您今天吃巧克力熊,那么当您不再拥有巧克力熊时,明天会感觉如何?”

该应用程序的开发人员将在幕后疯狂地工作,随着孩子的长大,代理人将变得更加成熟。 当孩子成年后,代理将成为她的操作系统。 它可以提供生活中的循序渐进的方向,例如指导她如何安装喷水灭火系统。 特工长大后可以担任她的助手。 想象一下,她站在厨房里,不记得如何煮咖啡了。 该应用程序可以在她的家里使用相机,并可以指导她完成整个过程,从而使她可以独立生活更长的时间。

诸如此类的对话代理需要对话管理器来处理长时间的对话。 对话管理器必须带领人员完成聊天机器人想要谈论的所有事情。 例如,它可能首先想教孩子数学技能,然后可能要谈论太阳系。 对话管理器还需要识别她何时想谈论其他事情,并将当前主题排队以便稍后使用。

来自CMU的RavenClaw可能是最著名的对话管理器(请参阅Bohus和Rudnicky,2009)。 RavenClaw由对话代理组成, 对话代理是按层次结构组织的,对应于对话的不同部分的小程序。 例如,可能有一个关于烹饪的一般对话代理,希望讨论与准备食物有关的多件事。

RavenClaw有一个对话栈和一个期望议程 。 对话栈是对话代理程序的堆栈,用于跟踪聊天机器人想要谈论的所有事情。 期望议程是一个数据结构,用于跟踪聊天机器人期望听到的内容。 例如,如果孩子说“是”,那么她可能没有像雨人一样回答三十分钟前的问题。 答案可能对应于所问的最后一个问题。 但是如果她说:“我记得! 土星是一个有环的人!”她可能在谈论上一个话题,期望管理者需要将话语与所有期望相匹配,以找到合适的期望。

在对话框执行期间,RavenClaw在执行阶段输入阶段之间切换。 在执行阶段,它调用对话框堆栈上的顶级对话框代理,并使其对话。 它还设置了机器期望在期望议程中听到的内容。 在输入阶段,RavenClaw处理人员所说的内容并更新其知识,以用于确定哪个对话代理可以在执行阶段进行响应。

考虑下面带有对话框堆栈和期望议程的示例。

  1. 聊天机器人刚刚问完,“ 4 + 5是什么?”
  2. 孩子说:“你喜欢弗卢弗斯先生吗?”
  3. Chatbot回应:“非常好。 他是你的最爱吗?”

聊天机器人期望听到关于数学问题的答案,这就是为什么“ 9”是期望议程的重中之重。 孩子却说了完全不同的话,因此该算法搜索期望议程以寻找她可能在说什么。 发现她在谈论玩具。 然后,聊天机器人可以将谈论玩具的内容移到对话框堆栈的顶部,因此它可以生成适当的响应,例如“非常好。 他是您的最爱吗?”聊天机器人还将修改期望议程,以使其与期望听到的有关此新问题的答案相匹配。

RavenClaw不是基于机器学习的,但是我们可以选择使用基于学习的方法来构建对话代理。 我们可以将创建对话代理视为强化学习(RL)问题(Scheffler和Young,2002)。 强化学习问题发生在马尔可夫决策过程(MDP)内,该过程由一组状态,动作和奖励函数组成,该奖励函数为处于状态s和采取动作a提供奖励

在聊天机器人的上下文中, 状态 机器人知道的东西(它回答的问题),机器人说的最后一句话以及用户说的最后一句话。 行动在做出特定的陈述,而奖励则来自达到目标状态,例如孩子对数学问题给出了正确答案,或者在另一个领域中成功完成了旅行预订。

我们可以使用强化学习来学习一种策略,该策略可以使处于状态最佳行动成为可能 可以想像,学习一项政策需要大量的培训,而且很难付钱让人们坐下来与代理人交谈以产生足够的经验,因此研究人员以模拟的经验来培训他们的代理人(Scheffler and Young,2002)。

在聊天机器人上使用学习还有一个额外的问题。 由于语音到文本的错误或理解的错误,很难确切地知道代理所处的状态。 例如,孩子是想谈论自己的玩具,还是在告诉经纪人它应该更柔软? 这种不确定性要求建立部分可观察的马尔可夫决策过程(POMDP)(Young等,2013)。 在POMDP中,代理不知道其处于什么状态,而是在可能处于的状态上进行分配。这些类型的代理仍处于试验阶段。

让我们将聊天机器人的当前状态与我们的理论进行比较。 我们从共享参考开始,这确保我们在谈论同一件事。 只要我们将讨论限制在一组已知的事物上,共享引用就很容易实现。 同样,可以将单词含义的共享约定编程为基于意图的代理或会话代理。 然后,我们撞墙。

我们所编码的含义并未映射到主体中的扎根的感觉或行动。 当我们引用一个对象时,代理从来没有像现实世界那样持有或使用过该对象。 这意味着对它的理解将受到限制。 我之前提到过有人用重光束伤害背部的想法。 计算机对这种情况的可能理解仅限于逻辑推理,这导致两个缺点。 首先是逻辑推理出奇地困难。 推理本身已广为人知,但很难设置规则以进行所有相关的推理。 第二个缺点是代理人的理解力很低。 计算机只能理解填充有值的变量,而不会感到痛苦。 我写了一篇关于如何通过让代理商模拟我们在世界上的经验来解决这个问题的文章,但是我们在这方面还有很长的路要走。

更坏的消息是,聊天机器人的含义在很大程度上是固定的,因此我们目前无法在话语金字塔中与它们协商含义。 已经进行了实用性研究,例如Grice的格言,但是我不知道有任何准备在通用代理上实现的工作。 韵律也是如此。 我们还有很长的路要走。

总而言之,当前的最新状态是我们可以将知识内置到聊天机器人中,聊天机器人可以将其用于与我们合作进行需要最少了解的任务。 建立更好的聊天机器人将需要进行知识工程和研究,以研究代理如何更好地遵循和适应含义和对话的微妙之处。


如果您喜欢视频,我 在这里 介绍了许多相同的内容