Skip to content

任務自動化的多功能代理人 - EAvatar ME

Published: 5 分鐘

本文介紹一個開發中的代理人(agent)工具程式:“EAvatar ME”,中文名稱《我.影化身》,唸作我的影化身。 這個代理人程式設計來執行一些例行的工作(tasks),由於每個人的例行的工作可能大相逕庭,這個代理人自然也要能夠根據不同情境執行不同腳本。

雖然是代理人,請不要期待《我.影化身》會有什麼人工智慧。骨子裏,它就是一個軟體工具, 設計來自動執行一些簡單的工作。什麼樣類型的工作適合《我.影化身》來執行?

「事件-條件-動作」

《我.影化身》適合事件驅動(event-driven)的工作類型,這類型的工作流程由下列三個主要元素組成:

事件(Event)
:   代表環境中發生的事情、狀態變動等可被偵測的改變,例如:「收到新的郵件」、「網頁內容變動」等等。

-

條件(Condition)

:   事件發生不一定會引發反應,需要符合特定條件才行。例如:就算收到新的郵件,
    使用者可能想要根據目前的時間來決定要不要收到通知。

-

動作(Action)

:   動作就是代理人實際執行的工作內容。工作可以簡單也可以很複雜,簡單的工作如「通知使用者有新的郵件」,
    複雜的工作則可能需要根據當下的狀態來決定採取不同的動作。

所以,代理人的基本工作流程就是:

  1. 偵測到特定事件發生
  2. 檢查是否符合動作條件
  3. 符合條件則執行預定的動作
  4. 重複步驟 1 到 3

雖然這三者個別來看不是挺複雜,但還是來看看實際可能的應用情境吧!

應用情境(Scenarios)

本節說明幾個《我.影化身》適合的應用情境:

檢查電子郵件(Checking mails)

檢查使用者電子信箱,有新的信件時,通知使用者。《我.影化身》的客戶端程式與系統通知整合,如下圖所示:

EAvatar notification

檢查期貨即時報價

剖析期貨即時報價網頁,擷取報價資訊,根據設定條件通知使用者。

抓取網頁(Web scraping)

《我.影化身》由於技術架構的關係,可以同時執行許多的 I/O 導向的工作,其中以網頁抓取作為主要代表。 由於採用事件驅動,非阻斷式 I/O 程式庫,《我.影化身》很適合執行大量網頁存取的工作。

使用概念

使用《我.影化身》需要知道一些基本概念,了解這些概念才能知道為何《我.影化身》這樣被設計。 基本上,使用者將要《我.影化身》完成的工作(job)以腳本(script)的形式交付給《我.影化身》執行。 一個「工作」可能包含一個以上相關的任務(task),「腳本」的用途便是將這些任務組織起來, 確保任務按照正確的流程執行。

「腳本」採用受限制的 Python 語法,也就是:腳本是個符合 Python 語法的程式,但反過來不成立。 因為「腳本」目的是作為工作流程控制,只能執行《我.影化身》預先定義好的任務。

《我.影化身》中,「任務」代表執行一個「動作(action)」,每個「動作」可以接受不定個數的參數(arguments), 並可以回傳結果(result)。基於安全理由,《我.影化身》支援的動作是預先定義好,以避免腳本執行任意動作危害到系統。 「動作」是由不同模組(modules)所提供,在啟動時模組會註冊所提供的動作。這裏的「模組」就是 Python 的模組, 功能上完全相同。

複雜的「模組」需要額外的套件(package)支援來實現「動作」所需的功能。基於這個需要, 《我.影化身》支援以 Egg 發行包的形式安裝額外的 Python 套件,但僅限於純 Python 程式碼。 專為《我.影化身》開發的發行包可以同時包含提供「動作」的模組,如此可以簡化部署的工作。

腳本範例

為了有更具體的感覺,底下是一個《我.影化身》腳本,僅供參考,不保證在未來版本可以正確執行。

ava.sleep(60)  # sleep for 1 minute
messages, unseen = ava.do('imap.check',
                          server='imap.gmail.com',
                          username='[email protected]',
                          password='password').result()

if unseen > 0:
    ava.do('user.notify',
           message="Busy day, you have %d new messages." % unseen,
           title="You got new mails from GMail")

ava.do() 會以非同步方式執行指定的動作。

結語

《我.影化身》是個開發中的專案,完成的進度驗證上述概念的可行性,但尚有很大的發展空間。 因為,山姆鍋一開始就沒有打算提供複雜的圖形使用者介面,《我.影化身》注定只適合進階用戶或開發人員。 如果您對於《我.影化身》的發展有興趣,請持續關注本專案:https://github.com/eavatar/eavatar-me ,更歡迎您提供任何改進意見。

郭信義 (Sam Kuo)

奔騰網路科技技術長,專長分散式系統、Web 應用與雲端服務架構、設計、開發、部署與維運。工作之餘,喜歡關注自由軟體的發展與應用,偶爾寫一下部落格文章。