本文介紹一個開發中的代理人(agent)工具程式:“EAvatar ME”,中文名稱《我.影化身》,唸作我的影化身。 這個代理人程式設計來執行一些例行的工作(tasks),由於每個人的例行的工作可能大相逕庭,這個代理人自然也要能夠根據不同情境執行不同腳本。
雖然是代理人,請不要期待《我.影化身》會有什麼人工智慧。骨子裏,它就是一個軟體工具, 設計來自動執行一些簡單的工作。什麼樣類型的工作適合《我.影化身》來執行?
「事件-條件-動作」
《我.影化身》適合事件驅動(event-driven)的工作類型,這類型的工作流程由下列三個主要元素組成:
事件(Event)
: 代表環境中發生的事情、狀態變動等可被偵測的改變,例如:「收到新的郵件」、「網頁內容變動」等等。
-
條件(Condition)
: 事件發生不一定會引發反應,需要符合特定條件才行。例如:就算收到新的郵件,
使用者可能想要根據目前的時間來決定要不要收到通知。
-
動作(Action)
: 動作就是代理人實際執行的工作內容。工作可以簡單也可以很複雜,簡單的工作如「通知使用者有新的郵件」,
複雜的工作則可能需要根據當下的狀態來決定採取不同的動作。
所以,代理人的基本工作流程就是:
- 偵測到特定事件發生
- 檢查是否符合動作條件
- 符合條件則執行預定的動作
- 重複步驟 1 到 3
雖然這三者個別來看不是挺複雜,但還是來看看實際可能的應用情境吧!
應用情境(Scenarios)
本節說明幾個《我.影化身》適合的應用情境:
檢查電子郵件(Checking mails)
檢查使用者電子信箱,有新的信件時,通知使用者。《我.影化身》的客戶端程式與系統通知整合,如下圖所示:
檢查期貨即時報價
剖析期貨即時報價網頁,擷取報價資訊,根據設定條件通知使用者。
抓取網頁(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 ⎘ ,更歡迎您提供任何改進意見。