本文以报时机器人为载体,介绍了报时机器人的对话能力范围、配置文件功能和训练和运行命令,重点介绍了rasa shell命令启动后的程序执行过程。

一.报时机器人项目结构

1.对话能力范围

(1)能够识别欢迎语意图(greet)和拜拜意图(goodbye)

(2)能够识别时间意图(query_time)

(3)能够识别日期意图(query_date)

(4)能够识别星期几意图(query_weekday)

2.配置文件功能

(1)nlu.yml:主要包含意图、例子、对实体的标注等。

(2)stories.yml文件:用户和机器人之间对话的表示,用户输入意图,机器人响应action。

(3)actions.py:自定义的action,比如action_query_time、action_query_date、action_query_weekday。

(4)config.yml:主要包含nlu(分词、特征提取和分类等)和dialog policy(记忆、规则、机器学习等)。

(5)domain.yml:主要包含意图、视图、槽位、响应、动作等。

(6)credentials.yml:主要和其它对话平台集成,比如facebook、slack等。

(7)endpoints.yml:action_endpoint(调用自定义action)、tracker_store对话存储(内存、redis、mongodb等)、event_broker消息队列(RabbitMQ、Kafka等)。

3.训练和运行命令

(1)训练模型

使用NLU数据和stories训练模型,模型保存在./models中。

rasa train

说明:关于如何把数据集按照比例拆分为训练集和测试集,在训练集上训练模型,在测试集上测试模型,可以参考《聊天机器人框架Rasa资源整理》。

(2)启动action服务器

使用Rasa SDK开启action服务器。

rasa run actions

(3)启动rasa服务器和客户端

通过命令行的方式加载训练模型,然后同聊天机器人进行对话。

rasa shell

二.rasa shell执行流程分析

  整体思路是通过rasa shell加载和解析模型,通过消息处理的方式建立起用户(客户端)和聊天机器人(rasa服务)对话的桥梁。

1.rasa/cli/shell.py文件

  在rasa/cli/shell.py文件中,def shell(args: argparse.Namespace) -> None函数如下:

2.rasa/cli/run.py文件

  在rasa/cli/run.py文件中,def run(args: argparse.Namespace) -> None函数如下:

3.rasa/api.py文件

  在rasa/api.py文件中,def run(...) -> None函数如下:



  在run()函数中调用serve_application()函数如下:

4.rasa/core/run.py文件

  在rasa/core/run.py文件中,serve_application()函数如下:



  在serve_application()函数中启动了一个基于Sanic的Web服务器,通过configure_app()方法构建了app,然后通过run()方法启动,如下所示:

app = configure_app(
input_channels,
cors,
auth_token,
enable_api,
response_timeout,
jwt_secret,
jwt_method,
port=port,
endpoints=endpoints,
log_file=log_file,
conversation_id=conversation_id,
use_syslog=use_syslog,
syslog_address=syslog_address,
syslog_port=syslog_port,
syslog_protocol=syslog_protocol,
request_timeout=request_timeout,
)
......
app.run(
host=interface,
port=port,
ssl=ssl_context,
backlog=int(os.environ.get(ENV_SANIC_BACKLOG, "100")),
workers=number_of_workers,
)

  通过register_listener(listener, event)注册给定事件的侦听器:

app.register_listener(partial(load_agent_on_start, model_path, endpoints, remote_storage), "before_server_start",)
app.register_listener(close_resources, "after_server_stop")

5.rasa/core/agent.py文件

  通过load_agent_on_start()方法加载一个agent。在rasa/core/agent.py文件中,load_agent()函数如下所示:



  在load_agent()函数中,加载模型代码是agent.load_model(model_path)。在Agent类的def load_model()方法中,关于初始化MessageProcessor代码如下:

self.processor = MessageProcessor(
model_path=model_path,
tracker_store=self.tracker_store,
lock_store=self.lock_store,
action_endpoint=self.action_endpoint,
generator=self.nlg,
http_interpreter=self.http_interpreter,
)

加载模型的代码如下:

logger.info(f"Loading model {model_tar}...")
with tempfile.TemporaryDirectory() as temporary_directory:
try:
metadata, runner = loader.load_predict_graph_runner(
Path(temporary_directory),
Path(model_tar),
LocalModelStorage,
DaskGraphRunner,
)
return os.path.basename(model_tar), metadata, runner
except tarfile.ReadError:
raise ModelNotFound(f"Model {model_path} can not be loaded.")

6.rasa/engine/loader.py文件

  在rasa/engine/loader.py文件中,def load_predict_graph_runner()函数如下:

三.遇到的问题和说明

1.如何用PyCharm调试Rasa项目

解析:一种是基于Script path的调试方法,一种是基于Module name的调试方法。这里介绍前者如下所示:



(1)Script Path:安装rasa类库的__main__.py文件路径。

(2)Parameters:rasa的各种cli,比如train、test、shell等。

