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中的组件的更多相关文章

  1. 使用Botkit和Rasa NLU构建智能聊天机器人

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 我们每天都会听到关于有能力涉及旅游.社交.法律​​.支持.销售等领域的新型机器人推出的新闻.根据我最后一次查阅的数据,单单Facebook Me ...

  2. android中四大组件之间相互通信

    好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...

  3. Android ScrollView中的组件设置android:layout_height="fill_parent"不起作用的解决办法

    例子,在ScrollView下加入的组件,无论如何也不能自动扩展到屏幕高度. 布局文件. [html] <?xml version="1.0" encoding=" ...

  4. 如何在Vue2中实现组件props双向绑定

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...

  5. java中解决组件重叠的问题(例如鼠标移动组件时)

    java中解决组件覆盖的问题!     有时候在移动组件的时候会出现两个组件覆盖的情况,但是你想让被覆盖的组件显示出来或者不被覆盖! 在设计GUI时已经可以定义组件的叠放次序了(按摆放组件的先后顺序) ...

  6. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

  7. LotusPhp中配置文件组件LtConfig详解

    LotusPhp中配置文件组件LtConfig是约定的一个重要组成部分,适用于多个场景,多数的LotusPhp组件如数据库,缓存,RBAC,表单验证等都需要用到配置组件,LtConfig配置组件也是L ...

  8. Android中ViewStub组件使用

    1. 概述: ViewStub组件和<include>标签的作用类似,主要是为了提高布局的重用性,及布局的模块化.它们之间最大的差别是,ViewStub中的布局不会随着它所在布局的渲染而渲 ...

  9. Android 短信模块分析(二) MMS中四大组件核心功能详解

    接下来的分析先从MMS中四大组件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手: 一. Activity  1 ...

  10. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

随机推荐

  1. YUM histoy 与 RPM -qa --last

    查看Linux yum安装包的安装时间,可以使用以下命令: rpm -qa --last 该命令将显示已安装的所有rpm包及其安装日期和时间. 可以使用管道符 '|' 和 grep 命令来查找特定的包 ...

  2. 记录一次线上服务CPU飙高问题

    2023.07.20 20:01:38线上一个服务发生了CPU过高的告警, 看告警信息当前的CPU使用率已经达到了82.65%,问题已经很严重,赶紧开始排查起来.来复盘下如何排查这类问题, 一.排查方 ...

  3. Vue中 router与route的区别

    $route对象 该对象表示当前的路由信息,包含当前URL解析得到的信息.包含当前的路径,参数,query对象等.其常用方法如下所示: $route.path 字符串,对应当前路由的路径,总是解析为绝 ...

  4. java file I/O流

    一.File的简介:(java.io包) 生活中的文件: (1)文件的作用:持久化(瞬时状态的对立面状态) (1)文件的定义:一堆数据的集合 (2)文件存储的位置:磁盘,硬盘,软盘,U盘等等 计算机中 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题

    四.如何修改 QUICKSORT,使得它能够以非递增序进行排序? 文心一言: 快速排序(Quicksort)是一种常用的排序算法,基于分治策略进行设计.默认情况下,快速排序会以递增序进行排序.若想修改 ...

  6. JVM性能监控和调优

    JVM性能监控和调优 JVM(Java虚拟机)调优是为了优化Java应用程序的性能和稳定性.JVM调优的目的是通过调整JVM的配置参数和优化应用程序代码,使其在给定的硬件和软件环境下达到更好的性能表现 ...

  7. Java stream 流

    Java stream 流 中间操作 1.filter 作用:将流中的元素,基于自定义的比较器进行去重 方法定义 Stream<T> filter(Predicate<? super ...

  8. 解决SVN死锁问题

    svn执行clean up后出现提示:svn cleanup failed–previous operation has not finished; run cleanup if it was int ...

  9. 如何使用Java + React计算个人所得税?

    前言 在报表数据处理中,Excel公式拥有强大而多样的功能,广泛应用于各个业务领域.无论是投资收益计算.财务报表编制还是保险收益估算,Excel公式都扮演着不可或缺的角色.传统的做法是直接依赖Exce ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题

    一.用go语言,参照图 8-3 的方法,说明 RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB, BOX, TAB, BAR, EAR,TAR, DIG, ...