目录
Rasa 开源机器人
1. 学习资料
2. Rasa 安装
2.1. rasa 简介
2.2. Rasa系统结构
2.3. 项目的基本流程
2.4. Rasa安装
2.5. 组件介绍
3. Rasa NLU
3.0. NLU 推理输出格式
3.1. 训练数据 https://blog.csdn.net/qq_24729325/article/details/data/nlu.yml 数据文件
3.2. https://blog.csdn.net/qq_24729325/article/details/config.yml配置文件
4. Rasa Core
4.1. 领域
4.2. 动作Action
4.2.1. 回复动作
4.2.2. 表单
4.2.3. 默认动作
4.2.2. 自定义动作
4.3. 词槽slots
4.3.1. 词槽的映射
4.4. 回复
4.5. 会话配置
4.6. 全局设置
4.7. 故事 story https://blog.csdn.net/qq_24729325/article/details/data/stories.yml
4.8. 策略 policy
4.8.1. 策略配置policy https://blog.csdn.net/qq_24729325/article/details/config.yml
4.9. 数据增强
4.10. 端点 https://blog.csdn.net/qq_24729325/article/details/endpoints.yml
5. Rasa SDK 和自定义动作
5.1. 安装
5.2. 自定义动作action
5.2.1. tracker对象
5.2.2. 事件对象 event
5.3. Rasa支持的客户端 https://blog.csdn.net/qq_24729325/article/details/credentials.yml
6. Rasa 使用ResponseSelector实现FAQ和闲聊功能
6.1. 自定义用户问题
6.2. 自定义用户答案 https://blog.csdn.net/qq_24729325/article/details/domain.yml
6.3. 如何训练Rasa
线上版:Rasa 实战:构建开源对话机器人 - 手册 - 文江博客 (wenjiangs.com)
离线版:Rasa 实战:构建开源对话机器人
章节附带代码:
GitHub - Chinese-NLP-book/rasa_chinese_book_code: 《Rasa实战:构建开源对话机器人》官方随书代码 | The official source code of Rasa in Action: Building Open Source Conversational AI
- Rasa NLU:提取用户想要做什么和关键的上下文信息
- Rasa Core:基于对话历史,选择最优的回复和动作
- 通道(channel)和动作(action):连线对话机器人与用户及后端服务系统。
- tracker store、lock store和event broker等辅助系统
- 组件之间的顺序关系至关重要。例如,NER组件需要前面的组件提供分词结果才能正常工作,因此前面的组件中必须有一个分词器。
- 组件是可以相互替换的。例如,清华大学开发的分词器和北京大学开发的分词器均能提供分词结果。
- 有些组件是互斥的。例如,分词结果不能同时由两个分词器提供,否则会出现混乱。
- 有些组件是可以同时使用的。例如,提取文本特征的组件可以同时使用基于规则的和基于文本嵌入向量的组件。
spacyNLP
MitieNLP
JiebaTokenizer
MitieTokenizer
spaCyTokenizer
MitieFeatuizer
spaCyFeatuizer
ConveRTFeatuizer
LanguageModelFeaturizer
RegexFeatuizer
LexicalSyntacticFeaturizer
CRFEntityExtractor
spaCyEntityExtractor
DucklingHTTPExtractor
EntitySynonymMapper
DIENTClassifer
RegexEntityExtractor
MitiieIntentClassifier
SklearnIntentClassifier
KeywordIntentClassifier
DIETClassifier
FallbackClassifier
NLU 负责实体和意图识别,大体上NLU配置文件可以分为3个主要的键“recipe、language、pipeline
输出内容主要包含Text、intent、entities,分别表示请求文本、意图识别和实体识别
意图字段中不能包含“/”字符,
- 具有synonym键表明当前的对象是用来存储同义词信息的。例如,西红柿是番茄的同义词,后者更为正式。在启动EntitySynonymMapper组件(后续章节将会介绍)的情况下,推理时会将得到的实体值的同义词替换成它的“标准词”。提取的实体值无论是蕃茄、西红柿,还是洋柿子,都会将实体的具体值替换成“标准词”:番茄。这个特性只会修改实体的值,并不会影响实体的类型。注意:同义词是在实体被识别后实体的值被替换成标准值的过程中使用的,因此同义词定义不会对实体识别的提高有帮助,只会帮助后续对话处理动作更统一地处理实体的值。
- lookup:查找表字段。具有lookup键表明当前的对象是用来存储查找表的。在实体识别和意图识别的时候,如果开发者能给这些组件一些额外的特征,那么将提高这些组件的准确度。其中一种方式就是提供一个特征词列表,这个特征词列表就是查找表。
- language:en→zh
- pipeline:组件
- Rasa中JiebaTokenizer、LanguageModelTokenizer、DIETClassifier各自的作用及区别
- DIETClassifier作
- DIETClassifier是一种意图分类和实体提取的深度学习模型。基于Transformers的结构,使用了一个双向的循环神经网络来处理文本,并生成一个上下文相关的表示。这个表示同时包括了文本中的语义信息、实体信息及对话历史信息。
- 使用 DIETClassifier 可以显著提高机器人的性能,因为它可以从更全面的角度理解用户的输入,并精确地确定用户的意图和提取所需的实体信息。此外,DIETClassifier 还可以通过正则化、Dropout等技巧来避免过拟合,从而提高模型的泛化能力。总之,DIETClassifier 是 Rasa 机器人的核心组件之一,可以大幅提升机器人的智能水平和交互效果。
- rasa 中 LanguageModelFeaturizer 与 DIETClassifier 的区别
- 在 Rasa 中,LanguageModelFeaturizer 和 DIETClassifier 都是用于意图分类和实体提取的关键组件,但它们的作用不同。
- LanguageModelFeaturizer 主要用于将输入文本转换成句子嵌入向量(sentence embedding vector),这些向量捕捉了文本中的语义信息。它使用预训练的语言模型来生成这些句子嵌入向量,例如 Google 的 BERT 模型或 OpenAI 的 GPT-3 模型。在生成这些向量后,LanguageModelFeaturizer 将其传递给 DIETClassifier,DIETClassifier 然后使用这些向量来进行意图分类和实体提取。
- 相对应地,DIETClassifier 是一个深度学习模型,它接受从LanguageModelFeaturizer传递过来的句子嵌入向量,并结合一定数量的对话历史信息,通过神经网络计算得出一系列分类结果,包括意图、实体、情感等信息。DIETClassifier 不仅可以对每个用户输入进行意图分类和实体提取,而且还可以自动根据上下文生成机器人的回复。
- 总之,LanguageModelFeaturizer 和 DIETClassifier 这两个组件在 Rasa 机器人中通常是必需的,因为它们能够有效地捕获用户输入中的语义信息并提高机器人的性能。但是,它们的作用是有所不同的:LanguageModelFeaturizer 生成句子嵌入向量,DIETClassifier 则使用这些向量进行分类和回复生成。
- rasa 中 LanguageModelFeaturizer 与 JiebaTokenizer 的区别
- JiebaTokenizer 主要是用于对中文文本进行分词和词性标注。它会根据用户输入的句子将其分割成一个个单独的词语,并为每个词语添加一个标记表示其词性。这样做有助于提高机器人对中文文本的理解能力,从而更准确地进行意图分类和实体提取。
- 相比之下,LanguageModelFeaturizer 则主要用于生成句子嵌入向量,帮助 DIETClassifier 模型更好地理解输入文本中的语义信息。它使用预训练的语言模型(例如 BERT 或 GPT-3)来计算出句子嵌入向量,并将其传递给 DIETClassifier 进行意图分类和实体提取。
- 总之,JiebaTokenizer 和 LanguageModelFeaturizer 都是 Rasa 机器人中非常重要的组件,但它们的作用不同。JiebaTokenizer 用于将中文文本进行分词和词性标注,帮助机器人更好地理解用户输入;而 LanguageModelFeaturizer 则用于生成句子嵌入向量,帮助 DIETClassifier 更好地理解输入文本中的语义信息。
- DIETClassifier作
Rasa core 是rasa 体系中负责对话管理的部分,主要职责是记录对话的过程和选择下一个动作。
在Rasa中,以**utter_**开头的动作表示玄滩同名的模版并发给用户,这属于一种特殊的约定。
Rasa支持开发者自定义动作。
4.2.1. 回复动作
4.2.2. 表单
4.2.3. 默认动作
4.2.2. 自定义动作
词槽slots定义了机器人在对话过程中需要跟踪的信息。domain.yml
- influence_conversation来设置该词槽对对话过程是否有影响。influence_conversation:true默认,为false时,该词槽仅用于存储信息,不会影响对话行为。
4.3.1. 词槽的映射
映射(mapping)指定了在对话过程中如何自动地为这个词槽赋值。一个词槽可以同时有多个映射,在运行时会按照从上到下的顺序依次执行。在每一个映射中,type字段给出了这个映射的类型,其余的字段都是这个类型的参数,和type字段密切相关。如下就是一个词槽映射的示例。
本例中只有一个映射。这个映射的type为from_entity。这种类型的映射表示将读取某个实体的值来赋值词槽。具体使用哪个实体,将由参数entity来指定(本例中是entity_name)。Rasa提供了丰富的词槽映射方案,可以满足各种需求
Rasa的模板字符串支持变量,并支持随机选择任一模板。utter_greet中的{name}是一个变量或占位符,在渲染时会被实际的名为name的词槽的真实值替换,也可以在自定义渲染模板时通过类似dispatcher.utter_message(template="utter_greet",name="Silly")来给出模板变量{name}的实际值(Silly)。
会话 session指 用户和机器人之间的一轮对话。一个会话可能横跨很多轮对话。目前Rasa支持的会话配置有session_expiration_time 【表示在用户的最新消息多久后,会话被认为过期】和 carry_over_slots_to_new_session【当新的会话开始时,是否应该将上一个会话的词槽延续到新的会话】。
Rasa目前只有一个全局性配置选项:store_entities_as_slots。这个选项用于决定当得到NLU结果时,是否同步更新同名的词槽,其默认值为true。
Rasa是通过story的方式来学习对话管理知识的。故事是一种在较高的层次上记录对话过程的方式。故事不仅需要记录用户的语义表达,还需要记录系统内部正确的状态变化。
故事本身的结构是字典,必须要有的键是story和steps。story键给出的值代表这个故事的备注(上例中是“这是一个story描述”),用于给开发者提供关于这个故事的一些信息。
策略policy负责学习故事,从而预测动作。
策略需要通过特征提取组件featurizer将故事转成对话状态,进而得到对话状态特征,按照对话特征预测下一个对话动作。
在Rasa中,我们可以同时拥有多个策略,这些策略可独立进行训练和预测,最后通过优先级及预测分数共同决策。
4.8.1. 策略配置policy https://blog.csdn.net/qq_24729325/article/details/config.yml
endpoints.yml定义了Rasa Core和其他服务进行连接的配置信息,这种信息被称为端点(endpoint)。目前支持的端点有event broker、tracker store、lock store、动作服务器(action server)、NLU服务器、NLG服务器和model storage。
Rasa本身包含Rasa SDK,所以安装了Rasa也就自动安装了Rasa SDK。如果只使用Rasa SDK而不想安装Rasa(如在生产环境中),那么可以按照如下方式安装。
通过重写name()方法返回一个字符串,可以向服务器申明这个动作的名字。
通过重写run()方法,开发者可以获得当前的对话信息(tracker对象和领域对象)和用户消息对象(dispatcher)。开发者可以利用这些信息来完成业务动作。如果想对当前的对话状态进行更改(如更改词槽),则需要通过返回事件(event)(可以是多个事件)的形式发送给Rasa服务器。即使对话状态没有发生任何变化,也需要返回一个空的列表。
5.2.1. tracker对象
5.2.2. 事件对象 event
在自定义动作中,如果想要更改对话状态,则需要用到事件(event)对象。
Rasa WebChat使用的底层协议是socketio,所以配置里使用的是socketio。
多数对话机器人都需要有简单的FAQ(Frequently Asked Question,常见问题解答)和闲聊(chitchat)的功能。在一般情况下,FAQ和闲聊的问答数量很多。如果想用一个意图来表示一个FAQ或闲聊并为之搭配一个动作,那么这个故事写起来将会非常繁杂,从而导致整个过程非常低效。幸运的是,Rasa提供了NLU组件ResponseSelector来做这种FAQ型或闲聊型的任务。使用ResponseSelector,需要为每种问题定义一种分类,并为每种分类定义想要返回给用户的答案。
ResponseSelector需要采用group/intent的格式命名。group部分称为检索意图(retrieval intent)
例中的意图chitchat/ask_name和chitchat/ask_age都属于检索意图chitchat。
在ResponseSelector中,使用domain.yml的responses字段来存放答案数据。这里有一个约定,Rasa中意图名为intent的问题都需要有一个名为utter_intent的response作为答案。以下是一段示例的答案定义。
为了根据问题智能(具有良好的泛化能力)地进行回答,需要让ResponseSelector在现有数据上进行训练。训练部分相当简单,只需要将ResponseSelector组件加入NLU的流水线即可,如下所示。
本文地址:http://sicmodule.glev.cn/quote/9565.html 歌乐夫 http://sicmodule.glev.cn/ , 查看更多