本文以报时机器人为载体,介绍了报时机器人的对话能力范畴、配置文件性能和训练和运行命令,重点介绍了 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 多平台公布