Rasa开发使用 Rasa_NLU及Rasa_Core模型训练与测试

article/2025/9/19 18:55:56

文章目录

    • Rasa
      • 术语
    • Rasa_NLU
      • 1. Pipeline
      • 2. 准备工作:训练MITIE模型文件
      • 3. rasa_nlu 语料
      • 4. 训练模型
      • 5. 测试验证
    • Rasa Core
      • 1. Stories
        • 可视化stories
      • 2. Domain
      • 3. 训练对话模型
        • 测试对话模型
    • 测试聊天机器人

Rasa

Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。
Rasa有两个主要模块:

  • Rasa NLU :用于理解用户消息,包括意图识别和实体识别,它会把用户的输入转换为结构化的数据。
  • Rasa Core:是一个对话管理平台,用于举行对话和决定下一步做什么。

Rasa X是一个工具,可帮助您构建、改进和部署由Rasa框架提供支持的AI Assistants。 Rasa X包括用户界面和REST API。
在这里插入图片描述

Rasa官方文档: Build contextual chatbots and AI assistants with Rasa

github地址:RasaHQ/rasa

pip安装

pip install rasa_nlu
pip install rasa_core[tensorflow]

此图显示了使用Rasa构建的助手如何响应消息的基本步骤:
在这里插入图片描述

术语

  • intents:意图
  • pipeline
  • story:Core model 以训练“stories”的形式从真实的会话数据中学习。故事是用户和助手之间的真实对话.
  • domain:定义了助手所处的universe:它应该获得的用户输入,应该能够预测的操作,如何响应以及要存储的信息
    在这里插入图片描述

Rasa_NLU

Rasa NLU曾经是一个独立的库,但它现在是Rasa框架的一部分。

Rasa_NLU是一个开源的、可本地部署并配套有语料标注工具RASA NLU Trainer。其本身可支持任何语言,中文因其特殊性需要加入特定的tokenizer作为整个流程的一部分。

Rasa NLU 用于聊天机器人中的意图识别实体提取。例如,下面句子:

"I am looking for a Mexican restaurant in the center of town"

返回结构化数据:

{"intent": "search_restaurant","entities": {"cuisine" : "Mexican","location" : "center"}
}

Rasa_NLU_Chi 作为 Rasa_NLU 的一个 fork 版本,加入了jieba 作为中文的 tokenizer,实现了中文支持。

该部分简单介绍基于 Rasa_NLU_Chi 构建一个本地部署的特定领域的中文 NLU 系统的过程。

目标

  • 输入: 中文测试文本
  • 输出: 结构化的数据,识别出文本中对应的意图和实体

1. Pipeline

rasa nlu 支持不同的 Pipeline,其后端实现可支持spaCy、MITIE、MITIE + sklearn 以及 tensorflow,其中 spaCy 是官方推荐的,另外值得注意的是从 0.12 版本后,MITIE 就被列入 Deprecated 了。

本例使用的 pipelineMITIE+Jieba+sklearn, rasa nlu 的配置文件config_jieba_mitie_sklearn.yml如下:

language: "zh"pipeline:
- name: "nlp_mitie"model: "data/total_word_feature_extractor_zh.dat"  // 加载 mitie 模型
- name: "tokenizer_jieba"   // 使用 jieba 进行分词
- name: "ner_mitie"   // mitie 的命名实体识别
- name: "ner_synonyms"
- name: "intent_entity_featurizer_regex"
- name: "intent_featurizer_mitie"  // 特征提取
- name: "intent_classifier_sklearn" // sklearn 的意图分类模型

2. 准备工作:训练MITIE模型文件

由于在pipeline中使用了MITIE,所以需要一个训练好的MITIE模型(先进行中文分词)。MITIE模型是非监督训练得到的,类似于word2vec中的word embedding,需要大量中文语料,训练该模型对内存要求较高,并且非常耗时,直接使用网友分享的中文的维基百科和百度百科语料生成的模型文件。

链接:https://pan.baidu.com/s/1kNENvlHLYWZIddmtWJ7Pdg 密码:p4vx

3. rasa_nlu 语料

