用 Tensorflow 搭建能理解语境的聊天机器人!

想掌握对话沟通,语境为王。

我们将使用Tensorflow构建一个聊天机器人框架,向大家示范如何实现上下文的语境处理。

有没有想过为什么大多数聊天机器人缺乏会话语境?

我们将创建一个聊天机器人框架,为一个小岛上的轻便摩托车租赁店建立一个对话模型。这家小店的聊天机器人需要处理营业时间,预订选项等简单问答。我们也希望它能处理客户根据上下文提出的问题,例如关于同一天租金的查询。体验能做好的话,可以让客户的假期留下美好回忆!

这将通过三个步骤实现:

  • 将对话意图的定义转换为Tensorflow模型
  • 接下来,构建一个聊天机器人框架来处理响应
  • 将基础的上下文语料,整合进响应处理过程

我们将使用tflearn,一个基于tensorflow的Python包。  一般用iPython notbook作为辅助工具

把会话意图的定义,转化为 TensorFlow 模型

第一步,完整的notebook脚本可以在这里找到。

聊天机器人框架框架需要一个能定义会话意图的架构。有一个简洁的实现方式,是使用JSON文件

每个会话意图包含:

  • 一个标签(唯一的命名)
  • 模式组(用于神经网络文本分类器的句子模式)
  • 响应组

稍后我们将添加一些基本的上下文元素。首先是导入的包:

如果是新手,看看“7行代码搞定深度学习”;如果还不清楚 TensorFlow 都能干啥,就看看这个

加载 JSON 会话意图文件后,现在可以开始设计我们的文件、词语和分类器的类。

我们创建了文件(句子)列表,每个句子是一个由词干组成的列表,每个文件关联一个意图(一个类对象)。

词干"tak"将匹配“take”,“taking”,“takers”等。我们可以清理词语列表,删除无用的词目。但现在这样处理就够了。

麻烦的是,这个数据结构不能用到Tensorflow,需要进一步转换:从由词语组成的文本转换成由数值型变量组成的张量。

注意我们的数据是被打乱了的。Tensorflow将取出其中一些数据,并将其用作测试数据,以衡量新拟合模型的精度。

如果我们看一个单一的x和y列表元素,我们会得到词袋数组,一个用于意图模式,另一个用于意图类。

现在可以准备建模了。

同样的张量结构,也用在了 'toy’ 例子里的2层神经网络上,观察理解这个模型拟合训练数据的过程,会一直有用。

要完成这一部分的工作,我们将保存('pickle')模型和文档,以便下一个notbook脚本可以调用。

搭建聊天机器人框架

第二步的完整notebook脚本看这里

我们将构建一个简单的状态机来处理响应,使用我们(从上一步)的意图模型作为分类器。这就是聊天机器人的工作原理

语境聊天机器人框架,是带状态机的分类器。

导入相同的库之后,我们 unpickle 模型和文件,并重新加载意图文件。注意,聊天框架与我们构建的模型是分开的。除非意图模式改变,否则不需要重建模型。由于有数百种意图和数千种模式,模型可能需要几分钟的时间才能建立。

接下来,我们将加载保存的Tensorflow(tflearn框架)模型。需要注意的是,首先需要定义Tensorflow模型需要的数据结构,就像上一节所述。

在处理意图之前,我们要想办法把用户输入生成词袋。这个技巧与我们以前使用过的训练文本相同。

现在可以建立响应处理器了。

每个传递给response方法的句子都被分类。分类器使用model.predict()并且非常快。模型返回的概率向量与我们的意图按顺序一一对应,生成潜在响应列表。

如果一个或多个分类结果高于阈值,就可以判断一个标签是否与意图匹配,然后处理。我们将分类列表作为一个堆栈,并删除栈顶来寻找合适的匹配意图,直到找到一个或者栈为空。

我们来看一个分类示例,返回值中最有可能的标签及其概率。

雷锋网(公众号:雷锋网)提醒,“你的店今天营业吗?”不是这个意图的模式之一:“模式”: [“今天营业吗?”, “今天什么时候开业?”, “今天的营业时间?”] ;而不管对应项“营业”和“今天” 多么适合模型(它们在选择的意图中是突出的)。

我们现在可以从用户输入中生成聊天机器人的响应。

以及上下文无关的其他响应..

让我们利用一些基本的上下文,实现我们聊天机器人的拖欠租赁谈话模型。

语境化

