Rasa NLU中的组件
Rasa NLU部分主要是解决NER(序列建模)和意图识别(分类建模)这2个任务。Rasa NLP是一个基于DAG的通用框架,图中的顶点即组件。组件特征包括有顺序关系、可相互替换、可互斥和可同时使用。有向无环图(DAG)在很多地方都有用到,比如Spark中等。虽然问答系统类型很多,比如闲聊问答、文档问答、知识库问答、知识图谱问答、任务型问答等,但在实际场景中任务型多轮问答最实用。通过构建任务引导型人机辅助系统,在沟通前/沟通中/沟通后全链路,实时通过语音的识别、意图的检测、话术&解决方案的推荐等,辅助销售在多渠道与商家沟通提效、提高任务完成率。
一.典型Rasa NLU组件
一个典型的Rasa NLP管道包含各类组件,如下所示:

1.语言模型组件
为了加载模型文件,为后续的组件提供框架支持,如初始化spaCy和BERT。
2.分词组件
将文本分割成词,为后续的高级NLP任务提供基础数据。
3.特征提取组件
提取词语序列的文本特征,可以同时使用多个特征提取组件。
4.NER组件
根据前面提供的特征对文本进行命名实体的识别。
5.意图分类组件
按照语义对文本进行意图的分类,也称意图识别组件。
6.结构化输出组件
将预测结果整理成结构化数据并输出。这一部分功能不是以组件的形式提供的,而是流水线内建的功能,开发者不可见。
二.语言模型组件
主要是加载预训练的词向量模型或预训练模型,如下所示:
1.SpacyNLP
该组件所需的模型需要提前下载到本地,否则会出错。
2.MitieNLP
需要有预先训练好的模型。
3.预训练Tokenizer
model_tokenizer_dict: Dict[Text, Type[PreTrainedTokenizer]] = {
"bert": BertTokenizer,
"gpt": OpenAIGPTTokenizer,
"gpt2": GPT2Tokenizer,
"xlnet": XLNetTokenizer,
# "xlm": XLMTokenizer,
"distilbert": DistilBertTokenizer,
"roberta": RobertaTokenizer,
"camembert": CamembertTokenizer,
}
三.分词组件
1.jieba_tokenizer.py
这个分词器是Jieba的一个包装器(https://github.com/fxsjy/jieba)。
2.mitie_tokenizer.py
使用MitieNLP库对消息进行Tokenizer。
3.spacy_tokenizer.py
使用SpaCy库对消息进行Tokenizer。
4.whitespace_tokenizer.py
为实体提取创建特征。
四.特征提取组件
1.稀疏特征
SparseFeaturizer所有稀疏特征featurizers的基类。稀疏特征如下所示:
(1)count_vectors_featurizer.py
基于sklearn的CountVectorizer创建一系列token计数特征。所有仅由数字组成的token(例如123和99但不是ab12d)将由单个特征表示。将analyzer设置为char_wb使用了Subword Semantic Hashing的思想(https://arxiv.org/abs/1810.07150)。
(2)lexical_syntactic_featurizer.py
提取和编码词汇句法特征。给定一系列tokens,该特征提取器会生成一系列特征,其中第t个特征编码第t个token及其周围token的词汇和句法信息。
(3)regex_featurizer.py
基于正则表达式的消息特征。
2.稠密特征
DenseFeaturizer所有稠密特征featurizers的基类。稠密特征如下所示:
(1)convert_featurizer.py
使用ConveRT模型的Featurizer。从TFHub加载ConveRT(https://github.com/PolyAI-LDN/polyai-models#convert)模型,并为每个消息对象的密集可特征属性计算句子和序列级特征表示。
(2)lm_featurizer.py
基于transformer的语言模型的featurizer。这个组件从transformers库中加载预训练的语言模型,包括BERT、GPT、GPT-2、xlnet、distilbert和roberta。它还对每个消息的可特征化的密集属性进行tokenizes和featurizes。
(3)spacy_featurizer.py
使用SpaCy对消息进行特征化。
(4)mitie_featurizer.py
使用Mitie对消息进行特征化。
五.NER组件
1.crf_entity_extractor.py
实现条件随机场(CRF)来进行命名实体识别。
2.duckling_entity_extractor.py
使用duckling服务器搜索结构化实体,例如日期。
3.mitie_entity_extractor.py
一个Mitie实体提取器(它是Dlib-ml的薄包装器)。
4.regex_entity_extractor.py
通过在训练数据中定义的查找表和正则表达式提取实体。
5.spacy_entity_extractor.py
使用SpaCy进行实体提取器。
六.意图分类组件
1.diet_classifier.py
用于意图分类和实体提取的多任务模型。DIET是双意图和实体Transformer。该架构基于Transformer,该Transformer用于两个任务。通过在与输入token序列对应的transformer输出序列上方的条件随机场(CRF)标记层预测实体标签序列。用于__CLS__ token和意图标签的transformer输出被嵌入到单个语义向量空间中。使用点积损失来最大化与目标标签的相似性,并最小化与负样本的相似性。
2.fallback_classifier.py
处理NLU置信度低的传入消息。
3.keyword_intent_classifier.py
使用简单的关键字匹配的意图分类器。分类器将关键字列表和关联的意图作为输入。输入句子将检查关键字并返回意图。
4.logistic_regression_classifier.py
使用逻辑回归的意图分类器。
5.mitie_intent_classifier.py
意图分类器使用mitie库。
6.sklearn_intent_classifier.py
使用sklearn框架的意图分类器。
除此之外,Rasa提供DIETClassifier组件,基于Rasa自行研发的DIET(Dual Intent Entity Transformer)技术,实现用户实体和意图的联合建模;对于FQA等简单的QA问题,只需要使用NLU部分就可以轻松完成,因此Rasa提供了回复选择器(ResponseSelector)组件。
个人认为LLM基本上解决了NLU和NLG的绝大部分问题,但是DM部分的表现还很邋遢。后续尝试将Rasa+LangChain+LLM+NebulaGraph技术进行融合来构建任务型多轮对话系统。对话管理(Dialog Management,DM)是指根据对话历史状态决定当前的动作或对用户的反应。DM模块是人机对话流程的控制中心,在多轮对话的任务型对话系统中有着重要的应用。DM模块的首要任务是负责管理整个对话的流程。通过对上下文的维护和解析,DM模块要决定用户提供的意图是否明确,以及实体槽的信息是否足够,以进行数据库查询或开始执行相应的任务。
当DM模块认为用户提供的信息不全或模棱两可时,就要维护一个多轮对话的语境,不断引导式地询问用户以得到更多的信息,或者提供不同的可能选项让用户选择。DM模块要存储和维护当前对话的状态、用户的历史行为、系统的历史行为、知识库中的可能结果等。当DM模块认为已经清楚得到了全部需要的信息后,就会将用户的查询变成相应的数据库查询语句去知识库(如知识图谱)中查询相应资料,或者实现和完成相应的任务(如购物下单,或者类似Siri拨打朋友的电话,或者类似智能家居去拉起窗帘等)。
因此,在新的研究中,将DM模块的状态建模成一个序列标注的监督学习问题,甚至用强化学习(reinforcement learning)加入一个用户模拟器来将DM模块训练成一个深度学习的模型。
参考文献:
[1]《Rasa实战》
Rasa NLU中的组件的更多相关文章
- 使用Botkit和Rasa NLU构建智能聊天机器人
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 我们每天都会听到关于有能力涉及旅游.社交.法律.支持.销售等领域的新型机器人推出的新闻.根据我最后一次查阅的数据,单单Facebook Me ...
- android中四大组件之间相互通信
好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...
- Android ScrollView中的组件设置android:layout_height="fill_parent"不起作用的解决办法
例子,在ScrollView下加入的组件,无论如何也不能自动扩展到屏幕高度. 布局文件. [html] <?xml version="1.0" encoding=" ...
- 如何在Vue2中实现组件props双向绑定
Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...
- java中解决组件重叠的问题(例如鼠标移动组件时)
java中解决组件覆盖的问题! 有时候在移动组件的时候会出现两个组件覆盖的情况,但是你想让被覆盖的组件显示出来或者不被覆盖! 在设计GUI时已经可以定义组件的叠放次序了(按摆放组件的先后顺序) ...
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
- LotusPhp中配置文件组件LtConfig详解
LotusPhp中配置文件组件LtConfig是约定的一个重要组成部分,适用于多个场景,多数的LotusPhp组件如数据库,缓存,RBAC,表单验证等都需要用到配置组件,LtConfig配置组件也是L ...
- Android中ViewStub组件使用
1. 概述: ViewStub组件和<include>标签的作用类似,主要是为了提高布局的重用性,及布局的模块化.它们之间最大的差别是,ViewStub中的布局不会随着它所在布局的渲染而渲 ...
- Android 短信模块分析(二) MMS中四大组件核心功能详解
接下来的分析先从MMS中四大组件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手: 一. Activity 1 ...
- React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...
随机推荐
- bitfield
bitfield 作用 位域修改 溢出控制 原理 通过对redis字符串二进制形式进行操作,通过改变其值的作用 更具体 将一个Redis字符串看作是一个由二进制位组成的数组. 并能对变长位宽和任意没有 ...
- jquery中for循环一共几种
$.each() 第一个参数是循环的对象 , 第二个参数对对象中的每一个元素 执行 function函数 ,function 的第一个参数 i 是索引,item 是 循环对象中的每一个元素.
- Linux shell:根据盘符定位硬盘在服务器上的位置
disk-light.sh #!/bin/bash t_dev=$1 [ -b "$t_dev" ] || { echo "-b failed: $t_dev" ...
- javascript中一些难以理解的专有名词 2(也不是很专有)
作用域链 让人迷惑的例子 function foo() {console.log(v)} function foo1() { var v = "v1" foo() console. ...
- 2022-1-20 Wpf绑定属性
使用UpdateSourceTrigger绑定属性 后台绑定 通过后台代码绑定 UpdateSourceTrigger
- NAT与NAT实验
1.NAT与NAT实验 NAT(网络地址翻译) 一个数据包目的ip或者源ip为私网地址, 运营商的设备无法转发数据. 实际场景问题 如下图 201.0.0.1 公网地址? 买的 运营商给你的19 ...
- 使用在线Excel时,有哪些方法可以引入计算函数?
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在日常生活和工作中,我们都会或多或少的使用Excel中的 ...
- 2023牛客暑期多校训练营7 CGILM
比赛链接 C 题解 知识点:位运算,贪心. 我们用分段的思想考虑大小关系,若在同一段则大小不能确定,一开始为 \([1,n]\) . 我们按位从高到低考虑,某位如果 \(b_i\) 产生了 \(1\) ...
- valgrind 配合 gdb 调试程序
在实际研发过程中,可能会遇到过这样的问题:测试通过 valgrind 验证当前代码存在变量未初始化的问题,但仅通过 valgrind 测试报告,研发无法确认具体的应用场景.本文将通过 valgrind ...
- Android13深入了解 Android 小窗口模式和窗口类型
Android13深入了解 Android 小窗口模式和窗口类型 小窗模式,作为一种在移动设备上的多任务处理方式,为用户带来了便捷和高效的体验,尤其在一些特定场景下,其价值愈发凸显.以下是为什么需要小 ...