当前位置:   article > 正文

【小贝出品】定制你的对话机器人 - 基于RASA搭建_languagemodelfeaturizer

languagemodelfeaturizer

【小贝出品】定制你的对话机器人 - 基于RASA搭建

 

源代码 Hands on Setting Up Develop Environment

Open Custom Connector More Concept 工程上的处理

  • Tracker Store

  • Event Broker

  • Model Storage

  • Chitchat and FAQs Asignment 自己的机器人,并且使用active serve去实现对话机器人天气查询功能

RASA

  • What's the weather like tomorrow

  • nlu- DM对话管理(RASA中叫core)拿出来是action-送到NLG(生成对话语言)

  • intent(weather query)

  • entity (tomorrow)实体,与slot区别

变成slot存储到对话机器人当中,slot和entity内容是一样的,slot是一个记忆,保存到记忆当中

core模块,RASA中是用story描述的对话流程,一个intent,对话机器人做什么样的action

两种情况让有slot:

  1. 从用户说的话当中识别实体

  2. 作为程序员在代码中注入进去

Setting up Rasa Source Code

Rasa代码写的非常好,不仅是对话机器人;很多工程上的,比如如何写代码,如何写规范的代码;都很值得学习 工程师的艺术感,工匠精神:不仅仅实现功能,同样让代码具有美感;自己写起来也会非常享受,不是搬砖拼凑起来实现功能,而是设计艺术品,值得品鉴的东西。所以学习Rasa工程上的知识

图片

用poetry做包管理,可以把项目需要哪些包,这样的文件记录好,是更先进的包管理工具

  1. 把包下载之后, python get-poetry.py

  2. pycharm提供了类似anaconda的工具,可以去管理poetry去管理环境;但不是官方默认,需要安装第三方插件 poetry.lock记录了其依赖的包

  • poetry install 会自动把其以来的包全都安装好;不像用pip和anaconda是基于pip和anaconda版本来判断;而poetry完全是一致的,类似于yarn和npm;不会出现版本冲突的问题;这也是为什么Rasa选用它做管理。会自动检测到当前项目下面需要的第三方包,并自动升级和补充缺少的包。出现网络问题:科学上网或多上几次

  • 你可以贡献给Rasa也可以贡献给xbot,xbot也是用poetry做包管理

  • poetry和pip不一样的是,它添加包的时候不是install 而是add poetry add fastweb

  • poetry和anaconda不冲突,是类似的东西,区别就在于管理机制不太一样

每个环境都隔离的,A环境安装的包,B环境也没有,(anaconda虚拟环境里的包,在pycharm里面配置,显示不出来)anaconda和poetry都是这样。区别在于anaconda会依赖于一系列其他的包,会有内部版本的机制,选择哪个版本去安装;而poetry完全按照用户怎么去定义

 

Optimize NLU

  • 每一个管道都串起来、连起来;串行的、管道式的;

  • 用户的一段话- componentA第一个组件- ComponentB- ComponentC;将来可以自己开发自定义的component

  • 整个过程是为了寻找到intent和entity

  • 图片

  1. 让对话机器人理解能力先提升,理解的程度在于识别intent更准确,识别entity也更准确

  2. NLU的过程其实是通过pipeline机制去做的,pipeline机制会有很多类的名字,这些类的名字是怎么回事呢?

我感觉rasa训练很快,其实Rasa用了预训练模型 接口类:

  1. 在定义pipeline时结构就是串行结构

  2. 在pipeline又封装了几种概念,用哪些种方法去做事情。因为分的很细,能看字面意思(比如Tokenizer),把nlp里常规操作流程通过pipeline形式定义了出来

分词:WhitespaceTokenizer 用空格符做分词(对中文来讲没有任何用处;中文- JiebaTokenizer,供中国用户使用nlu功能)

  • MitieTokenizer 常用的包,提供了一些分词、实体抽取、文本分类的方法,更多的使用于英文场景

  • SpacyTokenizer,也是非常好用的nlp库,但是官方不支持中文、 去找,用它的方式去加载,可以指定一个模型,把那个模型加载尽量;使用Rasa时用jieba做分词

对话机器人涵盖了nlp所有东西目前中文分词工具最好的:hanlp,也是xbot里使用的工具 

