自稱在 SpaceX 做事的 Lee,走進一堂大學課,開口先報名字。投影片上有一句好玩的話:今天要講的,有些還在做,是他自稱在 SpaceX 正在做的。同學第一週已經做過一個很簡單的 Harness,核心就一句:模型在迴圈裡呼叫工具。那套東西很強,關筆電,程序就停了。他要講怎麼把同一個想法搬到伺服器上,做成 always-on、會自己醒、當機也能活下來的 Agent。
這種 Agent 有自己的電腦。不是你那台筆電,是雲端上一台 Linux,有桌面、檔案、瀏覽器,他說搞不好還有 3D 應用。它會把檔存進那台機器,慢慢弄懂你做到哪裡,累積跟你共事的 Memory。跟終端機裡那套「你傳一句、它回一句」的 Harness 不一樣,比較像同事:知道什麼時候該閉嘴,有時在背景自己幹活,有重要進展才回來吵你。叫醒它的也不只是你在終端機打字。Slack、email,或其他事件,都能把它叫醒去做事。他希望這種 always-on Agent 能做很長的活,不只幾小時、幾天,搞不好幾週、幾個月。那就要另一套架構。
開發者跟 AI 共事,走了四段
Lee 說頭一段是從 ChatGPT 把程式碼複製貼上,丟進自己慣用的編輯器。說起來像幾十年前的事,其實就幾年前。模型開始撐得住上一堂課講的那種簡化 Harness 之後,進了第二段:能改檔、能跑 shell、在終端機裡用很薄的介面做事。模型突然能自己往前做,也比較能替你幹活,這一段才真正跑起來。
第三段是把本來很陽春的 coding agent 做成專用 app。人開始平行跑很多個 Agent,有的丟上雲端,不只活在自己的機器上。瓶頸換成你自己:每一條指令都要看,每一條 shell 都想確認剛好,人一直待在迴路裡。模型、Harness、產品再往前走,才進到他說的新一段:always-on Agent 在背景自己跑。它有自己的電腦、自己的 Memory,在職學會新 skill,你去睡覺、去做別的,它還在幹。
以前多半是每天 prompt 一次 Agent,現在偶爾還這樣,但也可以把它設成背景自己跑。更早的節奏是 prompt、等、再 prompt、再等;它要跑 shell,你得准或擋。現在比較像在帶它:你跟它說去看這個 thread,話還沒說完又補一句,對了,那個星期四再做。上一代模型被你中途插話會亂。現在比較像跟朋友講話講到岔出去,它能把兩件事當成有關的,模型跟 Harness 都接得住。
你叫它寄 email、傳 Slack,外面還有一層安全檢查,很多公司叫 auto review:另請一顆 AI 去核每一條會被跑的指令。說來好笑,這比人盯幾百條 shell、一條一條按准還安全。他說若做盲測,多數時候模型核指令比人核得好。模型變強,介面反而更簡單。他們把這種 always-on Agent 叫做 bot。市面上這種產品一下子冒出很多,他也覺得好懂:誰都會傳訊,手機大家都熟,跟 AI 共事被收成跟朋友傳訊那種手感。它真的去幹活。問答還在,它要做的是你會丟給同事的那種長任務。
模型這一兩年解鎖的六件事
頭一件是這一兩年,模型跟長程指令的能力明顯變好,比較不會做到一半搞混、做錯。他點了六件,也說其實不只六件。壓縮跟 compaction 做對,模型可以蠻有把握地跑幾小時、甚至幾天。再來是模型能把活交給 helper,也就是 subagent。主模型手上那份工作記憶會滿,丟給一份全新工作記憶的 helper,等於變相拿到無限 context:耗 token、狂呼叫工具的活丟出去,做完回報主 Agent。
呼叫工具這件事本身也變了。幾年前模型幾乎叫不好工具,幻覺很多。他打趣說,現在很少人再把幻覺掛在嘴邊,因為多半被當成解決了。不只叫得好,你還能給它很猛的工具,像新人進團隊時會拿到的那些:shell、檔案之外,整台 Linux、做 demo 影片、在螢幕上像人一樣點來點去,也就是 computer use。沒對外開 API、也沒有 MCP server 的 SaaS 或網站,bot 可以靠 computer use 自己在背景用。
資訊可以整包丟進檔。模型後來要回想、要搜,其實很好做。你示範一次怎麼做,bot 也會收成 skill、Memory、routine,下次接著用。
檔這層,他用很簡的例子。你跟 bot 共事,底下會堆出一份使用者 profile,每一則 prompt 都帶著。你傳訊習慣全小寫,之後每則訊息就該長那樣。日子一久,也會堆出一份工作日誌,像同事每天在記自己幹了什麼,全寫進檔。模型自己決定要不要搜。你問「上週我做了什麼」,它就去翻。模型跑 Linux、用 shell 做 grep、在檔裡找東西,這件事已經很熟。
Skill 是把你做一件事的知識寫進 Markdown:步驟、你覺得怎樣算成、怎樣算砸。這不只是你自己的 skill。現在有一整個生態系,公司跟開發者在寫怎麼寄一封像樣的 email、怎麼做出像樣的 API。Grokbot 裡有一套 plugin:你要的工具裝上去,底下用 skill 或 server。還有 routine,熟 cron 的人一看就懂,就是排程去跑某段 prompt。他收成一句:everything is computer。
Always-on 的意思是能睡、能醒
他請同學把圖從左看到右。一開始伺服器在睡,Agent 能用的那台電腦也在睡。你傳訊,或某個 trigger 進來,Agent 才起來,把狀態載進伺服器。它若要用電腦、開瀏覽器、在桌面上點,再把那台電腦叫醒;用完可以再睡回去。這很要緊。讓那些電腦整天開著又貴,世上也沒那麼多機器給每個人隨時佔著,伺服器用量也吃不消。對話紀錄、Memory、routine,狀態都持久化進資料庫。
怎麼被叫醒?你直接 prompt 當然可以。他愈來愈有興趣的是背景裡還有東西在跑,自己決定什麼時候該找 bot。有人在 Slack ping 你,bot 可以住在 Slack。電話、會議,也可以把 bot 拉進去。他自稱這在 SpaceX 愈來愈常見:同事沒能進會,讓自己的 bot 進去做筆記,會後再帶回來,場面有點好笑。也可能是跑了幾小時、幾天的 routine 或背景工作,做完回來給你一份摘要。前面會有一個 router 做去重,再決定怎麼寫進對話。再下一層是啟發式:這件事要不要吵使用者。不是每件事都重要。同事每做一點進度就跑來跟你說「你看我又前進了」,會很煩。視任務而定,搞不好一天給一次狀態就夠。
Agent 那台電腦是 Linux box,跑在 Firecracker 虛擬機器上。好處是狀態很好做 snapshot,關機、再開都方便。機器上有檔,你也可以連進去看即時畫面,自己上手控。要跑 shell,也許你根本不想跑在自己筆電上,想丟進另一個鎖死、隔離的環境。它有 Chrome,能用瀏覽器。也可以做成虛擬桌面:你跑五個、十個 bot,每個都要自己的瀏覽器,就給它們不同螢幕。這些電腦是 bot 之間的共用基礎設施,用到再去叫。
圖的左邊是叫醒 Agent 的 trigger:各種 app、Slack、email。中間是伺服器。右邊是剛才那台電腦,跑檔、跑指令。指令進來先進佇列,再叫他投影片上那個紫色方塊,也就是 agent loop:上一週講過的,模型在迴圈裡呼叫工具。關掉時把狀態存進資料庫或儲存層。他覺得有意思的是,中間那一小塊,外面再疊抽象、接上好用的工具、連到各種服務,就能長成一個很強的產品。
Agent 跑在伺服器上,是運算裡很常見的薄客戶端、厚伺服器。這兩端這些年一直在盪。幾個實際理由:要推 Agent 程式碼更新,走 App Store 會很痛苦,伺服器可以一次推很多、很快。轉錄、生圖這類重計算,看裝置而定,多半伺服器比較快。流量跟成長不穩的時候,伺服器怎麼擴也有現成做法。他認為最關鍵的是:若把 agent loop 放進虛擬機器,虛擬機器就沒辦法跟 Agent 伺服器分開關。狀態要留在伺服器,虛擬機器隨時能重建。例如 VM 上要做一次緊急的 Linux 零時差更新,最好能重建機器,又不要把整個 agent loop 炸掉、讓應用停擺。
你按下送出之後,他說這段有點鑽進分散式系統,強一致跟最終一致那些題,有興趣再自己挖。客戶端要立刻認出這則訊息、回一聲收到。進到這一輪,工具跟模型在迴圈裡跑,邊跑邊寫進資料庫。客戶端跟各台伺服器訂閱,聽有沒有東西變了;收到訊號再去伺服器拉最新。中間還有去重,重試時不要在列表裡生出重複訊息。
底層有一個差別要分清:workflow 跟 job queue。佇列是一步一步往前,Agent 做複雜任務從第一步走到第三步,基礎設施出包、普通佇列當掉,重啟就得把一二三步重放一遍,這很麻煩。你要的是 durable workflow:失敗之後重試是安全的,從第三步接著做。分散式系統裡這題某種程度上算解過了。他們用開源的 Temporal,就不必從零重造這層很複雜的東西。基礎設施還是得自己跑。
新訊息進來,優先順序不一樣。你自己傳給 Agent、傳給 bot,跟群組、Slack thread、背景 routine 不是同一檔。你說「這場活動改期」,agent loop 該停,你的訊息壓過正在發生的一切。其他人的東西排到隊伍後面。Agent 短時間連收三四則,可以合成一輪,一次處理。啟發式你自己訂,然後一輪一輪往下走。
客戶端跟伺服器之間,只留 send to user
講到 Harness 本身,是在上週那套基本款上面加工具、加概念。Grokbot 的 Harness 跟市面上這類工具最大的差別,是薄客戶端、厚伺服器做成這樣:客戶端跟伺服器之間只留一個工具,叫做 send to user。架構因此很瘦。客戶端某種程度上只是在跟伺服器傳訊,重的工具都放伺服器:跑 shell、讀檔、叫雲端 Agent、錄螢幕、做 demo。
這套後來還算堪用。不論你在哪裡開新客戶端,手機 app、伺服器、桌面、email、Slack,來回都是這一個工具。客戶端雖然只握這一個,收到之後可以決定怎麼用豐富、可互動的方式呈現。伺服器回來說使用者正在登入,客戶端可以跳出專門的登入表單,接到 One Password 這種工具。要付錢,可以叫 Stripe、Link,或用 X Money。做了就收不回的事,寄 email、傳 Slack,可能先把草稿丟回來讓你改、讓你准。有時你連回一則訊息都不必,留一個 emoji 反應就夠。
任何模型都有 context window,也就是它的工作記憶,token 有上限。把所有工具硬塞進去,空間很快沒了。工具進來時帶著名字、schema、一堆細節。Google Drive、Gmail、YouTube 連接器這類吃 MCP server 的服務一裝,圖上方那一排方塊很快就被填滿,模型做對話的空間被吃掉。
現在流行的 Harness 有一招 context 工程,有人叫 dynamic context,也有人叫 tool search tool:每一則送給模型的訊息,只放工具名字。模型真的要用,再去檔裡讀細節。這套東西一路到底都是檔、都是檔案系統。省 context,也省成本、省用量。
原則是先走最便宜、最穩的,不行再往上。最容易的是 bot 從對話歷史裡已經知道的。眼前 context 沒有,再找 plugin、MCP server、API,例如從 Plaid 拉銀行資訊。再不行就上網搜,昨天 Cubs 比分多少。還不夠,才去開那台電腦的瀏覽器搜。再不夠,才用整張桌面,在那台 Linux 上跑腳本、跑指令、把東西做出來。這些都失敗,才回頭吵使用者,請人補資訊或按准。這才比較像跟同事共事:理想上對方會先自己試過一堆路。
那台 Linux 取資訊,也不只截圖一條路。截圖可以,但比較貴。可以看頁面 HTML,也可以看 accessibility tree,token 少很多,按鈕、連結、要點的元素比較好找。這些都不行,再去點像素。有些網站會跳 modal、對話框,Agent 得點得到。這條梯子最差的一格,還是回到使用者:兩步驟驗證碼、captcha 這類。
主 Agent 要瘦,cache 斷了就是 bug
主 Agent 在這套裡比較像 orchestrator。對話要盡量瘦,因為它現在能叫一堆 helper,helper 就是 subagent。耗 shell、燒一堆貴的 tool call 的活丟出去,只把答案或結果帶回來,主對話不會被撐爆。產品用起來才會有無限 context 的感覺。無限 context 當然不是真的,每顆模型都有上限。有了這些技巧跟繞路,再加上把模型往這方向練,你比較不會覺得撞上 context 牆,做愈久品質也不至於掉。
每個 helper 帶不同 skill,每個都是自己的 durable workflow。回到佇列跟 workflow 的差別:做影片的 helper 當掉、記憶體吃太兇,可以重啟接著做,進度還在。主 Agent 則像同事在管待辦:你可以去看它、傳訊給它、把 helper 停掉。這套是照著理想中怎麼擴一隊工程師、去啃很複雜的題,那樣建模的。
他們做的時候還踩過一些小細節。回合進行中,最好不要加工具、也不要拿掉工具。工具描述或 schema 寫太長,context 被吃,價錢跟用量都差,工程上有很多地方可以剪。也有人說 Harness 只要一個工具,就是跑 shell,很多事確實能這樣建模。可是你若看到模型九成時間都在為同一件事跑 shell,做成專用工具反而比較省,人要審查產品怎麼跑,也比較看得懂。還有一件他覺得好笑:寫給人看的錯誤訊息,寫清楚「哪裡失敗、點這個連結、下一步做什麼」,對 Agent 一樣有用。幫 Agent 設計錯誤訊息,也是一種 DX。
把 bot 丟去跑很長的活,你得信它會把資訊看好、操作也安全。就算它在另一台機器上,不會弄髒你的電腦,你還是希望每條 shell 先經過一顆模型核過,也就是 auto review。信箱裡一封釣魚信、一個 webhook,這種不信任的輸入,不能當成使用者指令塞給模型。業界在 prompt injection 這塊還有很多活要做。寄信這種做了就收不回的事,要先問使用者。產品也可以做成工作流,讓密碼之類的東西根本不進模型對話。
Context 工程他也叫 Harness 工程,覺得幾乎是同一件事,只是名字跟著時間變。核心是少用 context,效率好、成本低。Prompt caching 是其中一個理由。跟 coding agent 或任何 Agent 共事,用掉的 token 理想上大多該是 cached。你把整段對話送進去,多一則訊息,等於整段再送一次。Cached token 折扣很大,要讓它們在 cache 窗裡待愈久愈好。做法是讓工具定義、system prompt 這些,在多次呼叫之間盡量靜止,才不會把 cache 弄斷、每次都付未快取的價錢。上面那截固定,最底下只有最新訊息,未快取要另外付錢的就只在那一小段。
這後面還有一整門手藝。主 Agent 理想上是你跟它進行非常非常長的對話,中間會 compaction、壓縮,把 context 摘要很多次,你有時根本沒察覺。所以那份 context 更該瘦。輸出太長,別整段塞進 context,丟進檔就好,Agent 讀檔很行,跟讀 skill、讀 Memory 是同一件事。截圖或很貴的活,丟給 helper,別動到主 Agent 的 context。理想狀況下,你還要一直修剪對話、把不必留的拿掉,為了成本,也為了回想跟表現。Cache miss 在他看來幾乎就是系統 bug。
他回溯到今年一月:OpenAI 正紅,人開始在模型商的訂閱方案裡這樣用,供應商幾乎沒見過這種用量型態,Harness 也還沒為這種 workflow 調過,cache miss 一堆。Agent 還整天在跑,問題更大。後來補了很多修補,才把 prompt cache 撐住。一個他覺得有趣的招,是讓 prompt 裡每段都維持固定順序。就算你要上新的 system prompt、加新工具,也可以把每一段 hash 起來,順序鎖死。A/B 測試要插一段新 prompt,千萬別把其他人的順序弄亂,否則 cache 一次爆掉。另一招:你打開聊天開始打字,伺服器可以提早把 prompt 備好,把 cache 烤熱,有點像網頁上滑到連結就預抓下一頁。這種小工程優化堆起來,模型能跑多遠、長時間用起來有多聰明,差很多。
跑很長,就得把 compaction、摘要練好。假設模型有 20 萬 token 的 context window,一路做下去,總會碰到要摘要的點。壓縮都是有損的,你得找一套演算法,重要細節不要弄丟。他說這題難到夠寫好幾篇博士論文。例子是你跟 bot 來回已經超過 10 萬 token,接著去做別的。模型商有一段 cache 還熱的窗,可能十分鐘,可能六十分鐘。他們的招是:還在熱窗裡,就先做 compaction,這時長對話比較便宜。使用者三十分鐘後回來,是從這份摘要接著加訊息,後面也便宜。摘要品質本身還有很多工要做。
Compaction 之後,哪些進 Agent 的 Memory,他分成幾層。一層是每次都該在的使用者事實。回到前面那個例子:這個人要全小寫,每一則都得帶著,否則突然冒出大寫會很怪,有點像他說的 full Sam Altman style。還有一些 prompt、一些事實,你要用演算法判斷哪些最該留。理想上這層有垃圾回收。他拿人腦比:此刻這件事重要,你大概不會同時想著一場足球賽,腦子很會把現在相關的留在 context,別的以後再記。Harness 試著學一點:有核心事實,有帶日期的舊對話日誌,還有現在這三十、六十分鐘用的草稿筆記,設計成會過期。其餘的都能從檔找回來。模型很會跑指令,要查就去查。
今天的模型,當成有史以來最差的一版
產品抓到的錯要變成 eval,修完再拿去練下一顆模型。他用飛輪形容訓練跟產品怎麼互餵。先用很高的層次回顧 LLM 怎麼練。Pre-training 讓模型從大量網路文字或其他私有資料建立對世界的大概理解。接著是 supervised fine-tuning,教它怎麼表現,當聊天助理或當 Agent。再來是 reinforcement learning,有點像教模型玩遊戲、再把遊戲玩好。對 always-on Agent 來說,SFT 裡讓模型看過 Harness 的例子、知道在 Harness 裡怎麼做事、手上有哪些工具,很有用。RL 則把指令跟隨練好,幾百個 skill 裡該叫哪一個、給它瀏覽器時該點哪,都在這裡練。訓練之外還有怎麼做 inference。你正在對話的主 Agent,延遲要低,回得要快,Harness 跟 inference 可以往這調。活丟給 helper、要它做很久的時候,十分鐘跟十二分鐘幾乎沒差,兩邊的優化就不一樣。
飛輪這樣轉:Agent 做錯了,理想上變成一則 evaluation,例如它不該叫這個工具,卻叫了。後端去修 Harness、修 bug、修 prompt,也許是 inference 的問題。用 eval 確認真的修到,再送出去。做這類產品的團隊幾乎每天都在抓 bug、修、用 eval 量,這是內迴路,一直在變好。外迴路是每過幾個月、或每個月,去練新模型。新模型最好從這些 bug 跟失敗裡學,在你在意的 eval 上往上爬,再把新版本丟進產品。新模型帶來能力跳升,產品用法也跟著變。例如 bot 進群組聊天,訓練資料其實還不多,這件事正在冒出來,而且得做對。他點了 Malbook,以及 Hugging Face 那次事件,說走錯會很難看。得把模型練成在多 Agent 系統裡,不同 bot 互相講話時還能表現得體。做 Harness 的產品團隊,內迴路、外迴路最好一直轉。
Lee 說他們在 Cursor、現在 Anysphere 有一條原則:刪掉產品。意思是你得內化一個假設:今天的模型是它們有史以來最差的一版。六個月後,你可能得整套 UI 重做。他今天講的多數內容,若六個月前講、甚至一年前講,會是一次很大的更新,因為 Harness 跟 context 工程已經多了很多實務做法。策略是盡量為下一世代模型而做:能少做就少做,介面愈簡單愈好,讓模型替你想、替你動手。
他覺得未來六到十二個月有幾件事算還穩的賭注。現在你的 Agent、你的 bot,可能跑幾小時,難一點的活跑一天。很快就有可能跑到幾週、幾個月。怎麼訓練、怎麼評測這種模型,會冒出新問題。模型回想舊對話的能力也會愈來愈好,演算法跟底層資料怎麼表示,研究很多,可能是圖、可能是檔、可能是別的。理想中這是數位同事,你把帶真人進團隊時會給的工具全給它。他覺得組織才剛開始習慣這件事。介面大概還會更簡單。有人會比較想用 speech to speech 跟 bot、跟 Agent 講話,搞不好還有一顆 Jony Ive 做的裝置,整天對著它講。模型跟產品會更會在職學會 skill,再寫進檔、寫成指示。人跟公司也會更會把那些很客製、只有自己懂的流程寫下來,讓 Agent 讀得懂。
他丟了幾題給同學當研究題。Agent 要跑一個月,模型卻每個月出一版,你要怎麼評測它真的表現如預期?要嘛做出更好的 eval,要嘛不要出得那麼快。他認為業界未來六個月得把這題想清楚。Memory 的演算法還有很多工。安全那側也是:怎麼做安全的 Harness、Agent 周圍的基礎設施怎麼鎖,才不會被壞人接管。Agent 何時該安靜、何時該吵你,啟發式他覺得還沒做好。分寸卡在主動跟煩人中間:它發現你昨天沒去上課,它在場錄了、做了筆記,這可能很有用,也可能很煩。明年這個時候,世上流動的 token 會明顯多很多,把 inference、模型、Harness 調得更省 token,會愈來愈重要。
他記得 OpenRouter 的 Alex 在 X 上講過一則。有人嫌現在每個 app 都長一樣,側欄、Agent、聊天框,大家都在做同一件事。Alex 的回應是:那不就像 2005 年,每個人都在做同一件事,有伺服器、有資料庫、有一套能增刪改查的 CRUD 介面。現實是這已經變成新常態。每個新產品都得有 agentic 的一面,要嘛自己接進去,要嘛變成另一個 Agent 可吃的 headless 資料。他們今天談過的那些,他當成新的積木:durable workflow、sandbox、雲端上的電腦、Memory、skill、接其他服務、語音、支付、身分、eval、observability。他說每一格大概都是好幾十億美元的創投,搞不好是兆,每一格後面大概有二十家新創。下一代公司、下一代產品的新原語,都得接進 Harness。
同學是工程師,想的是怎麼寫軟體。系統設計跟程式架構比以往更要緊,那裡做的決定會一路放大。Lee 自己仍主張看 code,自己寫的還是會看。有人已經不看了。他覺得看仍有用,尤其是搞懂你正在送出去的架構。才幾年,這件事變超多。上週同學已經在玩自己的 Harness,他鼓勵把今天講的套回去,試做一個自己的版本。他記得 GitHub 上大概有個 open Grokbot,有人把他們的程式碼 slop fork 出一個版本,你可以自己架 GUI、找個 sandbox、找台 VM。想搞懂這些零件怎麼接,那條路走得通。他另外勸人不要避開 LLM 怎麼運作。課堂上只給了訓練過程的精簡版,不必真的鑽進機器學習或科學那一層,仍有很多能懂。就像做網頁應用,懂一點資料庫會比較好做。產品跟 Harness 層愈來愈多決定被模型本身牽著走。對這件事有直覺,不論你在哪個位置,都會比較站得住。