本文以报时机器人为载体,介绍了报时机器人的对话能力范畴、配置文件性能和训练和运行命令,重点介绍了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/l...
[4]聊天机器人框架Rasa资源整顿
本文由mdnice多平台公布