featurizer 把中文转换成embedding的形式

  • SpacyFeaturizer

  • ConveRTFeaturizer被废弃

  • LanguageModelFeaturizer语言模型当成模型的一个feature;如果能找到中文LanguageModel,pre-train的模型(如bert,支持bert图片

图片

),是可以的

 

  • RegexFeaturizer 定义一句话,会用正则去描述这句话,把正则当成feature,试图学习到语言的信息;只对英文又好的作用,对中文反而把nlu搞得很惨,反而识别不到

  • CountVectorsFeaturizer n-gram 不能配置

  • LexicalSyntacticFeaturizer 把语法信息加进去,能否得到比较好的分类;英文友好,中文不友好 能用的可能就俩

 

Improve NLU- Pipeline Approach

一)Intent Classifiers 意图分类;也提供了一些可选择的组件 通常的选择:

  • MitintentClassifier 不推荐,麻烦

  • SklearnIntetnClassifier 适用于数据量小,优点就是速度快,需要的数据不多

  • KeywordIntentClassifier 关键字,去对应到意图上,回到传统时代,通过规则识别到某些关键字,用处不太大

  • DIETClassifier Rasa默认到Classifier,使用dual intent entity transformer;讲到模块,每一个模块,会结合rasa每一个模块去讲;推荐!后面讲nlu模块会详细讲解

FallbackClassifier

一方面识别到,另一方面没识别到,不在intent范围内,主要帮我们解决,如果只写了很多意图,但是用户说的话确实不在intent里面,对用户不友好,fallbackClassifier先识别一下意图是否在定义的意图空间里面,在的话再用别的classifier;不在的话就告诉不支持:作为异常情况引导的分类

Q:这些classifier是模型吗?

- 对,就是一些深度学习的模型 

Q:Fallbackclassfier是与其他分类方法独立的还是包含的?

是先要用fallback然后再用其他分类方法DIETclassfier-先做是否在意图空间内,

图片

通常放在前面一些,先做fallback识别,再做其他识别

Rasa自己不做训练,都是用开源模型 end2end:问题--空间太大,完全基于语料做生成,不可控;因为对话机器人要跟用户接触,不可控,所以工业界不用,在研究领域比较热,最后一节课会讲一讲end2end模型

二)实体识别

  • ……

  • SpacyEntityExtracter

  • 图片

  • 有人名、国家名、建筑名……看需要识别哪些实体,写到里面去,如果不写的话,默认全部都识别;但是全部都识别,会导致模型相对慢一些;如果能定义好自己的空间,模型相对快一些。不支持中文

  • CRFEntityExtractor

  • DucklingTHTTExtractor

  • DIETClassifier 不仅仅把分类做完,同时把实体识别也做出来,联合joint,这种模型任务更难,准确率更精准 Combined Intent Classifier 既能得到entity也能得到intent。支持中文以上是nlu的一些组件,components;通过pipeline把它们串起来,更好地

Choosing the Right components 怎么选择正确的组件(best practice) 对于中文的用户,可选择不多 对于英文用户,优先选择spaceTokenizer

选择feature主要方式是看数据量

图片

此图帮助选components组件: 

1)先看是否有pre-train模型 

2)对应language model 

3)一句话是否有两个意图的情况;

 4)如果没有,有没有专业领域的词,domain specific terms 专业词,pre-train的模型 embedding并没有做很好,很多这样的专业名词,

 5)有没有很多这样的数据,有没有用深度学习的方式去做,如果没有那么多数据去训练专业名词,则用sklearn

Intent Recognition常见问题 :

1) lack of training data

2) out-of-vocabulary words 并没有见过用户所说的词(生词),第一种方法是增加语料,使语言模型泛化能力更强;第二是使用embedding/pre-train的模型,已经学习到语言里面的特性,有相对好的泛化能力,大量减少oov现象 

3)similar Intents 定义意图意思太相近,导致分类的不准确,碰到这样的情况,首先看能不能把这两种分类做合并,成一个意图,看看能否在实体部分做区分;在设计意图的时候去考虑 4)skewed data 容易出现数据不均衡;模型偏向于语料比较多的意图;不要出现语料不均的问题

 Q:多少语料算多,多少算少。