得到MITIE词向量模型之后,就可以使用标注好语料训练Rasa NLU模型。
Rasa提供了数据标注平台: rasa-nlu-trainer

那标注好的数据是什么样的呢?

标注好的语料存储在json文件中,具体格式如下所示,包含textintententities,实体中startend是实体对应在text中的起止index

data/examples/rasa/demo-rasa_zh.json为例:

{"rasa_nlu_data": {"common_examples": [{"text": "你好","intent": "greet","entities": []},{"text": "我想找地方吃饭","intent": "restaurant_search","entities": []},{"text": "我想吃火锅啊","intent": "restaurant_search","entities": [{"start": 2,"end": 5,"value": "火锅","entity": "food"}]}]}
} 

4. 训练模型

到目前,已经获取了训练所需的标注好的语料,以及词向量模型MITIE文件。接下来就可以训练Rasa_NLU模型了。

插一句 安装:

  • 源码安装
    $ git clone https://github.com/crownpku/Rasa_NLU_Chi.git // clone 源码$ cd Rasa_NLU_Chi$ python setup.py install  // 安装依赖
    

模型训练命令

python -m rasa_nlu.train -c sample_configs/config_jieba_mitie_sklearn.yml --data data/examples/rasa/demo-rasa_zh.json --path models --project nlu

所需参数:

  • 训练配置文件:-c
  • 训练语料:--data
  • 模型保存路径:--path
  • 项目名称:--project

模型训练完成后,会在--path指定的路径下保存训练好的模型文件,如果训练时指定了模型名称(即–project),模型就会存储在models/project_name/model_**目录中,如models/chat_nlu_test/model_20190821-160150
结构如下:
在这里插入图片描述

5. 测试验证

  • 启动服务
    python -m rasa_nlu.server -c sample_configs/config_jieba_mitie_sklearn.yml --path models
  • 测试服务(打开一个新的终端,使用curl命令获取结果)
    curl -XPOST localhost:5000/parse -d '{"q":"明天天气预报", "project":"nlu", "model":"model_20190821-160150"}'

结果如下:
在这里插入图片描述

Rasa Core

Rasa Core是用于构建AI助手的对话引擎,是开源Rasa框架的一部分。

Rasa Core消息处理流程
由前面描述的对话管理模块了解到,它应该是负责协调聊天机器人的各个模块,起到维护人机对话的结构和状态的作用。对话管理模块涉及到的关键技术包括对话行为识别、对话状态识别、对话策略学习以及行为预测、对话奖励等。下面是Rasa Core消息处理流程:
在这里插入图片描述

  • 首先,将用户输入的Message传递到Interpreter(NLU模块),该模块负责识别Message中的"意图(intent)“和提取所有"实体”(entity)数据;
  • 其次,Rasa Core会将Interpreter提取到的意图和识别传给Tracker对象,该对象的主要作用是跟踪会话状态(conversation state);
  • 第三,利用policy记录Tracker对象的当前状态,并选择执行相应的action,其中,这个action是被记录在Track对象中的;
  • 最后,将执行action返回的结果输出即完成一次人机交互。

Rasa Core包含两个内容: storiesdomain

  • domain.yml:包括对话系统所适用的领域,包含意图集合,实体集合和相应集合
  • story.md:训练数据集合,原始对话在domain中的映射。

1. Stories

stories可以理解为对话的场景流程,我们需要告诉机器我们的多轮场景是怎样的。Story样本数据就是Rasa Core对话系统要训练的样本,它描述了人机对话过程中可能出现的故事情节,通过对Stories样本和domain的训练得到人机对话系统所需的对话模型。

Stories存储在md文件中。story的符号说明如下:

符号说明
##sotry标题
*意图和填充的slot
-动作

示例:

## simple_story_with_multiple_turns
* affirm OR thank_you- utter_default
* goodbye- utter_goodbye
> check_goodbye## story_04649138
* greet- utter_ask_howcanhelp
* inform{"location": "london", "people": "two", "price": "moderate"}- utter_on_it- utter_ask_cuisine
* inform{"cuisine": "spanish"}- utter_ask_moreupdates
* inform{"cuisine": "british"}- utter_ask_moreupdates
* deny- utter_ack_dosearch- action_search_restaurants- action_suggest
* affirm- utter_ack_makereservation
* thankyou- utter_goodbye

