本文介紹一個開發中的代理人 (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 , 更歡迎您提供任何改進意見 。


知識不會因為傳播而減少,喜歡這篇文章請幫忙分享。


本篇文章由 Sampot (山姆鍋) 發表,下面是有關他的連結:

評論

您的反饋是我寫作的最大動力,歡迎參與討論。P.S. 我會優先回答張貼在這裡的問題。

comments powered by Disqus