Rasa功能汇总

目录

Rasa shell 命令

Rasa文件结构

Rasa NLU

Rasa NLU 训练数据

Rasa NLU 组件

Rasa NLU 流水线

Rasa Core

Rasa Core 训练数据

Story 训练数据

Rule 数据

Policies

策略优先级

Domain 文件

Config.yml文件

自定义组件

Rasa 提供了很多 NLU 组件和 策略,但如果这些组件不满足自己的需求,可以使用自定义 NLU 组件和策略来扩展 Rasa


Rasa shell 命令

初始化项目:rasa init --no-prompt

训练: rasa train

只训练 nlu 部分:rasa train nlu

shell 交互: rasa shell

shell 交互 NLU: rasa shell nlu

通过交互式生成训练数据:rasa interactive

更多命令: Command Line Interface

Rasa文件结构

每个文件的内容会在下文详细说明

Rasa功能汇总_第1张图片

Rasa NLU

Rasa NLU 主要用来做意图识别和实体识别,可使用命令 rasa train nlu 单独训练,使用 rasa shell nlu在命令行单独测试

Rasa 也提供 restful http api 的服务形式,可作为单独服务启动

Rasa NLU 训练数据

这部分训练数据在data/nlu.yml里面配置

字段名

例子

作用

意图字段

Rasa功能汇总_第2张图片

如图:

  1. 训练数据一共两个类别, greet和 faq/language
  2. [Sara](name)表示 Sara是一个实体,实体名叫 name

注释:faq/language这种写法是意图分组,详细信息可参考,主要用在单轮检索Chitchat and FAQs

同义词字段

Rasa功能汇总_第3张图片

给提取出来的实体进行归一化,如图:

当提取出来的实体是 credit card account 或者 credit account 的时候,实体值会归一化为 credit

EntitySynonymMapper 组件配置在 config.yml的 pipeline 里面,才会生效

注意: 不影响提取实体的效果,只是对实体进行了归一化

实体角色

订从[北京]{"entity":"city", "role":"departure"}到[上海]{"entity":"city", "role":"destination"}的机票

订从[上海]{"entity":"city", "role":"departure"}到[北京]{"entity":"city", "role":"destination"}的机票

主要用来区分实体的不同角色,北京和上海都是地点,这个实体提出来也没办法区分出发地和目的地,所以需要用角色信息去区分

实体分组

买两杯咖啡,一[大]{"entity": "size", "group":"1"}杯,一[小]{"entity": "size", "group":"2"}杯,大的加冰,小的加糖

实体分组,每组实体描述一个子任务

查找表字段

Rasa功能汇总_第4张图片

banks是查找表的名字,是枚举类型的值,查找表用来生成大小写不敏感的正则表达式,查找表的作用主要有两个:

  1. 作为特征之一以辅助意图分类和实体提取,如果要用这个功能,RegexFeaturizer 需要设置在 config.yml的 pipeline 里面,才会生效。训练数据要确保有足够的示例。
  2. 直接用来做实体提取,是比较机械化的手段,但有时候很有用,如果要用这个功能, RegexEntityExtractor 需要设置在 config.yml的 pipeline 里面,才会生效。训练数据要至少提供两条带注释的实体示例 Eg: I am finding a [Bank of America](banks)

正则表达式字段

Rasa功能汇总_第5张图片

正则表达式和查找表用法一样

但需要注意的是正则表达式要写的尽量准确,尽量匹配的精确一点

支持多意图

Rasa功能汇总_第6张图片

如果要使用多意图, DIETClassifier  需要加入到 pipeline 里面,还需要在分词器中定义,表示意图按照+号进行分割

intent_tokenization_flag: True

intent_split_symbol: "+"

意图组合需要在训练数据中显示的标记出来,训练数据中没有的意图组合,模型是不考虑的

Rasa NLU 组件

Rasa NLU 是一个基于有向无环图的通用框架,有向无环图是由组件相互连接构成,定义了各个组件之间数据的流动关系

  • 组件之间是有顺序的,顺序很重要,比如 NER 组件前面需要提供分词组件
  • 组件是可以相互替换的,比如可以选择不同的分词器
  • 有些组件是互斥的,比如只能有一个分词器,不然结果会混乱
  • 有些组件是可以同时使用的,比如提取特征的组件就可以同时使用基于规则和基于 embedding 的

组件名称

作用

语言模型组件

加载预训练的词向量,可以用 MitieNLP、SpacyNLP

MitieNLP:mitie 基于dlib库开发,dlib是一个c++高性能机器学习库。所以对性能有要求的信息抽取场景,可以考虑使用mitie。MITIE没有预训练的中文模型,如果想开发中文机器人,需要自己训练语言模型。

SpacyNLP:spaCy是一个用Python和Cython编写的高级自然语言处理的库,带有预训练的统计模型和单词向量,对应的中文模型需要自己去下载

分词组件

WhitespaceTokenizer 基于空格

JiebaTokenizer 结巴分词,支持中文

MitieTokenizer、SpacyTokenizer

特征提取

特征提取组件可以选择多个

  • MitieFeaturizer 依赖MitieNLP组件
  • SpacyFeaturizer 依赖SpacyNLP组件
  • ConveRTFeaturizer 依赖分词组件,基于 poly ai 的 conveRT 模型
  • LanguageModelFeaturizer 依赖分词组件,基于 HuggingFace 的 transformers 库

如果用 bert, gpt 等语言模型在这指定

  • RegexFeaturizer依赖分词组件,正则提取特征,正则特征作为特征之一
  • CountVectorsFeaturizer 词袋模型
  • LexicalSyntacticFeaturizer 提供词法和语法特征,比如是否句首、句尾、是否纯数字等

NER 组件

Rasa 提供了多种 NER 组件

  • MitieEntityExtractor
  • SpacyEntityExtractor 内置好的,无法再训练,包括人名、地名、组织机构名
  • CRFEntityExtractor
  • DucklingEntityExtractor 内置的,无法再训练,包括邮箱,距离,时间等
  • DIETClassifier 这个是意图和实体联合训练,即预测意图,又提取实体
  • RegexEntityExtractor 正则表达式组件,根据正则直接提取实体,而不是作为特征
  • EntitySynonymMapper 实体归一化组件

意图分类组件

  • MitieIntentClassifier
  • LogisticRegressionClassifier
  • SklearnIntentClassifier
  • KeywordIntentClassifier
  • DIETClassifier 和实体一起联合抽取
  • FallbackClassifier 如果其他分类组件的得分过低,该组件就把 intent 改写成fall_back

回复选择器组件

  • ResponseSelector

Rasa功能汇总_第7张图片

Rasa NLU 流水线

流水线定义了组件和组件之间的依赖关系,可以根据自己的需求对各个组件进行配置

Rasa功能汇总_第8张图片

Rasa Core

Rasa Core 是 Rasa 框架提供的对话管理模块,主要的任务是维护追踪对话状态,动作选择,然后对用户的输入做出响应

Rasa Core 训练数据

Rasa Core 的训练数据包含两部分,一个是Story,一个就是Rules,Story用于机器学习训练方式,而Rules就是基于规则的流程控制,只要满足规则,每次走的都是确定性分支。

什么时候用 Story, 什么时候用 rules ?

  • 一轮对话的时候用 rule
  • fallback 行为的时候,当意图或者策略的置信度低于阈值的时候,采取的固定行为用 Rule
  • 激活和提交表单的时候,因为都会遵循固定的路径 用 Rule
  • 多轮对话时候用 Story

Story 训练数据

data/stories.yml 里面配置,若想 Story 得到训练,必须设置对应的策略在 config.yml里面,策略文档下面会介绍

更多内容参考:Writing Conversation Data

例子

作用

story

Rasa功能汇总_第9张图片

intent当意图等于什么的时候,系统动作是 action

分支条件判断

Rasa功能汇总_第10张图片

slot_was_set 通过判断,raining 的槽值为 true 的时候执行什么动作,槽值为 false 的时候执行什么动作

如果槽值的内容是什么不重要的话, 可以只写槽的name

Eg:

- slot_was_set:

- raining

or

Rasa功能汇总_第11张图片

当意图满足 affirm 或者 thanks 的时候

Checkpoints

Rasa功能汇总_第12张图片

可以通过检查点的名字,首位相连成新的故事

entities

Rasa功能汇总_第13张图片

在意图下面可以写上 entities,不是必须得,写上就表示策略会根据意图和实体的组合来学习预测下一个操作

也可以在 Domain 里面利用 use_entities 来指定

Rule 数据

data/rules.yml 里面配置,若想 rule 生效,必须把以下配置写在 config.yml里面

Rasa功能汇总_第14张图片

使用场景

例子

作用

单轮对话

Rasa功能汇总_第15张图片

任何时候用户打招呼,都回应打招呼

只应用于对话开始

Rasa功能汇总_第16张图片

只有开始第一轮的时候,用户打招呼,才会回应打招呼

为规则添加条件

Rasa功能汇总_第17张图片

只有满足条件,规则才生效

规则结束不等待用户消息

Rasa功能汇总_第18张图片

默认是规则结束之后等待用户输入,设置 wait_for_user_input: false不等待用户输入,继续执行下一个动作或者规则

填表单

Forms

表单型问答,适合填表单的场景

FAQ 问答

Chitchat and FAQs

nlu fall back

Rasa功能汇总_第19张图片

Rasa功能汇总_第20张图片

