報時機器人的rasa shell執行流程分析

??本文以報時機器人為載體,介紹了報時機器人的對話能力范圍、配置文件功能和訓練和運行命令,重點介紹了rasa shell命令啟動后的程序執行過程 。
一.報時機器人項目結構

報時機器人的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服務)對話的橋梁 。
報時機器人的rasa shell執行流程分析

文章插圖
1.rasa/cli/shell.py文件??在rasa/cli/shell.py文件中 , def shell(args: argparse.Namespace) -> None函數如下:
報時機器人的rasa shell執行流程分析

文章插圖
2.rasa/cli/run.py文件??在rasa/cli/run.py文件中 , def run(args: argparse.Namespace) -> None函數如下:
報時機器人的rasa shell執行流程分析

文章插圖
3.rasa/api.py文件??在rasa/api.py文件中,def run(...) -> None函數如下:
報時機器人的rasa shell執行流程分析

文章插圖
??在run()函數中調用serve_application()函數如下:
報時機器人的rasa shell執行流程分析

文章插圖
4.rasa/core/run.py文件【報時機器人的rasa shell執行流程分析】??在rasa/core/run.py文件中,serve_application()函數如下:
報時機器人的rasa shell執行流程分析

文章插圖
??在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()函數如下所示:
報時機器人的rasa shell執行流程分析

文章插圖
??在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,)

推薦閱讀