如上所示,几个需要注意的点:

  • > check_*: 用于模块化和简化训练数据,即story复用。
  • OR :用于处理同一个story中可能出现2个以上意图,这有利于简化story,但是相应的训练时间等于训练了两个以上的故事,不建议密集使用。

可视化stories

Rasa Core中提供了rasa_core.visualize模块可视化故事,有利于掌握设计故事流程。
命令:

python -m rasa_core.visualize -d domain.yml -s data/sotries.md -o graph.html -c config.yml

参数:

  • -m:指定运行模块
  • -d:指定domain.yml文件路径
  • -s:指定story路径
  • -o:指定输出文件名
  • -c:指定Policy配置文件。

最终,在项目根目录下得到一个graph.html,可用浏览器打开。

具体实现,可参考源代码rasa/core/visualize.py

from rasa_core.agent import Agent
from rasa_core.policies.keras_policy import KerasPolicy
from rasa_core.policies.memoization import MemoizationPolicyif __name__ == '__main__':agent = Agent("domain.yml", policies=[MemoizationPolicy(), KerasPolicy()])agent.visualize("data/stories.md", output_file="graph.html", max_history=2)

在这里插入图片描述

2. Domain

domain.yml定义了对话机器人应知道的所有信息,相当于大脑框架,指定了意图intents, 实体entities, 插槽slots以及动作actions
其种,intentsentities与Rasa NLU模型训练样本中标记的一致。slot与标记的entities一致,actions为对话机器人对应用户的请求作出的动作。
此外,domain.yml中的templates部分针对utter_类型action定义了模板消息,便于对话机器人对相关动作自动回复。

说明
intents意图
entities实体信息
slots词槽,对话中想要跟踪的信息
actions机器人作出的动作
templates回复的模板语句

意图intents

使用-符号表示每个意图

intents:- greet- goodbye- search_weather

实体entities

实体,即样本中标出的所有entity

entities:- city

槽slot

插槽是机器人的记忆。它们充当键值存储器,其可用于存储用户提供的信息(例如,他们的家乡)以及关于外部世界收集的信息(例如,数据库查询的结果)。
以天气查询为例,对话机器人必须知道地点和日期才可以查询,因此在domain.yml中需要在slots部分定义两个插槽,即citydatatime,而matches则用来存储最后查询的结果。示例如下:

slots:city:type: textinitial_value:"北京"datatime:type:textinitial_value:"明天"matches:type:unfeaturizedinitial_value:"none"

Slot Types类型:

  • Text Slot :文本
  • Boolean Slot:布尔值
  • Categorical Slot:接受枚举所列的值
    slots:risk_level:type: categoricalvalues:- low- medium- high
    
  • Float Slot:浮点型
    slots:temperature:type: floatmin_value: -100.0max_value:  100.0
    
    Defaults: max_value=1.0, min_value=0.0
    设置max_value和min_value后,大于max_value和小于min_value的值被设为max_value和min_value。
  • List Slot:列表型数据,且长度不影响对话
  • Unfeaturized Slot:存储不影响会话流程的数据。

如果值本身很重要,请使用categoricalbool槽。还有floatlist slots。如果您只想存储一些数据,但不希望它影响会话流,请使用unfeaturized的插槽。type表示slot存储的数据类型,initial_value为slot初始值,该值可有可无(无意义)。

slots:name:type: textinitial_value: "human"matches:type:unfeaturized