我们想要处理一个关于租赁摩托车的问题,并咨询租金是否今天到期。是非问题是一个简单的语境响应。如果用户回答“今天” ,上下文是租赁的时间范围,那么最好调取租赁公司编号1-800的问答响应。不占用时间。

为了实现这一点,我们将把“状态”的概念加入我们的框架。这包括用来维护状态的一个数据结构,和在处理意图时用来操作这个数据结构的特定代码。

因为我们的状态机的状态需要容易维护,恢复和复制等等,所以很重要的是要把它全部保存在像字典这样的数据结构中。

这是基本语境的处理过程:

我们的上下文状态是一个字典数据结构,它将包含每个用户的状态。我们将为每个用户使用一些唯一的标识(例如,元胞数)。这使得我们的框架和状态机可以同时维护多个用户的状态。

在意图处理流程中添加了上下文处理流程,如下所示:

如果一个意图想设值相应的上下文,则可以这样做:

如果其他意图想要与上下文相关联,则可以这样做:

以这种方式,如果用户刚刚输入“today”而与蓝色没有关联(无上下文信息),则我们的“today”意图将不被处理。如果他们输入“today” 作为对我们的Y/N问题(意图标签:“rental”)的回应,则意图被处理。

上下文状态更新了。

我们定义了“greeting”意图来简化上下文,就像通常的短对话一样。添加一个“show_details”参数来帮助我们理解其中的含义。

再试试输入“today”,这里有一些值得注意的...

首先,我们对无上下文相关的“today”的回应是不同的。我们的分类产生了2个合适的意图,而“opentoday”被选中,因为“今天”的意图虽然较高的概率,而被限制在不再适用的上下文中。语境很有用!

有一些事情需要考虑了,那就是下面的语境化...

带状态的状态模型

没错,你的聊天机器人将不再像无状态的服务端那么轻松愉快了。

除非要重置状态,重新加载模型和文档 - 每次调用您的聊天机器人框架时,那你都需要引入"状态"概念。

这个不难。可以在其进程中运行一个有状态的聊天框架,并使用RPC(远程过程调用)或RMI(远程方法调用)来调用,我推荐Pyro。

用户界面(客户端)通常是无状态的,例如。HTTP或SMS。

聊天机器人的客户端将调用Pyro函数,有状态服务来处理。看,惊不惊喜,意不意外!

这是一个构建Twilio SMS聊天机器人客户端的逐步指南,这里是FB Messenger的一个实现。

别把状态存到本地变量

所有状态信息都必须放在像字典一样的数据结构中,容易地持久化,重载或以原子复制。

每个用户的会话将生成上下文,这将为带有该用户状态的上下文。用户ID可以用他们的元胞数,Facebook用户ID或着其他唯一标识符。

有些情况需要(按值)复制用户的会话状态,然后作为意图过程来恢复。如果状态机在框架内带有状态相关的变量,那么在实际中难以有效的。

所以现在你有一个聊天机器人框架,一个有状态服务的方案,以及可以添加上下文的demo。以后大多数聊天机器人框架都将无缝地衔接上下文。

想想意图影响和反应不同上下文(语境)设定的创意方式。用户的上下文字典可以包含各种各样的会话上下文。

来一起愉快地玩耍起来!

====================================分割线================================

本文作者:吴楚

本文转自雷锋网禁止二次转载,原文链接

时间: 2024-07-30 05:24:49

用 Tensorflow 搭建能理解语境的聊天机器人!的相关文章

聊天机器人实力还是不行 咋能提升它们的知识水平

5月10日消息,据VentureBeat报道,自从电脑问世以来,科幻小说家们始终有这样的梦想:免提界面可对我们的任何问题作出回应,无需按下任何单键.现在,这样的未来正越来越接近现实,数十个行业的工程师们正努力设计能通过简单对话与人类互动的电脑和移动设备.这种技术被称为自然语言界面(NLI),苹果Siri.亚马逊Alexa.微软Cortana以及三星Bixby等就是典型代表,它们在接下来几个月将被应用到更多应用和程序中去. 然而众所周知,这些聊天机器人和自然语言界面也都存在"成长的烦恼"

清华大学黄民烈博士:如何让聊天机器人理解人类情感?

