Rasa_nlu和Rasa_core阅读
一,用户指南
1.架构
消息处理,此图显示了使用rasa构建消息响应的基本步骤:
步骤是:
1,消息被接受并且传递给Interpreter(解释器),它将源消息转化为包含原始文本,意图和实体
的字典。这部分由NLU处理。
2、Tracker(追踪器)是追踪并记录会话状态的对象,他接受新到来的消息。
3、policy接受当前Tracker的状态
4、policy选择下一个要使用的动作
5、选择的动作记录在Tracker中
6、向用户发送请求
2.模型评估
我们还可以调节nlu模型的超参数
https://blog.rasa.com/rasa-nlu-in-depth-part-3-hyperparameters/?_ga=2.185072874.2590330
68.1567321116-549374689.1567321116
3.常见的任务命令
命令
rasa init
rasa train
作用说明
使用示例训练数据,操作和配置文件创建新项目
使用你的NLU数据和故事训练模型,在 ./model 中保存训练的模型
rasa interactive
启动交互式学习会话,通过聊天创建新的训练数据
rasa shell
rasa run
加载已训练的模型,并让你在命令行上与助手交谈
使用已训练的的模型启动Rasa服务。有关详细信息,请参阅运行服务文
档
rasa run actions
使用Rasa SDK启动操作服务
rasa visualize
可视化故事
rasa test
使用你的测试NLU数据和故事测试已训练的Rasa模型
rasa data split nlu
根据指定的百分比执行NLU数据的拆分
rasa data convert
nlu
rasa x
rasa -h
4.创建新项目
在不同格式之间转换NLU训练数据
在本地启动Rasa X
显示所有可用命令
我们使用下面的命令来创建一个完整的项目:
1
rasa init
这将创建下面的文件:(项目结构)
随着文档的建立,我们需要熟悉这些命令:训练rasamo模型,与模型通信,测试模型;如果在
这里你只想训练core或者是nlu的话,我们可以这样训练rasa train core / rasa train nlu。
5.训练模型
注意:
使用rasa train训练模型时,确保Core和NLU的训练数据存在。如果仅存在一种模型类型的训练
数据,则该命令将根据提供的训练文件自动回退到rasa train nlu或rasa train core。
6.交互式学习
1
`rasa interactive`
如果使用 --model 参数提供训练模型,则使用提供的模型启动交互式学习过程。如果没有指定模
型,且没有其他目录传递给 --data 参数, rasa interactive 将使用位于 data/ 目录中的数据训练一
个新的Rasa模型。在训练初始模型之后,交互式学习会话开始。如果训练数据和配置没有改变,将跳过
训练。
注:交互式学习就是你的助手在学习的时候,记录和你的之间交流的对话内容,以此作为训练数
据。
7.可视化stroies
这实在浏览器界面以图的形式展示故事:
1
rasa visualize
通常, data 目录中的训练故事是可视化的。如果你的故事位于其他地方,则可以使用 --stories
指定其位置。
8.训练和测试数据拆分
下面的这个方法可以把nlu的训练数据拆为训练集和测试集
1
rasa data split nlu
你可以使用以下参数指定训练数据,百分比和输出目录:
9.在Markdown和JSON之间转换数据
要将NLU数据从LUIS数据格式,WIT数据格式,Dialogflow数据格式,JSON或Markdown转换为
JSON或Markdown,请运行:
1
rasa data convert nlu
注:这里是说训练数据的格式,我们可将其转为json或者是Markdown
10.消息和语音通道
如果您在本地计算机(即非服务器)上进行测试,则需要使用ngrok。这为您的机器提供了域
名,以便Facebook,Slack等知道将消息发送到本地计算机的位置。
要使您的助手在消息传递平台上可用,您需要在 credentials.yml 文件中提供凭据。运行 rasa
init 时会创建一个示例文件,因此最简单的方法是编辑该文件并在其中添加凭据。以下是Facebook凭
据的示例:
1
2
3
4
facebook:
verify: "rasa-bot"
secret: "3e34709d01ea89032asdebfe5a74518"
page-access-token:
"EAAbHPa7H9rEBAAuFk4Q3gPKbDedQnx4djJJ1JmQ7CAqO4iJKrQcNT0wtD"
11.nlu模型评估
模型评估详见(下同):http://rasachatbot.com/6_Evaluating_Models/
在标准的机器学习技术中,我们需要将一些数据作为测试集分开,我们可以使用下面的命令来将
数据分为训练集和测试集:
1
rasa data split nlu
你如果已经运行了上面的命令,我们可以使用下面命令,查看测试用例的状况:
1
rasa test nlu -u test_set.md --model models/nlu-20180323-145833.tar.gz
如果你不想创建单独的测试集,可以使用交叉验证来估计模型的泛化能力。
1
rasa test nlu -u data/nlu.md --config config.yml --cross-validation
12. 评估core模型
你可以使用评估命令在一组测试stories中评估训练模型:
1
rasa test core --stories test_stories.md --out results
这会将失败的故事打印到 results/failed_stories.md 。如果至少有一个操作被错误预测,我
们会将任何故事视为失败。
此外,这会将混淆矩阵保存到名为 results/story_confmat.pdf 的文件中。对于你域中的每个
操作,混淆矩阵会显示操作的正确预测频率以及预测错误操作的频率。
13.验证数据集
测试 域和数据 文件的错误
要验证域文件,NLU数据或故事数据中是否存在任何错误,请运行验证脚本。你可以使用以下命
令运行它:
1
rasa data validate
*:这里可以记录一下,这是个非常好的命令,他可以帮你检查错误,嗯,按时就先这么说吧
14.运行服务器
你可以使用经过训练的rasa模型来运行一个简单的HTTP请求:
1
rasa run -m models --enable-api --log-file out.log
各个参数分别代表:
1
1. -m: 包含Rasa模型的文件夹的路径
2. --enable-api: 启用此附加API
3. --log-file: 日志文件的路径
Rasa可以通过三种不同的方式加载你的模型:
1. 从服务获取模型(请参阅下面从服务获取模型)
2. 或从远程存储中获取模型(请参阅云存储)
3. 通过 -m 从本地存储系统加载指定的模型(上例中正是此条)
Rasa尝试按上述顺序加载模型,即如果没有配置模型服务和远程存储,它只会尝试从本地存储系统
加载模型。
1.从服务获取模型
你可以配置HTTP服务以从其他URL获取模型:
1
rasa run --enable-api --log-file out.log --endpoints my_endpoints.yml
详情请见:(http://rasachatbot.com/8_Running_the_Server/)
2.从远程存储中获取模型
你还可以配置Rasa服务以从远程存储中获取模型:
1
rasa run -m 20190506-100418.tar.gz --enable-api --log-file out.log --remote-
storage aws
模型被下载并存储在本地存储系统的临时目录中。有关更多信息,请参阅云存储。
3.安全注意事项
我们建议不要将Rasa服务暴露给外部世界,而是通过专用连接(例如,在docker容器之间)从后
端连接到它。
其中,内置了两种身份验证方法:
1.基于令牌的身份验证
启动服务时使用 --auth-token thisismysecret 传递令牌 :
1
2
3
4
5
rasa run \
-m models \
--enable-api \
--log-file out.log \
--auth-token thisismysecret
你的请求应该传递令牌,在我们的案例中是 thisismysecret 作为参数:
1
$ curl -XGET localhost:5005/conversations/default/tracker?
token=thisismysecret
2.基于JWT的身份验证
使用 --jwt-secret thisismysecret 启用基于JWT的身份验证。对服务的请求需要在使用此密钥和
HS256算法签名的 Authorization 头部中包含有效的JWT令牌。
用户必须具有 username 和 role 属性。如果 role 是 admin ,则可以访问所有端点。如果 role 是
user ,则只有 sender_id 与用户的 username 匹配时才能访问具有 sender_id 参数的端点。
1
2
3
4
5
1
2
3
4
rasa run \
-m models \
--enable-api \
--log-file out.log \
--jwt-secret thisismysecret
你的请求应该设置正确的JWT头部:
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ"
"zdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIi"
"wiaWF0IjoxNTE2MjM5MDIyfQ.qdrr2_a7Sd80gmCWjnDomO"
"Gl8eZFVfKXA6jhncgRn-I"
15.端点配置
二、NLU
1.只是用NLU
1.训练仅限NLU模型
仅训练nlu运行下面命令:
1
rasa train nlu
这将在 data/ 目录中查找NLU训练数据文件,并在目录中保存训练有素的模型 models/ 。模型的
名称将以 nlu- 。
2.命令行测试nlu
运行命令如下:
1
rasa shell nlu
或者,您可以省略 nlu 参数并直接传入nlu-only模型:
1
rasa shell -m models/nlu-20190515-144445.tar.gz //-m 之后是模型地址
3.运行NLU服务
要使用NLU模型启动服务器,请在运行时传入模型名称:
1
rasa run --enable-api -m models/nlu-20190515-144445.tar.gz
然后你可以使用 /model/parse端点从模型请求预测。
1
curl localhost:5005/model/parse -d '{"text":"hello"}'
2.训练数据的格式
1.markdown 数据格式
实例以意图作为分组,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## intent:check_balance
- what is my balance
- how much do I have on my [savings](source_account)
- how much do I have on my [savings account](source_account:savings)
- Could I pay in [yen](currency)?
## intent:greet
- hey
- hello
## synonym:savings
- pink pig
## regex:zipcode
- [0-9]{5}
## lookup:currencies
- Yen
- USD
- Euro
## lookup:additional_currencies
path/to/currencies.txt
Rasa NLU的培训数据结构分为以下几个部分:
common examples
synonyms
regex features and
lookup tables
common example是唯一强制性的部分,它有助于NLU模型使用更少的例子来学习domain,也更
加有利于预测。
synonyms将映射被提取的实体到相同的名字,比如映射“my savings acccount ” 到“savings”。
lookup 查找表可以直接指定为列表,也可以指定为包含换行分隔的单词或短语的txt文件。加载训
练数据后,这些文件用于生成不区分大小写的正则表达式模式,并将其添加到正则表达式特性中。
2. json格式
json格式由这些部分组成:顶层对象rasa_nlu_data、和键 common_examples ,
entity_synonyms and regex_features 。其中最重要的是common_examples。具体格式如下:
{
"rasa_nlu_data": {
"common_examples": [],
"regex_features" : [],
"lookup_tables" : [],
"entity_synonyms": []
}
1
2
3
4
5
6
7
8
common_examples 用来训练模型,你应该把你所有的训练例子都放入 common_examples ,正则
特征是一种帮助分类器检测实体或意图并提高性能的工具。
3.提高意图分类和实体识别
1.Common Examples
公共的例子有三个组件,text,intent和entities。前两个都是字符串,而最后一个是数组。
text使用户的消息
intent是意图,应该和text相关联
entities是text需要被识别的特殊部分
entity由一个开始值和一个结束值指定,这些值一起使python样式范围应用于字符串,比如下面
这个例子,text='show me chinese restaurants' ,然后text[8:15] == “Chinese”。entity可以包含多个
单词,实际上value字段不必与示例中的子字符串完全对应。这样,您就可以将同义词或拼写错误映射
到相同的值上。
1
2
## intent:restaurant_search
- show me [chinese](cuisine) restaurants
2.正则表达式的功能
正则表达式可用于支持意图分类和实体提取。例如,如果您的实体具有确定性结构(如邮政编码
或电子邮件地址),则可以使用正则表达式来轻松检测该实体。对于zipcode示例如下:
1
2
3
4
5
## regex:zipcode
- [0-9]{5}
## regex:greet
- hey[^\\s]*
名称(name)不定义实体也不定义意图,它只是一个人类可读的描述,让您记住这个正则表达
式的用途,并且是相应模式特征的标题。 正如您在上面的示例中所看到的,您还可以使用正则表达式功
能来提高意图分类性能。
尽量使用更加少的单词的方式去创建你的正则表达式,例如:使用 hey[^\s]* 而不是
hey.* ,因为前者可能是一个单词,而后者是一段话。
实体提取的正则表达式功能目前仅由 CRFEntityExtractor 组件支持!