actions
当Rasa NLU识别到用户输入信息的意图后,Rasa Core对话管理模块会对其作出回应,回应的操作就是action。
Rasa Core支持三种action:

  • default actions:默认的一组动作,无需定义,可以直接使用
    • action_listen:监听action
    • action_restart:重置状态
    • action_default_fallback:当Rasa Core得到的置信度低于设置的阈值时,默认执行该动作。
  • utter actions:以utter_为开头,只发送一条信息给用户作为反馈的动作。
    定义很简单,只需在domain.yml文件中的actions:字段定义以utter_为开头即可。具体的回复内容将被定义在templates部分。如果没有utter_这个前缀,那么action就会被识别为custom actions。
    actions:- utter_greet- utter_cheer_up
    
  • custom actions:自定义动作,允许开发者执行任何操作并反馈给用户,是action多轮的关键点。需要在domain.yml文件中的actions部分先定义,然后在指定的webserver中实现它。其中,webserver的url地址在endpoint.yml文件中指定。
    官方提供了一个小的python sdk来方便用户编写自定义的action,首先需要安装一下对应的rasa_core_sdk。后续再讲。。
    actions:- action_search_weather
    

templates
此次定义了utter actions具体的回复内容,且每个utter actions下可以定义多条回复信息。当用户发起一个意图,比如"你好!",就触发utter_greet操作,Rasa Core会从该action的模板中自动选择其中的一条信息作为结果反馈给用户。

templates:utter_greet:- text: "您好!请问我可以帮到您吗?"- text: "您好!请说出您要查询的具体业务,比如跟我说'查询身份证号码'"- text: "您好!"

utter_default是Rasa Core默认的action_default_fallback,当Rasa NLU识别该意图时,它的置信度低于设定的阈值时,就会默认执行utter_default中的模板。

除了回复简单的Text Message,Rasa Core还支持在Text Message后添加按钮和图片,以及访问插槽中的值(如果该插槽的值有被填充的话,否则返回None)。举个栗子:

  utter_introduce_self:- text: "您好!我是您的AI机器人呀~"image: "https://i.imgur.com/sayhello.jpg"utter_introduce_selfcando:- text: "我能帮你查询天气信息"buttons:- title: "好的"payload: "ok"- title: "不了"payload: "no"utter_ask_city:- text: "请问您要查询{ datetime }哪里的天气?"  utter_ask_datetime:- text: "请问您要查询{ city }哪天的天气"

一个示例:

intents:- greet- goodbye- affirm- deny- search_weatherslots:city:type: textmatches:type: unfeaturizedentities:- cityactions:- utter_greet- utter_cheer_up- utter_did_that_help- utter_happy- utter_goodbyetemplates:utter_greet:- text: "Hey! How are you?"utter_cheer_up:- text: "Here is something to cheer you up:"image: "https://i.imgur.com/nGF1K8f.jpg"utter_did_that_help:- text: "Did that help you?"utter_happy:- text: "Great carry on!"utter_goodbye:- text: "Bye"utter_default:- text: "小x还在学习中,请换种说法吧~"- text: "小x正在学习中,等我升级了您再试试吧~"- text: "对不起,主人,您要查询的功能小x还没学会呢~"

3. 训练对话模型

准备好domain.yml和sotries.md数据之后,就可以进行模型的训练了。
模型的输入数据是历史对话记录,lable是下一个决策action。模型本质上是num_actions个类别的多分类。

训练命令如下:

python -m rasa_core.train -d domain.yml -s stories.md -o models/chat1

参数解释:

  • -d或--domain:指domain.yml文件的路径
  • -s或--stories:指定stories.md文件路径。可以将故事请假保存在一个md文件中,也可以分类保存在多个md文件中(存放到一个目录下)
  • -o或--out:指对话模型的输出路径,保存训练好的模型文件
  • -c或--c:指定Policy规范文件

训练所需数据示例:

  • domain.yml文件:
    intent:- greet- goodbye- search_weather
    entities:- city
    actions:- utter_greet- utter_goodbye- utter_ask_city
    templates:utter_greet:- text: "你好啊"- text: "又见面了"utter_goodbye:- text: "再见"- text: "下次再见啊"utter_ask_city:- text: "请问您要查询哪里的天气?"
    
  • stories.md文件:
    ## search weather
    * greet- utter_greet
    * search_weather{ "datatime" : "明天"}- utter_ask_city
    * goodbye- utter_goodbye
    

