博舍

RASA智能聊天机器人,理论与技术 智能聊天机器人项目的性能指标

RASA智能聊天机器人,理论与技术

一,智能聊天机器人

 

一种通过自然语言模拟人类进行对话的程序可以代替企业中相对固话、重复的人力密集型任务或流程

-问题咨询:基于业务知识库进行业务问题解答

-数据检索:纵跨各业务系统或数据库,检索数据或文档

-业务处理:对接相关业务系统转达指令,完成相应业务操作

典型业务场景∶

-业务咨询问答机器人、智能客服机器人、行政助理机器人、产品推荐机器人

….对外提供客户服务,对内进行业务辅助智能化的机器人可以带来全方位的效能提升,降本增效

------------------------------------------------------------------------------

聊天机器人的本质:会话式UI

提供了一种新的交互方式:会话式UI(CUI,ConversationalUserInterface)会话式UI:通过会话形式将已有数据、功能、服务展示给用户

目前聊天机器人分为两大类:基于检索 VS 生成模型

.尽管目前生成式模型是学术界的研究热点,但是在实践中使用检索模型是更加合适的选择

-------------------------------------------------------------------------------

趋势:会话式UI与业务集成

由于具有高度一致的基础:

--交互媒介(基于自然语言)

--交互模式(聊天会话)

不同系统的CUI具有高度可集成性业务会话式UI集成,一统各类业务系统,打造专属业务助理

----问题咨询、数据查询、指令执行、个人行政业务支持等等

  二,机器人核心技术

聊天机器人最核心部分是对话引擎,对话引擎包括:自动语音识别(ASR)自然语言理解(NLU)对话管理(DM)自然语言生成(NLG)文本到语音合成(TTS)本质是自然语言处理技术(NLP,NaturalLanguageProcessing)

--研究如何让计算机读懂人类语言,既要能让计算机理解自然语言文本的意义,也能以自然语言文本来表达给定的深层的意图、思想等。

--自然语言(中/En)→模型→机器能处理的数据形式(向量)

--模型通常经机器学习在大量数据基础之上归纳得到,反应了领域数据的规律

--向量中每个数值的大小、顺序编码了自然语言的语义信息

--基于NLP,计算机可以计算文本的相似度、提取其中关键信息、进行文本分类等

机器人原理

智能机器人是由多个子机器人(问答机器人,闲聊机器人,任务机器人等),人工后台以及文档库之间协作完成任务,最终选择最有答案进行返回

------------------------------------------------------------------------------

 

QA机器人   

假设用户输入问题为Q,QA数据库中的QA对为(Q1,A1)(Q2,A2)……(Qn,An)QQ相似度计算:计算Q’与每个QA对中问题的相似程度QA匹配度计算:计算Q’与每个QA对中答案的匹配程度综合相似度和匹配度,找到最合适的一组QA对(Qi,Ai)

本质:基于检索的问答模型

核心问题:文本语义相似度问题

文本相似度

解决1:

NN模型(RNN/CNN)

双层编码(Decoder)的长短期记忆模型(LSTM)

需要一定文本数量

解决2:

      拆分成子问题(小规模语料)

      短文本语义表征(TF-IDF,word2vec)

      语义距离计算(余弦COS,Feed-forwardNN)

QA机器人原理(QQ匹配)

原理:句向量化、相似度计算、相似度排序

 

word2vec------词向量化

doc2vec,bert-----句向量化

simbert---句子相似度

-------------------------------------------------------------------------------

闲聊机器人原理

闲聊机器人:主要是进行客观话题讨论,用户对聊天机器人进行一些情感表达,回答问候,情感和娱乐等信息

基于预置规则匹配:公司合规用语要求基于海量闲聊语料:满足大多数闲聊应答

可以用文本生成,对于回答的准确没什么要求

需求:简单闲聊,结果可控,快速开发

 

任务机器人原理

任务机器人(Task-Bot):基于意图识别与语义槽提取的任务机器人

意图识别关键参数提取多轮会话&对话管理 配置化对接外部系统