以微软小冰为代表的聊天机器人已经渗透到我们的日常生活中,虽然小冰会卖萌懂幽默,但距离真正的共情.理解人类的情绪还是有一定的距离.清华大学计算机系朱小燕.黄民烈老师团队今年的一项研究工作希望让聊天机器人具备这样的能力. 在这个名为 ECM(Emotional Chatting Machine:情绪化聊天机器人).基于深度学习的情感对话模型中,团队首次将情感因素引入了基于深度学习的生成模型中. 相关论文可查看<Emotional Chatting Machine: Emotional Convers

机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(三)| 干货

雷锋网按:本文是介绍用TensorFlow构建图像识别系统的第三部分. 在前两部分中,我们构建了一个softmax分类器来标记来自CIFAR-10数据集的图像,实现了约25-30%的精度. 因为有10个不同可能性的类别,所以我们预期的随机标记图像的精度为10%.25-30%的结果已经比随机标记的结果好多了,但仍有很大的改进空间.在这篇文章中,作者Wolfgang Beyer将介绍如何构建一个执行相同任务的神经网络.看看可以提高预测精度到多少!雷锋网(公众号:雷锋网)对全文进行编译,未经许可不得转

如何用TensorFlow训练聊天机器人(附github)

前言 实际工程中很少有直接用深度学习实现端对端的聊天机器人,但这里我们来看看怎么用深度学习的seq2seq模型来实现一个简易的聊天机器人.这篇文章将尝试使用TensorFlow来训练一个基于seq2seq的聊天机器人,实现根据语料库的训练让机器人回答问题. seq2seq 关于seq2seq的机制原理可看之前的文章<深度学习的seq2seq模型>. 循环神经网络 在seq2seq模型中会使用到循环神经网络,目前流行的几种循环神经网络包括RNN.LSTM和GRU.这三种循环神经网络的机制原理可看

机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(二)

这是Wolfgang Beyer一篇博文.详细介绍了如何使用TensorFlow搭建一个简单的图像识别系统.本篇将手把手地讲解搭建图像识别系统的全过程. 此系列文章主要介绍了不具备机器学习基础的用户如何尝试从零开始在TensorFlow上搭建一个图像识别系统.在文章的第一部分中,作者Woflgang Beyer向读者们介绍了一些简单的概念.本文为系列的第二部分,主要介绍了如何实现简单的图像识别功能.雷锋网编译,未经许可不得转载. 现在,我们可以开始建立我们的模型啦.实际上数值计算都是由Tenso

专家齐聚讲述人工智能时代的自然问答、聊天机器人与自然语言理解

在人工智能时代,以自然语言理解为核心技术的问答.对话.聊天机器人已经成为产业界和学术界的关注热点.其中的关键技术包括:自动问答.对话管理.自然语言生成.机器翻译.文本语义匹配.用户画像以及面向自然语言理解的深度学习等. 11月8-10日,由中国计算机学会CCF主办的学科前沿讲习班<自动问答.聊天机器人与自然语言理解>将邀请六位学术界和工业界的著名专家.学者对问答.对话.聊天场景下自然语言理解的基础理论.重要算法等热点问题进行系统的讲解.目的是为青年学者和研究生提供一个三天的学习和交流平台,帮助

预告:如何用 Tensorflow 搭建一套图像识别模块? | AI 研习社

自 2015 年 11 月首次发布以来,TensorFlow 凭借谷歌的强力支持,快速的更新和迭代,齐全的官方文档和教程,以及上手快速且简单易用等诸多优点,已经在图像识别.自然语言处理.语音识别.数据挖掘和预测等 AI 场景中得到了十分广泛的应用. 源于视觉对人类的重要性,在所有这些 AI 应用场景中,图像识别或许是最直观和受瞩目的一个.目前,通过众多 AI 从业者的共同努力,图像识别技术已经逐渐趋于成熟,在人脸和情绪识别.安防.医疗筛查和汽车壁障等诸多领域都取得了重大成功. 在这种情况下,对于

(转)一文学会用 Tensorflow 搭建神经网络

  一文学会用 Tensorflow 搭建神经网络   本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day 6: 快速入门 Tensorflow 本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,讲的很好,浅显易懂,入门首选, 而且在github有代码,想看视频的也可以去他的优酷里的频道找. Tensorflow 官网 神经网络是一种数学模型,是存在于计算机的神经系统,由大量的

Python AIML搭建聊天机器人的过程介绍

AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的.AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式. AIML的设计目标如下: AIML应当为大众所易学易会. AIML应当使最小的概念得以编码使之基于L.I.C.E支持一种刺激-响应学科系统组件. AIML应当兼容XM