训练网络结构:
在这里插入图片描述
生成模型文件如下:
在这里插入图片描述

测试对话模型

经过训练,我们已经得到了对话模型,那现在我们就来测试一下。

测试命令如下:

python -m rasa_core.run -d models/chat1

参数-d:指定模型路径

注:此时测试rasa_core对话模型,并没有加入core_nlu模型,因此还无法进行意图识别,只能够根据已知的意图(输入意图)返回特定的答案。因此,我们测试的时候,需要手动输入在domain.yml中定义好的意图,输入意图以/符号开头。
如输入greet意图:/greet
在这里插入图片描述

测试聊天机器人

通过前面的步骤,已经训练了Rasa_nlu的意图识别模型和Rasa_Core的对话模型。接下来就进行两者的整体的测试。

  • 输入:待测试文本
  • 输出:机器人回应
  • 中间过程:包含意图识别、实体识别和会话流程

测试命令
python -m rasa_core.run -d models/chat1 -u models/nlu/model_20190820-105546

参数解释;

  • -d:modeldir 指定对话模型路径(即Rasa_core训练的模型路径)
  • -u:Rasa NLU训练的模型路径
  • --port:指定Rasa Core Web应用运行的端口号
  • --credentials:指定通道(input channels)属性
  • --endpoints:用于指定Rasa Core连接其他web server的url地址,比如nlu web
  • -o:指定log日志文件输出路径
  • --debug:打印调试信息。在显示的信息中,我们可以看到输入message后Rasa NLU模型是否识别出意图、实体及其置信度信息。槽位的填充以及policy预测的下一个action信息。

在这里插入图片描述

加入--debug参数后打印出的调试信息如下:
在这里插入图片描述

参考博文:
Rasa_NLU_Chi 中文处理实践 · Spring Boot
Rasa Core开发指南
Rasa使用指南01 - u012526436的博客 - CSDN博客


http://chatgpt.dhexx.cn/article/oFQyKyoy.shtml

相关文章

浅读Rasa3.2.5源码(rasa train、rasa shell)

目录 浅读Rasa3.2.5源码(rasa train、rasa shell)一、 分析 __main__.py(1). 解析main.py的部分代码(2). rasa常用命令 二、 训练阶段(1). 准备训练数据(2). …

2.rasa架构

rasa架构 消息处理 此图显示了使用Rasa构建的助手如何响应消息的基本步骤: 这些步骤分别是: 1. 收到消息并将其传递给解释器(Interpreter),解释器将其转换为包含原始文本,意图和找到的任何实体的字典。这部分由NLU处理。 2. 跟踪…

Rasa -流程

Rasa入门笔记1 -流程 一、Rasa是什么二、Rasa工作流程 一、Rasa是什么 Rasa是一个nlp开源机器学习框架,用于构建问答与多轮对话机器人。 二、Rasa工作流程 Rasa分为两个模块NLU模块与Core模块,NLU 一>用于提取意图与实体,Core一>用于…

Rasa-X 部署

Rasa-X 部署(docker版) 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明,违反必究。 本文链接:https://blog.csdn.net/junxing2018_wu/article/details/106638599 说明: do…

Rasa系列教程(二) -- Rasa NLU基础

目录 前言 一、训练数据 1.1 意图字段(intent) 1.2 同义词字段(synonym) 1.3 查找表字段(lookup) 1.4 正则表达式字段(regex) 1.5 查找表和正则表达式的使用 二、组件 2.1 …

RASA框架介绍

关于RASA一个机器学习框架,用于构建基于文本和语音的聊天机器人。框架完整,可扩展性,易用性高,高效灵活。2.0新版本统一训练数据格式,配置文件和模型处理方式。 在最新版的rasa里已经集成了bert模型和xlnet&#xff0c…

rasa的使用

文章目录 rasa的使用一. 安装二. 创建一个简单的语音助手三、命令行四 rasa整体流程参考 rasa的使用 一. 安装 rasa有NLU和core两个模块,可以使用pip全部安装,默认是基于tensorflow2.1版本的 直接使用pip安装 # 创建一个python是3.6.8的环境 conda cr…