--比如先十条,baseline,看是否能达到要求,比如都能达到80%以上,可以先分享出去,给到测试人员,让测试人员做测评工作;不停迭代,同时收集很多很多语料,语料越来越多。然后上线去做,线上又收集到很多数据,再去做,不停迭代

Q:rasa如何使用?

图片

看entity实体是否是有限的集合,如果是有限的集合,使用lookup table,是有限的空间内,是枚举型的,如果没有这些则用NER/CIF, 帮我们做意图的分类和抽取

Q:数据不均衡要做不均衡学习吧,数据增强的一些方法,Smote ADASYN之类的 

A:数据增强肯定是解决数据不均衡的方法;但是在对话里做数据增强是比较难的-- 超纲,后面讲,先按Rasa讲

Custom Components自己去写

图片

需要把模块名加到pipeline里,类路径的名字,去写component图片

再查再问 怎么做inference,分类entities,转换成rasa期待的一种格式;还有persist怎么存储训练好的格式,save成各种各样的文件,如何save如何做持久化;load如何加载,按照tensorflow和按照??存的load方法完全不一样

Q:自己写component有例子吗?

图片

  • 实现的是情感分析的component,依赖于entity,language_list

  • train如何train,用了nltk(微软的库)做朴素贝叶斯训练

  • 然后process怎么做推理工作,预测的过程

  • 得到的结果,之后做convert to rasa,支持json格式,输出给到下一个component,就是通过这样的标准格式一步一步去传递

  • json_pickle去做持久化,有了持久化之后怎么做load,用反序列化加载出来,读到模型里面去图片

以上一系列过程都是怎么去优化NLU

 

Expand your NLU Data 

一)更好的模型

二) 更多的数据:https://rasa.com/docs/rasa/generating-nlu-data

三)Share your Bot to More people把你的对话机器人分享给更多的人 

四)NLU Data Augmentation 数据增强,可以做nlu的data augmentation 

五)Reinforce Learning 可以生成一些数据,从而帮我们产生更多的数据

图片

怎么把数据分成训练集和测试集,按照20%和80%比例分成训练集和测试集rasa data split nlurasa versiontrain_test_split 就是80% 20%分开,用test数据集做测试 在调nlu过程中有一个命令很重要: 

rasa shell nlu

  • 使得我们可以单独测试nlu模型性能是否ok,能否按照我们想要的把用户意图和实体都抽取出来

  • 字典就是component返回的字典

  • 把“你好”分类的类别,分类到great,每一个分类置信度

  • 可以不停地测,比如输入“你好吗”,这个是greet;

  • “你吃了吗”,在train里没有但是仍然得到90%+置信度的greet还是很不错的

  • 图片

“台北的天气好吗”图片

entity也出来了 怎么变成slot?此时需要在domain里面,在slot下面写上entity的名字,influence_conversation是否影响对话:通常不影响False,后续在slot里面就能拿

图片

图片

policy模块所做的事情?写比较多,会比较慢,是并行的,不是串行的,选择置信度最高的结果作为下一个action 当所有policy都预测到同一个confidence,priority优先级是在源码里定义的,先执行rulePolicy再执行……最后TEDPolicy,是深度学习带记忆的policy

DM模块会讲具体的算法,是Facebook出的一篇论文,借鉴了Facebook论文做的工作,就叫TED Policy,得到SOTA结果--可以搜一下论文

有发论文需求可以加入xbot里面去;中文的rasa

图片

epoch训练多少轮,取决于story

  • max_history TEDPolicy会记住上下文的信息,然后做判断,max history记忆上下文,是记忆多少轮;有些对话场景是任务的对话场景,平均来看三轮可以完成的任务,如果记录的是十轮对话场景,就不值得这么大的值;默认是max_history轮次,实际往往不需要这么多 number_of_transformer_layer 用多少层的transformer做这个事情,需要研究算法

  • Memoizaiton Policy 更多是依据规则;可能会产生超出story范围之外的结果;可以用memorization的方式去做,可以匹配intent action去走,没有泛化能力

生成下面的action,只是规则带来的泛化性,不是算法带来的泛化性

  • rule-based policies是完全规则的形式 主要用来讲nlu的时候,可以定义很多rule

 

