Adline125's Blog

NLP Engineer, Google Developers Expert

0%

Rasa NLU架构解析

本文是对著名对话机器人开源框架Rasa NLU架构的解析。Rasa是一套开源机器学习框架,用于构建基于上下文的AI小助手和聊天机器人。Rasa有两个主要模块:Rasa NLU 用于对用户消息内容的语义理解;Rasa Core 用于对话管理(Dialogue management)。本文主要针对Rasa NLU各部分做细节上的说明。

本文更多关注算法,主要内容如下:

  • Rasa NLU总体架构图
  • Rasa NLU训练流程解析
  • Rasa NLU推理流程解析

Rasa NLU 总体架构图

274

注:(1)FallbackClassifier应出现在某一个意图分类器之后,利用其输出的结果,即intent、confidence、intent ranking,如果意图的置信度比预设的threshold低,或排名前两位的意图的置信度的差距小于预设的ambiguity_threshold,则将该输入的意图分类为“nlu_fallback”

Rasa NLU训练流程解析

571

rasa.model_training.train_async: 读取config, domain和训练data到file_importer: TrainingDataImporter, 并输入到_train_async_internal训练Rasa model (nlu and core).

rasa.model_training._train_async_internal: 判定模型需要重新训练的部分并将判定结果写入fingerprint_comparison作为_do_training方法的参数fingerprint_comparison_result的值输入_do_training完成相应部分的训练, 训练结束后将模型打包成trained_model,通过trained_model输入TrainingResult返回回至上层。

rasa.model_training._do_training: 通过fingerprint_comparison_result带入的结果判断是否重新训练nlu, core和nlg, 并进入相应模块进行训练。

rasa.model_training._train_nlu_with_validated_data:按rasa.nlu.train.train各参数要求读取和整理参数值,输入rasa.nlu.train.train开始nlu模块的训练。

rasa.nlu.train.train: 通过初始化trainer=rasa.nlu.model.Trainer(...), 构建config.yml中pipeline下的所有组件。读取TrainingDataImporter中的nlu数据后,将数据输入trainer.train开始训练。

rasa.nlu.model.Trainer.train: 遍历pipeline所有components,对每个component调用component.train方法完成训练。

Rasa NLU推理流程解析

1552

rasa.model_testing.test_nlu:nlu测试入口,使用get_model函数加载model并解压(unpack),创建结果输出目录,调用测试过程

rasa.nlu.test.run_evaluation:测试过程入口函数,加载nlu模型初始化Interpreter实例,加载测试数据,调用get_eval_data进行测试

rasa.nlu.test.get_eval_data:在测试数据上运行模型,并提取真实标签和预测结果,输入interpreter实例和测试数据,返回意图测试结果(包括意图的标签和预测结果,原始消息,即message,及预测结果的置信度),response测试结果(包括response的目标值和预测结果),还有实体测试结果(实体的目标值,预测结果,和对应的token)

rasa.nlu.model.Interpreter.parse:一个interpreter对应一个训好的pipeline,其parse方法依次调用pipeline中的每一个component的process方法,来对输入文本一次进行解析和分类等操作,并返回处理结果(包括意图和实体)

每个component都有一个process入口方法,用于测试和实际预测,在process方法中再调用各component的内部方法(包含真正的处理逻辑),上图虚线框中即展示了一个基本的pipeline预测示例。

pipeline中Rasa自带的classifiers和extractors各组件(component)的具体介绍后续文章中介绍。