Rasa

Rasa NLU是一种开源自然语言处理工具,用于聊天机器人中的意图分类和实体提取;主要是理解用户意图,配合rasa_core使用可以实现AI对话。 参考文献 Rasa介绍 对话系统、产品与技术by清华 Rasa开发使用 Rasa_NLU及Rasa_Core模型训练与测试by冰蓝 …

Rasa使用指南02

转载请注明出处,原文地址 Rasa使用指南01 前言 最近工作很忙,重心也一直在模型方面,例如BERT、GPT-2等等,对于Rasa系列的博文实在是没有时间更新。最近有不停的收到一些小伙伴发来的信息,希望能看到Rasa使用指南02&…

rasa - http api测试

rasa - http api测试 rasa run --enable-api --cors "*" 仅解析意图 请求地址:localhost:5005/model/parse 命令行 curl -X POST localhost:5005/model/parse -d ‘{“text”: “hello”}’ 代码示例 import json import requestsurl "http://…

rasa 介绍文档

重磅推荐专栏: 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers,轻松构建属于自己的NLP智能应用! 1. Rasa介绍 1.1 架构 Rasa Open Source: NLU (理解语义) Core (决定对话中每一步执行的actions)Rasa SDK: Action …

Rasa 问答

开发一个智能对话系统用什么工具? Rasa是Conversational AI在智能业务对话领域工程落地全球最为成功对话机器人系统,是基于Transformer架构的全球使用最广泛的智能业务对话机器人框架,是NLP技术的集大成者。在当今全球范围各项对比指标综合成…

Rasa Core开发指南

文章目录 1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core 2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots 3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型 4. 搭建CustomActions服…

Rasa使用指南01

转载请注明出处,原文地址: https://terrifyzhao.github.io/2018/09/17/Rasa%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%9701.html Rasa使用指南02 前言 本文内容基于Rasa官网文档,做了翻译与整理,并添加一些自己的理解,方便…

Rasa安装

下载 Rasa https://download.csdn.net/download/Da___Vinci/12404001 Rasa-x https://download.csdn.net/download/Da___Vinci/12403992 安装 找个位置存放,cd到那个目录执行安装,注意你的pip版本,我的是3.7,如果装了多个pyhon&#xf…

RASA介绍

引言 自然语言是人类表达情感、观念的主要工具和人类思维的重要载体,而最常见的自然语言应用场景则是对话。人们希望通过自然语言控制机器,甚至实现机器与人类的对话与交流。使用自然语言作为输入输出的媒介,会使用户获得更自然友好的人机交互…

关于Rasa你必须要知道的几件事

关于Rasa你必须要知道的几件事 1、为什么选择Rasa 2、Understanding the Rasa NLU Pipeline 3、Components in Rasa 4、DIET in Rasa 5、Dialogue Management in Rasa 2.0 6、TED Policy in Rasa 本文从一个high-level的角度对使用Rasa构建聊天助手的整个过程进行了总结&#x…

Rasa系列教程(一) -- 系统及各组件介绍

目录 前言 一、传统对话机器人架构 二、对话系统流程 2.1 ASR语音识别 2.2 NLU自然语言理解 2.3 DM对话管理 2.4 NLG自然语言生成 2.5 TTS语音合成 三、Rasa组件介绍 3.1 Rasa简介 3.2 Rasa安装 3.3 Rasa项目基本流程 3.4 Rasa常用命令 3.4 Rasa常用命令 ​​​​…

数据治理-数据标准

问题导读1.为什么要做数据标准管理?2.生产变更的标准管理主要解决了哪些问题?3.变更通知谁(影响范围)?4.业务元数据的标准管理主要解决了哪些问题? 一、为什么要做数据标准管理 数据治理的问题并不仅仅只…

数据治理效果差?掌握正确治理方法,解决企业数据问题

数字化时代,数据已经成为构建现代化社会的重要元素,也深深扎根于商业世界,成为无数企业经营管理中悉心培养的”明珠“。 然而,这些宝贵的数据是需要有人来照料、培养的,如果企业没有完善的数据治理方案,就…