AIP-90 - 圓環之理的人們
Airflow 也要簽訂契約成為魔法少女了嗎

Category Tech

Human in the loop
Loop...loop...圓環
圓環,圓環,圓環之理!
原來是在圓環之理的人類們
那不就是魔法少女嗎!

不過 Human In The Loop 這個詞其實已經有其他的中文翻譯
我最先找到的是人機迴圈AI 與機器學習中的人機迴圈 (HITL) 是什麼?
後來朋友推薦人類參與流程 (【PMI Insight 翻譯精選】人類參與流程(Human-in-the-Loop):那些專案經理需要知道的事 - 社團法人國際專案管理學會台灣分會),我比較喜歡這個

law-of-cycles

話說回來,圓環之理(円環の理),其實也有自己的英文翻譯
Law of Cycles
看來不管怎樣這都不是 Airflow 會成為魔法少女的世界線
這樣的世界線沒有留戀的必要

筆記

動機

  • 部分 workflow 需要人類決策介入(尤其是 GenAI)
  • 常見情境
    1. human branch operator ,由人決定下一個該執行的任務 (e.g., 內容審核)
    2. 同意 / 拒絕
    3. 由人提供輸入

考量因素

  • 獨立於 airflow 核心,並且是可選用的 provider
  • 特定身份的人才能回應這種任務
    • 如果未來 Airflow 支援使用者群組,應該要改用使用者群組而非身份(目前是 fab 的概念)
    • 當存在多個擁有身份的人,第一位動作者將被視為完成任務的人,其他人將不再能執行動作
  • 等待輸入中的任務的狀態是 已延後
  • UI
    • 在 UI 顯示正等待使用者輸入的任務們
    • 使用者可以根據任務需求,透過以下兩種做法完成任務
      • 多個選項中擇一同意 / 拒絕(UI 應顯示選項)
      • 輸入(UI 顯示輸入表格,類似 dag Param)
  • API
    • URL 端點
      1. 取得待輸入的任務的細節 (e.g., 包含上游 XCom 或可選選項)
      2. 標記任務為完成(要輸入任務或下一個任務所需的資料)
      3. 產生分享連結
        1. 直接開啟,並導向所需細節的頁面
        2. 在使用者已登入的情況下,直接一鍵完成任務(e.g., 電子郵件中的同意連結)
        3. 資安考量
          • 這個端點預設為不開啟,要在 airflow 設定開啟
          • 產生連結時,應產生 token,以避免 CSRF
  • 不受這個 AIP 影響,但相關的現有 dag 、 任務行爲
    • Airflow 管理員或有權限者,可以直接將任務標記為"成功" 或 "失敗"(同一般任務)
      • "成功" / "失敗",不代表 "同意" / "拒絕"
    • 等待輸入中的 Dag執行 的狀態會是 執行中 (同 deferrable operator)
    • XCom 輸入可以作為人類輸入的參考,同理 XCom 輸出也可能在任務中受人類輸入改變,並且被下游任務使用
  • 待解決
    • 通知跟設定應該要能依據組織或人的層級做設定,而不是 dag 層級

技術細節

  • Provider 名稱
    • apache-airflow-providers-human (Human Interaction)
  • 任務操作器
    • HumanOperator(BaseOperator)
      • 參數
        • subject: str (templated 欄位)
        • body: str | None (templated 欄位)
        • params: ParamDict | None: 讓使用者輸入的表格,可以放入驗證
        • options: list[str]
        • default: str | None
    • ApprovalOperator(HumanOperator)
      • 參數
        • options: list[str] = ["Approve", "Reject"]
    • HumanTerminationOperator(HumanOperator)
      • 參數
        • options: list[str] = ["Approve", "Reject"]
    • HumanBranchOperator(HumanOperator)
      • 參數
        • multiple: bool: 是否可以多選
    • HumanEntryOperator(HumanOperator)

使用者會如何被影響

大部分不受引響,但這個 provider 要新增一個新的資料表 (table) 用來存這些 human 任務的狀態,另外也要記錄被誰同意或拒絕

其他考慮?

  • 相關 AIP
    • AIP-68 Extended Plugin Interface for React Views
      • 讓 UI 可以被 provider 客製化(e.g., 同意頁面)
  • 如果人類沒有及時回應
    • 可以設定超時時間 (timeout),超過就視為消極同意
      • 咦?這樣對嗎?

    • 如何達到重複通知、通知升級 (escalations)、超時?
      • 直接用現有的 dag 邏輯去整合
      • 為了將降低複雜度,一個任務只能有一個完成活動
      • 初版先不做這些現有 dag 邏輯能整合的流程的最佳化,之後再說

AIP 完成要件

  • provider 要被發佈到 PyPI 上,並且能跟 Airflow 3.1+ 一起安裝
  • 最前面提到的三個 flow ,要可以透過 UI 跟 API 達到
  • 足夠的範例跟文件

後記

在 GitHub 上用 AIP-90 - Human in the loop 來記錄實作進度
雖然不是我提出,但是由我主導實作

筆記是 AIP-90 的原文
但經過一段時間的實作,實際上的程式碼已經跟原文有點分歧了
原本希望是個全新的 provider
在上一次的討論 [Discussion] AIP-90: Should It Be Implemented in the Standard Provider or as a standalone provider?,大家決定整進 standard provider
也統一了要用 HITL (Human in the Loop) ,而不是 Human 或我起初使用的 Interactive
一開始看到 Human 就覺得很危,至少翻譯成漢語是真的很危

  • HumanOperator(人類操作器)
    • 這是什麼 PUA 的功能嗎?
  • HumanTerminationOperator(人類終結操作器)
    • 我現在是跟 Galen Erso 團隊一樣被騙來做死星了嗎?
  • HumanBranchOperator(人類分支操作器)
    • 我不知道,但這聽起來像是暮蟬的劇情 🔪

峰迴路轉,昨天討論過後,這個功能可能又會整個進 Airflow 核心了
之後再寫一篇記錄一下實作的故事

在這篇文章中,我盡可能使用 Airflow 名詞的漢語翻譯,而不是原文
響應 Airflow 3.1 即將追加的的多國語系
畢竟我現在也是負責校對台灣漢語的程式碼負責人 (code owner) 跟翻譯負責人 (translation owner)

Reference

\