多轮会话—用插槽slot实现-----location,time时间地点都满足才会提交这个插槽

任务机器人原理:

意图识别设置可能问法槽值提取设置槽值和提示问法触发任务返回值提取和返回答案多轮对话上下文自动补全话题追踪

---------------------------------------------------------------------------

场景机器人原理

基于预置规则驱动完成场景任务事先根据业务制定好的,引导

KG机器人原理

基于知识图谱推理给出结果,也是基于检索机器人的一种

定义领域知识图谱模型提取表单条款导入知识图谱分析查询转换,图查询

---------------------------------------------------------------------------智能客服机器人   财富智能助手机器人   保险智能机器人    AIOps运维机器人

文章内容未更新完,会持续更新,个人理解。

构建自己的智能聊天机器人

Theanswertolife,universeandeverythingis42--deepThought

查看图片

今年的F8开发者大会,Facebook大谈他们看好聊天机器人的未来。通过这些聊天机器人,用户可以在交谈中完成许多任务,在线购物,航班查询、组织会议等。如此一来,用户再不必下载一堆app,而只需打开一个简单的文本对话框,你就可以对着它说:神灯神灯,我的第三个愿望是我还要三个愿望

你是不定想到了:hisiri

说不定又是一次用户入口的重新洗牌,这样就不难解释科技界的大公司们蜂拥而至了

缘起

我一直对自然语言处理(NLP)兴致勃勃,这大半年对机器学习/深度学习兴致盎然,而聊天机器人恰好结合了两者。

对聊天机器人最早的兴趣可能追溯到大学。当时关注过一段时间风靡人人网的小黄鸡,后来发现它只是调用了一个闭源的云服务,转而折腾AIML。

最近下班后喜欢到星巴克看看课程(近期在跟udacity的这门课:DeepLearning),写写博客,今天也是如此,怕往后的时间会更多花在深度学习上(对RNN尤其感兴趣),这几天陆续对折腾过的聊天机器人做个笔记

聊天机器人&开源框架

目前聊天这块的云服务倒是不少,facebook也好微软也好,都有自己的框架。相比而言,开源的项目倒是没有很耀眼的,也许是起步不久的原因,大神们还在憋大招。

我们到github逛一圈,发现ChatterBot看起来挺酷,项目活跃,文档清晰,代码也算干净利落。

由于项目还小,源码读起来十分容易,作为构建自己的智能聊天机器人的脚手架是不错的

ChatterBot

ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,可以从已有的对话中学习,该项目的设计允许它接入任何语言

原理

一个未经训练的ChatterBot机器人,并没有与用户交谈所需的知识。每当用户输入一句话,机器人将存下它,同时也存下答复的句子。随着机器人接受的输入的增加,它能够回答的问题的数量和准确度都会相应提升.程序是如何响应用户输入的呢?首先从已知句子中匹配出与用户输入最相近的句子(如何衡量相近,大家可以想想),之后找到最有可能的回复,那么如何得出最有可能的回复呢?由所有和机器交流过的人们,对这个输入问题(匹配过的)的各个回答的频率决定

安装和使用安装

pipinstallchatterbot

基本使用fromchatterbotimportChatBotfromchatterbot.training.trainersimportChatterBotCorpusTrainerchatbot=ChatBot("myBot")chatbot.set_trainer(ChatterBotCorpusTrainer)#使用英文语料库训练它chatbot.train("chatterbot.corpus.english")#开始对话chatbot.get_response("Hello,howareyoutoday?")复制代码采用中文语料库

我已经给这个填充了中文语料库,作者把我的提交合并到master了,目前还没有打包发布到pypi,如果你想使用默认的中文预料来训练你需要这样做:

https://github.com/gunthercox/ChatterBotpip3install./ChatterBot#需要使用python3,否则会有unicode问题,暂时没空做python2的兼容复制代码

使用中文语料库来训练机器人

