赞
踩
目录
Rasa 提供了很多 NLU 组件和 策略,但如果这些组件不满足自己的需求,可以使用自定义 NLU 组件和策略来扩展 Rasa
初始化项目:rasa init --no-prompt
训练: rasa train
只训练 nlu 部分:rasa train nlu
shell 交互: rasa shell
shell 交互 NLU: rasa shell nlu
通过交互式生成训练数据:rasa interactive
更多命令: Command Line Interface
每个文件的内容会在下文详细说明
Rasa NLU 主要用来做意图识别和实体识别,可使用命令 rasa train nlu 单独训练,使用 rasa shell nlu在命令行单独测试
Rasa 也提供 restful http api 的服务形式,可作为单独服务启动
这部分训练数据在data/nlu.yml里面配置
字段名 | 例子 | 作用 |
意图字段 | 如图:
注释:faq/language这种写法是意图分组,详细信息可参考,主要用在单轮检索Chitchat and FAQs | |
同义词字段 | 给提取出来的实体进行归一化,如图: 当提取出来的实体是 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"}杯,大的加冰,小的加糖 | 实体分组,每组实体描述一个子任务 |
查找表字段 | banks是查找表的名字,是枚举类型的值,查找表用来生成大小写不敏感的正则表达式,查找表的作用主要有两个:
| |
正则表达式字段 | 正则表达式和查找表用法一样 但需要注意的是正则表达式要写的尽量准确,尽量匹配的精确一点 | |
支持多意图 | 如果要使用多意图, DIETClassifier 需要加入到 pipeline 里面,还需要在分词器中定义,表示意图按照+号进行分割 intent_tokenization_flag: True intent_split_symbol: "+" 意图组合需要在训练数据中显示的标记出来,训练数据中没有的意图组合,模型是不考虑的 |
Rasa NLU 是一个基于有向无环图的通用框架,有向无环图是由组件相互连接构成,定义了各个组件之间数据的流动关系
组件名称 | 作用 |
语言模型组件 | 加载预训练的词向量,可以用 MitieNLP、SpacyNLP MitieNLP:mitie 基于dlib库开发,dlib是一个c++高性能机器学习库。所以对性能有要求的信息抽取场景,可以考虑使用mitie。MITIE没有预训练的中文模型,如果想开发中文机器人,需要自己训练语言模型。 SpacyNLP:spaCy是一个用Python和Cython编写的高级自然语言处理的库,带有预训练的统计模型和单词向量,对应的中文模型需要自己去下载 |
分词组件 | WhitespaceTokenizer 基于空格 JiebaTokenizer 结巴分词,支持中文 MitieTokenizer、SpacyTokenizer |
特征提取 | 特征提取组件可以选择多个
如果用 bert, gpt 等语言模型在这指定
|
NER 组件 | Rasa 提供了多种 NER 组件
|
意图分类组件 |
|
回复选择器组件 |
流水线定义了组件和组件之间的依赖关系,可以根据自己的需求对各个组件进行配置
Rasa Core 是 Rasa 框架提供的对话管理模块,主要的任务是维护追踪对话状态,动作选择,然后对用户的输入做出响应
Rasa Core 的训练数据包含两部分,一个是Story,一个就是Rules,Story用于机器学习训练方式,而Rules就是基于规则的流程控制,只要满足规则,每次走的都是确定性分支。
什么时候用 Story, 什么时候用 rules ?
data/stories.yml 里面配置,若想 Story 得到训练,必须设置对应的策略在 config.yml里面,策略文档下面会介绍
更多内容参考:Writing Conversation Data
例子 | 作用 | |
story | intent当意图等于什么的时候,系统动作是 action | |
分支条件判断 | slot_was_set 通过判断,raining 的槽值为 true 的时候执行什么动作,槽值为 false 的时候执行什么动作 如果槽值的内容是什么不重要的话, 可以只写槽的name Eg: - slot_was_set: - raining | |
or | 当意图满足 affirm 或者 thanks 的时候 | |
Checkpoints | 可以通过检查点的名字,首位相连成新的故事 | |
entities | 在意图下面可以写上 entities,不是必须得,写上就表示策略会根据意图和实体的组合来学习预测下一个操作 也可以在 Domain 里面利用 use_entities 来指定 |
data/rules.yml 里面配置,若想 rule 生效,必须把以下配置写在 config.yml里面
使用场景 | 例子 | 作用 |
单轮对话 | 任何时候用户打招呼,都回应打招呼 | |
只应用于对话开始 | 只有开始第一轮的时候,用户打招呼,才会回应打招呼 | |
为规则添加条件 | 只有满足条件,规则才生效 | |
规则结束不等待用户消息 | 默认是规则结束之后等待用户输入,设置 wait_for_user_input: false不等待用户输入,继续执行下一个动作或者规则 | |
填表单 | 表单型问答,适合填表单的场景 | |
FAQ 问答 | ||
nlu fall back | 当NLU 的意图低于指定阈值的时候,固定的回复 | |
策略 fall back | 当策略预测下一个动作时,低于阈值的自动回复 | |
Two-Stage Fallback | 当意图分类置信度比较低的时候,跟用户重新确认意图,如果用户重新输入的意图置信度还是比较低,则执行utter_default |
policy 是会话策略,表示以什么样的策略去利用 Story 和 rule 数据
可以设置多个策略,会选择得分最高的动作,如果分数相同,按照优先级预测,在 config.yml里面配置
是 Rasa 自行开发的一套对话预测算法,采用 transformer 将当前的对话映射成一个对话向量,找到和这个向量最近的动作的对话向量 | story数据 | |
实验性的,我没怎么看懂 | ||
直接记住历史中出现的状态和对应的动作,把这种关系做成字典,在预测时候直接查询相关的字典,如果有这样的状态,则执行对应的动作,如果没有,预测失败 | ||
和 Memoization Policy 工作原理一致,只是有一个遗忘机制,会随机地遗忘当前对话历史中的部分步骤,随后试图在训练的故事集合中,寻找和当前历史匹配的故事(没太懂) | ||
规则描述了应该始终遵循相同路径的简短对话。可以理解为规则是写死的,固定流程 | rule数据 |
数字越大优先级越高,Rasa 不建议大家改优先级,内部有些实现依赖默认的优先级
Domain 定义了 bot 可以操控的范围,它指定了bot需要了解的Responses、Intents、Slots、Entities、Forms and actions。domain是一个或者多个YAML格式的文件。指定搜索domain文件的路径方式如下,默认从Bot所在路径查找:
rasa train --domain path_to_domain_directory
例子 | 作用 | |
intents | 所使用的所有意图都需要写在 domain 里面 这个是最简单的格式 | |
可以为意图增加一些配置: use_entities 表示识别该意图用到的实体,如果 use_entities=[ ]表示该意图忽略所有实体 ignore_entities 表示要忽略的实体 | ||
entities | NLU 要提取的所有实体,都要在 entities 里面列出来 这个是最简单的格式 | |
如果有实体角色和分组,也需要列出来 | ||
要忽略所有意图的实体,而不必在每个意图的 ignore_entities 标志下列出它,可以在实体下将标志 Impact_conversation 设置为 false | ||
slots | slot_name是槽位的名称,type 是槽位的类型, mappings 是和实体的映射关系 type一共有以下几种类型: text、bool、category枚举类型的值、float、list、 any(对动作预测没有任何影响)
| |
该设置表示该槽不影响对话流程 | ||
表示该槽影响对话流程,应该也可以在 Story 里面配置 | ||
初始化槽值 | ||
Responses | 设置回复,相当于系统动作 | |
Forms | 表单 | |
Actions | 所有的自定义动作都写在下面 | |
Session configuration | session_expiration_time 用户回复超时多少分钟重启会话 carry_over_slots_to_new_session 是否丢弃槽值 | |
config | 如果设置为 True: 如果NLU模型抽取了一个实体,并且domian包含了一个同名的slot,那么这个slot将被自动设置 |
例子 | 作用 | |
pipeline | 见上文 Rasa NLU 流水线 | 配置 NLU 的流水线 |
policies | 关于策略配置的详情 max_history 控制了模型查看多少对话历史来决定下一步要采取的行动,一般是为TEDPolicy 策略设置 augmentation 数据增强,把故事收尾相连,生成新的故事,在用 Rasa 命令时, 加上--augmentation Eg: rasa train --augmentation 50 ,会生成 50*10=500 个故事 详情:Policies |
Rasa 提供了很多 NLU 组件和 策略,但如果这些组件不满足自己的需求,可以使用自定义 NLU 组件和策略来扩展 Rasa
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。