2022-03-13 RASA实战笔记 -- 第九章 rasa的工作原理

一、rasa的工作原理

rasa3.0中,NLU和Core都作为有向无环图(DAG)计算的一部分进行编排。即所有的计算过程(也就是组件)都作为图的节点,计算过程之间的依赖关系通过有向边表示。所有的计算过程和依赖关系就构成了一个DAG。
在训练和预测时使用两个不同的DAG。下面按照组件的两个阶段(训练阶段和推理阶段)解释组件的工作原理。

1.1 训练阶段:

模型训练源码:rasa.model_training.train()函数,函数调用其他代码完成训练。逻辑上说,训练阶段有三个步骤:

  • 从配置文件和参数中构造有向无环图
  • 运行有向无环图,这是模型实际进行训练和持久化的过程
  • 将元数据连同(通过持久化过程形成的)组件文件打包成模型

1.1.1 构造DAG

根据配置文件(config.yml)和参数(通过调用train命令时的命令行制定)来构建DAG。
构造DAG的过程涉及多个类的逐层抽象和转换,总体流程比较复杂。

  • 核心代码位于:rasa.engine.recipes.default_recipe.DefaultV1Recipe.graph_config_for_recipe()方法中。
    • 其输入是来自config.yaml的配置信息。
    • 输出是图的配置信息,包含图中所有节点的定义、rasa NLU的输出目标和rasa Core的输出目标。①节点的定义包含了节点对应的组件信息、组件的入口方法和该组件对其他组件的依赖关系
      rasa的训练和推理使用不同的DAG,在构造训练DAG的同时,推理DAG也会被构造,并作为元信息的一部分写入模型包。

1.1.2 运行DAG

运行DAG的过程即为模型训练和持久化的过程。

  • 核心代码位于:rasa.engin.runner.dask.DaskGraphRunner.run()方法。
    • 其输入是DAG,
    • 输出是目标的值,即我们所需的结果。

运行DAG时,会一一运行每个节点:调用节点所存储的组件的对应方法,完成其功能。功能包含:载入资源、训练和进行推理。在载入资源和训练功能中需要组件完成组件的系列化,这样就可以写入磁盘供推理使用

1.1.3 打包模型

将运行DAG过程中的产物写入目录,从而创建rasa模型文件。

  • 核心代码:rasa.engine.storage.local_storage.LocalModelStorage.create_model_package()
    • 首先将各个组件序列化后的资源文件和配置文件拷贝进工作目录,并将包含模型训练和推理的2个DAG的元信息序列化成文件,拷贝进工作目录,最后将工作目录压缩为单一文件,即为rasa模型文件

1.2 推理阶段

推理阶段工作函数:rasa.core.run.serve_application()函数。逻辑上讲推理阶段有三个步骤:

  • 建立connector,对外提供访问接口
  • 从磁盘载入模型(DAG)
  • 处理用户消息

1.2.1 建立connector

connector是rasa对外提供服务的一种接口机制。用户客户端与connector通信从而实现和rasa机器人沟通。
rasa服务器(推理功能)是基于sanic(类似于flask的高性能一步web框架,具有高扩展能力)实现。
rasa中,每个connector都是可插拔的sanic扩展。
rasa按照配置(credentials.yml)在启动时候载入这些connector。
载入connector的核心代码在rasa.core.run.create_http_input_channels()

1.2.2 载入模型

rasa的模型是以DAG组织的。rasa从模型的元信息中还原推理用的DAG(在训练阶段生成)。
载入DAG的核心代码:rasa.engine.loader.load_predict_graph_runner()

1.2.3 处理用户消息

处理用户消息的核心代码:rasa.core.agent.Agent.handle_message()。
逻辑上讲,处理过程分为2个阶段:①自然语言理解(NLU),即从用户的消息中提取意图和实体;②对话管理(DM),由Rasa Core负责,这部分人Rasa会根据上下文选择合适的动作进行执行。
Rasa NLU主要函数:rasa.core.processor.MessageProcessor.log_message(),它会根据DAG得到NLU结果,这些结果更新tracker的状态,随后按照词槽(slot)的映射(mapping)配置更新slot的值,并更新tracker的状态。这一过程由rasa.core.processor.MessageProcessor.run_action_extract_slots()方法实现。
最后Core把tracker的状态作为输入,通过运行DAG预测下一步要执行的动作并执行这一动作。
动作的执行可能会带来新的tracker状态,因此“预测-执行”的过程可能会循环多次,直到满足停止条件。这一过程核心代码在rasa.core.processor.MessageProcessor._run_prediction_loop()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342