AG Day 17 Human-in-the-loop:interrupt 與人工核准 執行需求:CPU 可跑 。在昨天 AG Day 16( 原文連結 )中,我們替 research-agent 接上了 SQLite 版的 checkpointer,讓代理能透過 thread_id 記住每一個研究任務的完整對話狀態,即使程式重啟也能從上次停下的地方繼續。今天要利用這個「能被中斷、能被恢復」的能力,實作一個對正式系統很重要的設計:讓代理在準備執行高風險動作之前,主動停下來,等待人類明確核准之後才繼續,而不是自顧自地把所有決定都執行完。今天全部範例都能在沒有 API 金鑰的情況下跑完,唯一需要提前準備的是昨天建立的 checkpointer,因為人工核准機制完全建立在「能被中斷、能被恢復」這個能力之上。 引言 到目前為止, research-agent 的工具都相對溫和:查資料、抓網頁,出錯了大不了重試或回報失敗,不會對外部世界造成不可逆的影響。但一個真正要拿去用的研究助理,遲早會需要做一些「有代價」的動作:呼叫按用量計費的付費 API、把整理好的報告寄出去、或是把資料寫進一個別人也在用的正式資料庫。如果代理完全自主地決定什麼時候該做這些事,一旦提示詞設計有漏洞,或模型偶爾判斷失準,後果可能不是「重試一次就好」,而是「已經花了錢」或「已經寄出去了,收不回來」。 Human-in-the-loop(人機協作、簡稱 HITL)的核心想法很直接:在流程裡插入一個「暫停點」,讓真人看過目前的狀態、決定要不要放行,代理才能繼續往下走。這聽起來像是要另外寫一套暫停與恢復的機制,但昨天我們已經把地基打好了:只要圖有 checkpointer,LangGraph 就能在任何節點裡呼叫一個叫 interrupt() 的函式,暫停目前的執行、把控制權交還給呼叫端;等真人做出決定後,呼叫端再用 Command(resume=...) 把決定送回去,圖會從暫停的那一點,帶著這個決定繼續往下跑。今天我們就是要把這個機制,安裝在 research-agent 呼叫外部搜尋服務之前。 原理與觀念 interrupt() 怎麼暫停一個正在執行的節點 interrupt() 是 LangGraph 提供的一個函式,你可以在圖的任何節點函式內部呼叫它,並傳入一個...