先別管 fork 能拿來幹嘛。

很多教學一上來就告訴你「fork 適合用在 XXX 場景」,然後你照做、有時有用、有時莫名其妙更貴,但你始終不知道為什麼。所以這篇反過來——我們先把 fork 收到任務後,第一件事在底層做了什麼拆開看。看懂那一步,它什麼時候該用、什麼時候比 subagent 便宜,你自己就推得出來,不用背。

那個底層的第一步,關鍵字只有一個:prompt cache

先搞懂:模型每次回話,前面那一大段它怎麼處理

你跟 Claude 對話時,每送出一則新訊息,模型實際收到的不是只有那一則。它收到的是「一整包」:最前面是固定的系統提示(system prompt)、接著是所有工具的定義(tool definitions),然後才是你們從頭到現在的完整對話歷史,最後接上你剛打的那句。

這一整包它每次都得重新讀一遍、算一遍,才能接話。問題是,這包的前半段——系統提示、工具定義、早期的對話——每一輪幾乎一模一樣。每次都重算,等於每次都把同一本書從第一頁朗讀到你問問題的那一頁,純粹浪費。

prompt cache 就是來解這個的。它把這包的「前綴」(prefix)算過的結果存起來。下一次只要前綴一字不差地相同,模型就不用重算,直接從快取把結果撈出來,只算你新加的那一小段。

用個生活化的講法:這像你每天上班走同一條路。第一天你得認路、看每個路口(重算);之後你閉著眼睛都能走到巷口那家便利商店,腦袋自動導航(快取命中)。只有從便利商店之後的那段新路,你才需要動腦。前綴只要沒變,前面那段就是免費的。 真正計費的,是你「岔出去」的那一小段。

記住這條,因為 fork 跟 subagent 的全部差別,就藏在「前綴變了沒」。

subagent:給新人一張空桌子,外加一張便利貼

先看大家比較熟的 subagent。你開一個 subagent,它拿到的是一個全新、乾淨的 context——它不知道你們主對話聊過什麼,從零開始。

這個設計有它的好。它跑的所有過程——工具呼叫、中間推理、一堆雜訊——全留在它自己的視窗裡,最後只把一則結論丟回給你。主對話只收到訊號,不收到雜訊,不會被它的過程污染。這是 subagent 真正的價值。

但代價在於:因為它什麼都不知道,你得自己把它需要的背景,全部塞進那一句啟動指令裡。檔案路徑、錯誤訊息、你們剛剛討論出的決定——漏一個,它就抓瞎。

回到底層:subagent 有它自己的系統提示(那個 agent type 專屬的角色設定),工具清單可能也被限縮過。換句話說,它那包的前綴,跟你主對話的前綴不一樣。前綴不一樣,prompt cache 就命不中。它得從頭算自己那一整包,而你硬塞進指令裡的那段背景,也是全價計費、重新處理一次。

像什麼?像你把一件複雜的事交給一個剛到職、什麼都不知道的新人。你給他一張乾淨的桌子(好處:他不會被你桌上的爛攤子干擾),但你得寫一張很長的便利貼把來龍去脈交代清楚(代價:寫便利貼很累,而且他讀那張便利貼也要花時間)。

fork:把你現在這張桌子,連同上面所有紙,整個影印一份

fork 走的是完全相反的路。

你 fork 一份,它繼承你當下完整的對話歷史——你們聊過的每一句,它全都有。更關鍵的是底層那一層:fork 的系統提示和工具定義,跟父對話完全相同

你應該已經看出來會發生什麼事了。前綴完全相同,意味著它的第一個請求,直接命中父對話的 prompt cache。那一大包共用的前綴——系統提示、工具、你們累積的對話——它不用重算,從快取撈。所以對於那些「需要一樣的大量背景」的任務,fork 反而比另外開一個乾淨的 subagent 更便宜。subagent 要重算自己的包、還要你重餵背景;fork 直接接著快取跑。

如果你學過作業系統,這個畫面會很熟:真正的 OS fork() 就是把父程序的整個記憶體空間複製給子程序。Claude Code 把這個機制叫 fork,名字取得剛剛好——它複製的不是一張空桌子,是你現在這張桌子連同上面攤開的所有紙,整份影印過去。子程序從你離開的那一刻無縫接手,不用你再交代任何事。

概念上,當你(或一個 SDK 腳本、一套 workflow)要派一個分身出去時,你是在這兩個之間選:

1
2
開 subagent  → 全新乾淨 context,前綴不同 → 快取槓龜,背景要重餵
開 fork → 複製完整對話,前綴相同 → 命中快取,背景免費繼承

還有一個小細節:fork 一律繼承父對話的模型,這個不給你改——畢竟要共用快取,模型當然得是同一個,不然前綴對不上、快取也命不中了。你看,連這個限制都是同一條原理推出來的。

所以——什麼時候 fork,什麼時候 subagent

現在不用背了,直接從原理推。

當任務需要大量「當前對話」的背景,就 fork。 比方你跟 Claude 來回 debug 了半小時,累積了一大堆上下文,現在想分頭去試兩個修法。這時候開 subagent,你得把這半小時的脈絡濃縮成一張便利貼塞給它——又累又掉資訊,還全價計費。fork 直接把這半小時整包複製過去,命中快取、無痛接手。要把這麼多背景塞進一個 subagent 的啟動指令本來就不划算,這正是 fork 存在的理由。

當任務是自包的、而且會產生你不想看的大量雜訊,就 subagent。 比方「去把這個 repo 的測試全跑一遍,只回報哪些掛了」。它不需要你們之前的對話,它需要的是一個乾淨、隔離的空間去產生一堆 log,然後只把結論丟回來,不要弄髒你的主視窗。這種時候,subagent 那張「乾淨桌子」才是你要的。

一句話收束這個取捨:fork 用在「需要我全部的記憶」,subagent 用在「不需要我的記憶、但會製造很多垃圾」。 一個圖的是無痛繼承背景,一個圖的是隔離雜訊。它們不是誰取代誰,是兩種相反需求的兩個答案。

誠實邊界:fork 是相對新、也相對底層的機制,目前主要透過 Agent/Task 這套分身機制和 Agent SDK 暴露出來,不像 /agents 那樣有個現成的互動指令讓你點。多數人日常還是先碰到 subagent。但就算你暫時用不到 fork,搞懂它跟 subagent 的差別,等於免費附送你一套讀懂「成本從哪來」的眼鏡。

把這條原理戴上,整個 context 設計都變透明

最後把 prompt cache 這副眼鏡戴著,看出去你會發現它解釋的遠不只 fork。

它順手解釋了一條你可能聽過、卻不知道為什麼的建議:把固定不變的東西放前面,把每次都在變的東西放後面。 系統提示、專案規範、長文件這些不動的,擺在前綴,它們就能被快取、之後一路免費;反過來,如果你把一個每次都在變的時間戳或隨機值塞到最前面,你等於每一輪都親手把整條快取作廢,後面那一大段全部被迫重算。同一條原理,正反兩面。

fork 之所以便宜,CLAUDE.md 之所以該寫得穩定,長對話之所以越拖越貴——背後都是同一件事在運作:模型在替「沒變過的前綴」省錢,在替「變動」收費。你看懂了 fork 第一步在記憶體裡做的那件事,等於一次看懂了一整類成本問題。

下次你在猶豫「這個分身該開 subagent 還 fork」、或是想不通「為什麼這串對話越聊越燒錢」的時候,別急著查文件。先問自己一句:前綴,變了沒? 答案會自己浮出來。

參考來源:Create custom subagents - Claude Code Docs
參考來源:Subagents in the SDK - Claude API Docs