fromchatterbotimportChatBotfromchatterbot.training.trainersimportChatterBotCorpusTrainerdeepThought=ChatBot("deepThought")deepThought.set_trainer(ChatterBotCorpusTrainer)#使用中文语料库训练它deepThought.train("chatterbot.corpus.chinese")#语料库复制代码开始玩耍print(deepThought.get_response("很高兴认识你"))print(deepThought.get_response("嗨,最近如何?"))print(deepThought.get_response("复杂优于晦涩"))#语出TheZenofPythonprint(deepThought.get_response("面对模棱两可,拒绝猜测的诱惑."))#print(deepThought.get_response("生命、宇宙以及世间万物的终极答案是什么?"))复制代码FAQ(非官方)默认配置

默认情况下,ChatterBot使用JsonDatabaseAdapter作为storageadapter,使用ClosestMatchAdapter作为logicadapter,使用VariableInputTypeAdapter作为inputadapter

只读模式

chatbot=ChatBot("wwjtest",read_only=True)//否则bot会学习每个输入

创建自己的训练类

chatterbot/training

创建自己的adapters

参考默认使用的ClosestMatchAdapter、VariableInputTypeAdapter即可

诸如我们可以写一个输入/输出adapters,对接到微信(我偏好werobot)

io的一个案例是chatterbot-voice(使用方法参考examples/example.py),这个adapters让我们可以使用语音与我们的机器人沟通,原理很简单,我此前折腾过BaiduYuyin,国内用户可以使用它

案例

参考examples,案例中已经有很多种机器人了

训练好的模型如何分发

训练好的数据,默认存在./database.db(参考jsondatabase.py),不是sqlite数据库,实际是jsondb,对json做了封装(参考jsondb/db.py)

算法相关

默认情况下,使用ClosestMatchAdapter作为logicadapter,用来找出与用户输入最接近的一句话

核心代码为:

fromfuzzywuzzyimportprocessclosest_match,confidence=process.extract(input_statement.text,text_of_all_statements,limit=1)[0]复制代码

这里我们用到了fuzzywuzzy,具体用法参考fuzzywuzzy#process

fuzzywuzzy用于计算句子直接的相似度,采用的字符串相似度算法为LevenshteinDistance(编辑距离算法)

LevenshteinDistance

编辑距离,又称Levenshtein距离(也叫做EditDistance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。(引用自维基百科)

从上述描述我们可以看出,这种算法适用于任何文字,而且我们使用process.extract时,使用中文不会影响相似度度量的准确性。当然我们也可以看出这种算法的缺陷,它无法理解语义的相似性,甚至连同义词都完全无法处理。这是一个十分明显的短板,有必要重新实现一套度量文本相似的logicadapter

fromfuzzywuzzyimportfuzzfuzz.ratio(u"你好",u"你好!")#80fuzz.ratio(u"你好",u"你好")#100复制代码其他算法

time_adapter.py中用到朴素贝叶斯:fromtextblob.classifiersimportNaiveBayesClassifier,这里也是目前唯一一处引用textblob的地方

接受的数据很简单,形如[("whattimeisit",1),xxx,xxx,...]

nltk的使用

目前主要用了nltk的word_tokenize、wordnet和stopwords

todo使这个项目能更适合训练中文语料库用其他的文本相似算法写一个logicadapter加入中文的停用词等(取代nltk的停用词)使用snownlp和jieba替代既有依赖(nltk和textblob)fork这个项目,采用它的架构,重写一个更适合中文的聊天语料库

聊天语料涉及隐私,网上几乎没有公开的中文语料,我们开脑洞:

siri对小冰(用wechatapi是对话可编程)柏拉图《对话录》论语坑

ChatterBot本身支持python2/python3,如果要使用中文,目前只支持python2

Python2中文问题出在:

statement_list=self.context.storage.get_response_statements()

得到的statement_list是编码错误的句子列表(编解码问题)

解决思路可以参考我的这篇博客:编码相关的笔记

结语

当前这个项目给出了一个漂亮的bot骨架,插件式的设计,十分利于插入强大的功能,这也是这个项目中我最喜欢的地方,就chatbot功能而言,功能比较简单、清晰

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