custom Policies

policy也是可以自定义的

图片

先不讲,后面真正讲policy算法的时候再讲,放到rasa框架里自己实现policy

以上是模型方面, 数据方面:如何获取更多的story,同nlu:

  1. Share your Bot to More people

  2. Stories Data Augmentation

  3. Reinforce Learning

Action

对话机器人需要查接口,才能做查天气的工作 action_ 与前面是一致的 rasa知道你在,在此方法里用这样的方式,查询天气的逻辑写出来即可 写完这样的东西之后,要执行 rasa run actions微服务概念,每一个action都是一个单独的服务,每一个action就可以多布置几台,这时候就会启动服务,就跑在了5055端口上,rasa就会在命中了number_form图片图片

就会进到run里面,做实体识别的时候已经拿到,tracker就是在rasa里定义的关于记忆的东西,叫记录仪,去get_slot,拿到命名的city的slot,找到比如“台北”,然后就可以去调第三方接口,把台北传进去,然后通过dispatcher,rasa的action server 跟rasa交互的工具,然后就会跟用户说这句话,

图片

return 返回的是事件--**是在Rasa系统里与Rasa交互的东西 [AllSlotReset]**词槽信息都清空

 

 

Events

都被表征成一系列事件/暗号

  1. SlotSet 想给slot里填一个值,都通过event机制去与rasa交互

  2. reminderScheduled 比如小度音响,明早八点叫我起床,在某一个时间点去做一个事情,等到那个时间就会响应某一个action

  3. ReminderCancelled 能创建一个日程,还能取消一个日程,通过这样一个slot告诉把event取消掉

  4. UserUtternceReverted

  5. ActionReverted重复一个action,可能有些场景会用到

  6. Restarted重启整个对话机器人,用到的场景比较少

  7. SessionStarted 重新开启一个session,要把当前slot都忘记,除非设置一个全局slot

  8. BotUttered bot度用户说了句什么话 the texter sent to the user

目前看rasa里events这个系统是不完善的,将来想要做扩展的地方,也是我们需要在xbot里实现更多场景的一个地方

 

 Knowledge Base Actions 

如何做KBQA 用知识库回答用户问题

图片

如何实现上图查询过程?只要写一个json文件,按照这样的格式

图片

一些key-value对, using Action kb

Leverage information

“the first one”要知道指代的是第一个

图片

怎么构建数据集 拿到这个实体,就能够自动找到返回的第一个

  • 需要在语料里标注的,value是restaurant,就能找到要从哪个restaurant里拿数据,要在语料里定义好这个东西

  • 第二个是mention,指代消息,the first one, the second one

  • attribute: 就是在数据库里的一些信息,就会自动去找price-range,从属性里去拿,返回一句话

接下来你写的action server是什么样子的

图片

继承ActionQueryKnowledgeBAse

可以自动帮我们做查询,做查询的query,再返回信息

以上就是配置过程,先配语料,entity slot在domain里定义好,把action写到story里面去,关于知识库的查询动作就可以实现了

Q::FormAction不太明白原理

图片

定义的比action复杂些 首先action name,有name才嫩写到story里面去 表单,填一些类别,电话号码,电话号码的数值,要查询哪些业务,做提交,提交完之后要做哪些回复,做哪些操作

 Q:action是从哪里定义获取的slot的

图片

action会把tracker(rasa里的信息)当作参数传递进来 把entity当作slot永久记忆下来

 

rasa后端是tf,没用pytorch

conditional 带有条件的方式 天气查询的接口

图片图片图片

 

 

更多资料

 

https://github.com/RasaHQ/rasa

https://github.com/RasaHQ/rasa-demo

https://github.com/sfrpl/rasa-chatbot

https://zhuanlan.zhihu.com/p/75517803

 

 

推荐阅读

1.图神经网络 - 图与图学习(二)

2.pyspark - pyspark的语法

3.强化学习教程:从DPG到DDPG的原理及tf代码详解

 

图片

图片

图片

 

加入微信学习交流请扫描助手二维码:

 

图片

图片

图片

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/630297
推荐阅读
相关标签
  

闽ICP备14008679号