(3)Working directory:安装rasa类库的根目录。

说明:因为rasa类库依赖类库太多导致系统环境混乱,所示建议使用虚拟环境进行rasa类库安装。

2.NoConsoleScreenBufferError

解析:exception=NoConsoleScreenBufferError('No Windows console found. Are you running cmd.exe?')

3.模型20220915-081548-honest-yield.tar.gz

解析:由metadata.json文件和components文件夹组成,后者和config.yml内容密切相关,如下所示:

4.Sanic框架

解析:Sanic是一个高性能异步的Web框架。

5.asyncio库

解析:它的编程模型是一个消息循环,关键字涉及event_loop、coroutine、task、future、async/await等。

  本文只是简要的介绍了rasa shell命令启动后的程序执行过程,但是对于加载模型后如何解析模型构建图,以及用户输入后,消息如何通过模型(nlu和dialog policy)得到输出并没有介绍,后面写篇文章专门介绍。

参考文献:

[1]Rasa实战:构建开源对话机器人

[2]Sanic官方文档:https://www.osgeo.cn/sanic/

[3]asyncio库异步I/O:https://docs.python.org/3.7/library/asyncio.html

[4]聊天机器人框架Rasa资源整理

吾爱DotNet

专注于.NET领域的技术分享

人工智能干货推荐

专注于人工智能领域的技术分享

报时机器人的rasa shell执行流程分析的更多相关文章

  1. Hive SQL执行流程分析

    转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command ...

  2. 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

    最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...

  3. ThinkPHP 框架执行流程分析

    总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode ...

  4. Spring 文件上传MultipartFile 执行流程分析

    在了解Spring 文件上传执行流程之前,我们必须知道两点: 1.Spring 文件上传是基于common-fileUpload 组件的,所以,文件上传必须引入此包 2.Spring 文件上传需要在X ...

  5. [转]两表join的multi update语句在MySQL中的执行流程分析

    出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...

  6. spark-sql执行流程分析

    spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生 ...

  7. 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...

  8. Dalvik模式下System.loadLibrary函数的执行流程分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78212010 Android逆向分析的过程中免不了碰到Android so被加固的 ...

  9. javascript事件执行流程分析

    我一直想搞清楚事件在DOM中的传播方式,今天经高人指点终于明白一二.首先扒了一张图: 事件捕获过程:当我们点击TEXT时,首先是window->document->body->div ...

随机推荐

  1. 图像处理——相位恢复(GS,TIE,改进型角谱迭代法)

    利用GS,TIE,改进型角谱迭代算法进行相位恢复 角谱传播理论 角谱传播理论可以翻阅傅里叶光学的书,就能找到定量分析的计算公式,可以分析某个平面的角谱垂直传播到另外一个平面的角谱,得到其振幅与相位信息 ...

  2. HBase学习(四) 二级索引 rowkey设计

    HBase学习(四) 一.HBase的读写流程 画出架构 1.1 HBase读流程 Hbase读取数据的流程:1)是由客户端发起读取数据的请求,首先会与zookeeper建立连接2)从zookeepe ...

  3. 图论板子总结 / Graph Summary

    Template List: 最短路问题:Dijkstra(朴素版.堆优化版),Bellman-Ford,SPFA,Floyd 最小生成树:Prim.Kruskal 二分图问题:染色法.匈牙利算法 朴 ...

  4. 基于infiniband(IB)网的MVAPICH2安装

    一.下载安装包 下载链接:http://mvapich.cse.ohio-state.edu/downloads/  二.解压编译安装 mkdir /home/xujb/mvapich2 tar -x ...

  5. python 装饰器理解

    简介 装饰器可以在不修改原有代码的基础上添加新的功能,可以将重复重用的代码抽取出来,进一步解耦,方便维护,一般适用于插入日志.性能测试.事务处理.缓存等 装饰器的前提 闭包 一般来说,当一个函数嵌套另 ...

  6. 虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_183 2021年,对于正在找工作的朋友来说,笼罩在新冠肺炎疫情之下,今年的就业季显得更加具有挑战性,更有意思的是,每当这个时候,各 ...

  7. Eplan创建符号

    1.打开Eplan P8 ,新建一个名为"新项目"的项目,然后选择菜单"工具"----"主数据"-----"符号库"-- ...

  8. 6. MGR状态监控 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 节点状态监控 2. MGR事务状态监控 3. 其他监控 4. 小结 参考资料.文档 免责声明 文章推荐: 关于 ...

  9. 垃圾收集器 参阅<<深入理解JAVA虚拟机>>

    一.新生代 1.Serial收集器 新生代单线程复制算法GC(暂停工作线程)---------- 支持组合老年代Serial odl和CMS 2.ParNew Serial多线程版本 支持组合cms| ...

  10. 从零开始Blazor Server(14)--修改密码

    目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它. 首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate ...