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

2022-09-28 12:01:09

  本文以報時機器人為載體,介紹了報時機器人的對話能力範圍、組態檔功能和訓練和執行命令,重點介紹了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領域的技術分享

人工智慧乾貨推薦 左邊的圖片1 專注於人工智慧領域的技術分享