Human in the loop
Loop...loop...圓環
圓環,圓環,圓環之理!
原來是在圓環之理的人類們
那不就是魔法少女嗎!
不過 Human In The Loop 這個詞其實已經有其他的中文翻譯
我最先找到的是人機迴圈
(AI 與機器學習中的人機迴圈 (HITL) 是什麼?)
後來朋友推薦人類參與流程
(【PMI Insight 翻譯精選】人類參與流程(Human-in-the-Loop):那些專案經理需要知道的事 - 社團法人國際專案管理學會台灣分會),我比較喜歡這個
話說回來,圓環之理(円環の理),其實也有自己的英文翻譯
Law of Cycles
看來不管怎樣這都不是 Airflow 會成為魔法少女的世界線
這樣的世界線沒有留戀的必要
筆記
- 原文連結: AIP-90
動機
- 部分 workflow 需要人類決策介入(尤其是 GenAI)
- 常見情境
- human branch operator ,由人決定下一個該執行的任務 (e.g., 內容審核)
- 同意 / 拒絕
- 由人提供輸入
考量因素
- 獨立於 airflow 核心,並且是可選用的 provider
- 特定身份的人才能回應這種任務
- 如果未來 Airflow 支援使用者群組,應該要改用使用者群組而非身份(目前是 fab 的概念)
- 當存在多個擁有身份的人,第一位動作者將被視為完成任務的人,其他人將不再能執行動作
- 等待輸入中的任務的狀態是
已延後
- UI
- 在 UI 顯示正等待使用者輸入的任務們
- 使用者可以根據任務需求,透過以下兩種做法完成任務
多個選項中擇一
或同意 / 拒絕
(UI 應顯示選項)- 輸入(UI 顯示輸入表格,類似 dag Param)
- API
- URL 端點
- 取得待輸入的任務的細節 (e.g., 包含上游 XCom 或可選選項)
- 標記任務為完成(要輸入任務或下一個任務所需的資料)
- 產生分享連結
- 直接開啟,並導向所需細節的頁面
- 在使用者已登入的情況下,直接一鍵完成任務(e.g., 電子郵件中的同意連結)
- 資安考量
- 這個端點預設為不開啟,要在 airflow 設定開啟
- 產生連結時,應產生 token,以避免 CSRF
- URL 端點
- 不受這個 AIP 影響,但相關的現有 dag 、 任務行爲
- Airflow 管理員或有權限者,可以直接將任務標記為"成功" 或 "失敗"(同一般任務)
- "成功" / "失敗",不代表 "同意" / "拒絕"
- 等待輸入中的 Dag執行 的狀態會是
執行中
(同 deferrable operator) - XCom 輸入可以作為人類輸入的參考,同理 XCom 輸出也可能在任務中受人類輸入改變,並且被下游任務使用
- Airflow 管理員或有權限者,可以直接將任務標記為"成功" 或 "失敗"(同一般任務)
- 待解決
- 通知跟設定應該要能依據組織或人的層級做設定,而不是 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., 同意頁面)
- AIP-68 Extended Plugin Interface for React Views
- 如果人類沒有及時回應
- 可以設定超時時間 (timeout),超過就視為消極同意
-
咦?這樣對嗎?
-
- 如何達到重複通知、通知升級 (escalations)、超時?
- 直接用現有的 dag 邏輯去整合
- 為了將降低複雜度,一個任務只能有一個完成活動
- 初版先不做這些現有 dag 邏輯能整合的流程的最佳化,之後再說
- 可以設定超時時間 (timeout),超過就視為消極同意
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)