公司裡有一種很熟悉的場面。
主管問:「上週交代的事情處理得怎麼樣?」
同仁回答:「正在進行。」
這四個字的涵蓋範圍非常廣。可能已經完成八成,也可能剛建立一個名為「新版_真的最新版_最後版」的空白檔案。
AI Agent 也有類似的職場生態。
你交代它整理資料、執行程式、呼叫其他代理,剛開始看起來一切順利。過了半小時,畫面仍然沒有動靜。此時可能有四種情況:
- 它正在認真處理。
- 它在等某個外部服務回應。
- 它用同一個錯誤方法試了第十七次。
- 它早已忘記原任務,開始撰寫一支沒人要求的 Python 程式。
最麻煩的地方,在於這四種情況看起來完全一樣:都沒有回話。
程序還活著,不代表事情有進展
最近看到一則 Reddit 討論,有人問如何監看子代理(Sub-agent)。他的代理發生例外狀況後,會自行增加程式、反覆執行,甚至直接停住。使用者只能查看系統程序,確認它還活著,卻無法知道它到底在做什麼。
這就像晚上十點經過辦公室,看到某位同仁的電腦還亮著。你只能確認電腦沒關,無法判斷他正在趕報告、等待系統回應,還是只是在追劇逃避回家照顧小孩的責任。
討論串裡有個很實用的建議:為每一個步驟留下執行紀錄表(Execution Manifest)。每次呼叫工具,都記錄輸入、輸出、耗時與執行結果。這樣才能看出代理究竟卡在哪裡。Reddit 原始討論串
我的作法:要求代理留下工作紀錄
我目前把這項要求寫進 Codex 的全局設定,規定每一步都要留下執行紀錄表,至少包含:
- 任務 ID
- 輸入內容摘要
- 本步驟允許使用的工具
- 實際呼叫了哪些工具
- 產生或修改了哪些檔案
- 發生什麼錯誤
- 最後一次心跳時間
- 下一步預定狀態
狀態也不要只寫「進行中」。至少要分成:
- 正在處理
- 等待外部資源
- 準備重試
- 需要人工確認
- 已偏離原任務
- 已完成
- 已停止
這相當於要求每位 AI 同仁下班前填工作日誌,而且不能只寫「持續辦理中」。
例如,看到以下紀錄:
14:02 呼叫資料匯入工具 14:03 回傳欄位格式錯誤 14:04 使用相同參數再次呼叫 14:05 回傳相同錯誤 14:06 使用相同參數第三次呼叫
問題就很清楚了。它沒有在努力突破困難,只是在同一扇鎖住的門前連續刷三次員工證。
如果紀錄停在:
14:02 呼叫外部服務 14:32 仍未收到回應 最後心跳時間為 14:02
那就比較接近停住。此時需要的是外部逾時監看(Watchdog Timer),不能繼續等待代理自行報告。已經失去聯絡的同仁,通常不會主動寄信說明自己目前失去聯絡。
這份紀錄表能做到什麼?
執行紀錄表無法阻止 Agent 停住,也無法保證它不會做出奇怪決定。把要求寫在全局設定裡,仍然屬於文字指令。代理遇到例外時,可能忘記更新,甚至一邊偏離任務,一邊很有禮貌地寫紀錄。
但是它至少能回答三個重要問題:
- 最後成功完成的是哪一步?
- 停住前呼叫了什麼工具,使用了哪些參數?
- 它在等待、重試,還是已經改做別的事情?
沒有這些紀錄,Agent 出問題時只能整段重跑。這很像同仁離職後只留下一個名為「請勿刪除」的資料夾,大家知道裡面應該有重要內容,卻沒人敢動。
再加三道簡單限制
如果工作較重要,光有紀錄仍然不夠。還可以增加三項限制:
- 每個工具設定最長等待時間,逾時就停止。
- 相同錯誤連續出現三次,交由人工判斷。
- 限定可用工具與執行範圍,不能自行增加可執行程式。
Reddit 討論也提到,真正穩定的限制應放在代理無法自行修改的執行層。文字寫著「禁止新增程式」,比較像辦公室牆上的標語;系統直接拒絕未經允許的指令,才像門禁。
先做到看得見,再談自動完成
使用 AI Agent 之後,管理問題並沒有消失,只是同仁改成住在電腦裡,而且不會主動承認自己卡住。
因此,建立穩定 Agent 的第一步,可以很簡單:要求它留下工作紀錄。每一步做了什麼、使用什麼工具、產生什麼結果、目前停在哪裡,都要寫清楚。
它不保證代理永遠不出錯。但是下次 Agent 安靜了半小時,我們至少不用盯著畫面猜測:它究竟正在工作,還是已經去茶水間,而且忘了回來。