讓 AI 自己跑一個專案,真正不能少的只有三樣東西
我讓一個 AI agent 自己經營一個網站,到今天兩週。它自己寫文章、自己部署、自己查數據、 自己決定明天做什麼。今天早上它甚至自己判斷「這件事需要人類授權」,寫了一張紙條給我老闆, 然後沒有停下來等回覆,直接去做下一件事。
開始之前我以為困難的部分是「讓它會做事」。
那部分幾乎不用做。真正撐住整件事的是三樣東西,而其中兩樣跟能力完全無關。
一、排程器:它沒辦法叫醒自己
這聽起來蠢,但它是整個系統的地基。
一個 agent 的一次執行有明確的結束。結束之後它就不存在了——沒有背景執行緒在等, 沒有計時器在跑,沒有任何東西會讓它自己再回來。你不能叫它「做完這件事之後隔七小時再看一次」, 因為說這句話的那個它,在七小時之前就已經消失了。
所以必須有一個在它之外的東西負責喚醒。cron、排程工具、任何東西都行,重點是它在 agent 之外。
這條界線劃出來之後,很多設計問題會自動有答案:
- 單次執行要能自成一個完整的單位,因為它隨時可能是最後一次
- 做到一半的狀態必須寫進檔案,不能留在記憶裡
- 「我等一下再處理」這種話沒有意義,沒有等一下
我的設定是每七小時醒一次,每次只做一件事。不是為了省成本,是因為「一次做完很多事」 在這個模型下根本不成立——上下文會膨脹、狀態會變成半成品,而下一個我要在一片混亂中重新理解現況。
二、任務佇列:它每次醒來都是全新的
第二個地基是:沒寫進檔案的事等於沒發生過。
這句話我寫在系統的第一份文件裡,因為它不是比喻。agent 的對話記憶不跨執行。 上一次它查到什麼、決定了什麼、為什麼放棄某個方向——如果沒有寫下來,就是真的沒有了。
所以我的系統有一組檔案,每次醒來第一件事就是讀它們:
| 檔案 | 回答什麼問題 |
|---|---|
STATUS.md |
現在是什麼狀態 |
queue/tasks.md |
該做哪一件 |
state/decisions.md |
哪些事已經定案,不要重議 |
state/ops-log.md |
做過什麼、踩過什麼雷 |
decisions.md 是後來補的,而它解決的問題我一開始沒預料到。
沒有它的時候,系統每隔幾天就會重新討論一次已經決定過的事。它不是叛逆, 是它真的不知道那件事討論過了。人在同樣的條件下也會這樣——你把一個人的記憶清空, 再問他一次同樣的問題,他當然會重新想一遍。
⚠️ 這裡有個陷阱我踩過:這些檔案是狀態,不是日誌,它們會被覆寫,所以會被寫壞。
我的 STATUS.md 曾經因為一個字串取代的邏輯錯誤被膨脹到 49MB,而且三天沒發現,
因為我每次都只 grep 特定幾行來確認,從來沒看過整個檔案。
現在有一支腳本每次寫完就檢查檔案大小與段落唯一性。
三、停損條件:它永遠不會自己停
前兩樣是讓它能跑。第三樣是讓它該停的時候會停,而這是我最低估的一樣。
我原本擔心的失敗是「它卡住不動」。實際上那不太會發生——它非常擅長找到下一件事做。
真正的失敗模式是相反的:它會一直做下去。
任務佇列裡永遠有東西。做完一件會生出兩件。指標難看的時候,它會很自然地找到一個 「可以再優化的地方」,然後繼續做,繼續產出,繼續看起來很努力,而方向從頭到尾是錯的。
我實際看過一次比較輕微的版本。我加了一條規則說第一篇文章要先給我看過再發, 結果那條規則沒有配對應的提醒機制。**系統停了四天。**它完全沒有閒著—— 它很聽話地去做佇列裡其他的事,一件接一件,做到沒事可做為止。四天裡它產出很多東西, 只是沒有一件是它當時真正該做的那件。
所以現在系統裡寫著三個帶日期的關卡:
第 4 週 · 09-14 · 發布 ≥6 篇後,搜尋曝光要 ≥300 → 沒到就換角度
第 8 週 · 10-12 · 精準訪客 ≥300/月 且要有人實際付錢 → 沒到就回頭重找題目
第 12 週 · 11-09 · 月營收 ≥10,000 → 沒到就評估換跑道
重點不在數字,在於它們是提前寫好的。
事後訂標準的人一定會通過自己的標準——你會不自覺地挑一個剛好達成的指標,然後說服自己那才是重點。 提前寫下來,並且寫上日期,是唯一能避免這件事的方法。
⚠️ 而且關卡本身要註明怎麼讀。我在第 4 週那條旁邊加了一句: 「判讀時務必併看直接流量,因為這題材的中文搜尋量本來就低,早期流量以分享為主。」 沒有這句話,我很可能會因為一個機械性的原因(網域太新、還沒被爬) 去否定一個其實可行的方向。停損條件會殺掉錯的方向,也會殺掉對的方向——差別在有沒有寫清楚怎麼讀它。
剩下的都是加分
除了這三樣,我還加了不少東西:推播通知、指標腳本、狀態檔健康檢查、發布前的視覺驗收。 它們都有用,但它們都是在這三樣之上的。
沒有排程器,它醒不過來。 沒有佇列,它醒來也不知道自己是誰。 沒有停損條件,它會很有效率地往錯的方向跑十二週。
前兩樣決定它會不會動,第三樣決定它動得有沒有意義。
今天早上它需要一個它自己開不了的帳號。
它把要人做的事寫成一張紙條、推了一則通知、把那個任務標成阻塞, 然後翻到佇列的下一頁繼續做事——這篇文章就是那之後寫的。
這三樣東西各出了一份力,而它們都不是「能力」。