Rasa功能汇总_第21张图片

当NLU 的意图低于指定阈值的时候,固定的回复

策略 fall back

Rasa功能汇总_第22张图片

Rasa功能汇总_第23张图片

当策略预测下一个动作时,低于阈值的自动回复

Two-Stage Fallback

Fallback and Human Handoff

当意图分类置信度比较低的时候,跟用户重新确认意图,如果用户重新输入的意图置信度还是比较低,则执行utter_default

Policies

policy 是会话策略,表示以什么样的策略去利用 Story 和 rule 数据

可以设置多个策略,会选择得分最高的动作,如果分数相同,按照优先级预测,在 config.yml里面配置

TED Policy

是 Rasa 自行开发的一套对话预测算法,采用 transformer 将当前的对话映射成一个对话向量,找到和这个向量最近的动作的对话向量

story数据

UnexpecTED Intent Policy

实验性的,我没怎么看懂

Memoization Policy

直接记住历史中出现的状态和对应的动作,把这种关系做成字典,在预测时候直接查询相关的字典,如果有这样的状态,则执行对应的动作,如果没有,预测失败

Augmented Memoization Policy

和 Memoization Policy 工作原理一致,只是有一个遗忘机制,会随机地遗忘当前对话历史中的部分步骤,随后试图在训练的故事集合中,寻找和当前历史匹配的故事(没太懂)

Rule Policy

规则描述了应该始终遵循相同路径的简短对话。可以理解为规则是写死的,固定流程

rule数据

策略优先级

数字越大优先级越高,Rasa 不建议大家改优先级,内部有些实现依赖默认的优先级

  • 6 - RulePolicy
  • 3 - MemoizationPolicy or AugmentedMemoizationPolicy
  • 2 - UnexpecTEDIntentPolicy
  • 1 - TEDPolicy

Domain 文件

Domain 定义了 bot 可以操控的范围,它指定了bot需要了解的Responses、Intents、Slots、Entities、Forms and actions。domain是一个或者多个YAML格式的文件。指定搜索domain文件的路径方式如下,默认从Bot所在路径查找:

rasa train --domain path_to_domain_directory

例子

作用

intents

Rasa功能汇总_第24张图片

所使用的所有意图都需要写在 domain 里面

这个是最简单的格式

Rasa功能汇总_第25张图片

可以为意图增加一些配置:

use_entities 表示识别该意图用到的实体,如果 use_entities=[ ]表示该意图忽略所有实体

ignore_entities 表示要忽略的实体

entities

Rasa功能汇总_第26张图片

NLU 要提取的所有实体,都要在 entities 里面列出来

这个是最简单的格式

Rasa功能汇总_第27张图片

如果有实体角色和分组,也需要列出来

Rasa功能汇总_第28张图片

要忽略所有意图的实体,而不必在每个意图的 ignore_entities 标志下列出它,可以在实体下将标志 Impact_conversation 设置为 false

slots

Rasa功能汇总_第29张图片

slot_name是槽位的名称,type 是槽位的类型, mappings 是和实体的映射关系

type一共有以下几种类型:

text、bool、category枚举类型的值、float、list、 any(对动作预测没有任何影响)

  • 详情:Slot Types
  • Slot Mappings

Rasa功能汇总_第30张图片

该设置表示该槽不影响对话流程

Rasa功能汇总_第31张图片

表示该槽影响对话流程,应该也可以在 Story 里面配置

Rasa功能汇总_第32张图片

初始化槽值

  • Mapping Conditions
  • Custom Slot Mappings

Responses

设置回复,相当于系统动作

Forms

  • Handling Business Logic

表单

Actions

所有的自定义动作都写在下面

Session configuration

session_expiration_time 用户回复超时多少分钟重启会话

carry_over_slots_to_new_session 是否丢弃槽值

config

Rasa功能汇总_第33张图片

如果设置为 True:

如果NLU模型抽取了一个实体,并且domian包含了一个同名的slot,那么这个slot将被自动设置

Config.yml文件

例子

作用

pipeline

见上文 Rasa NLU 流水线

配置 NLU 的流水线

policies

Rasa功能汇总_第34张图片

关于策略配置的详情

max_history 控制了模型查看多少对话历史来决定下一步要采取的行动,一般是为TEDPolicy 策略设置

augmentation 数据增强,把故事收尾相连,生成新的故事,在用 Rasa 命令时, 加上--augmentation

Eg: rasa train --augmentation 50 ,会生成 50*10=500 个故事

详情:Policies

自定义组件

Rasa 提供了很多 NLU 组件和 策略,但如果这些组件不满足自己的需求,可以使用自定义 NLU 组件和策略来扩展 Rasa

  • Custom Graph Components

你可能感兴趣的:(Rasa框架,机器学习,人工智能,深度学习)