使用 Claude Code:Session 管理與 1M Context
AI 語音朗讀 · Edge TTS
使用 Claude Code:Session 管理與 1M Context
今天我們針對 /usage 推出了全新的更新,旨在幫助您了解自己在 Claude Code 上的使用情況;這項更新是基於我們與客戶進行的多場對談後所做出的調整。
在這些對談中,我們不斷聽到一個問題:使用者在管理 Session 的方式上存在很大的差異,特別是在我們為 Claude Code 更新了 100 萬 token 的 context 之後。
您是只使用一個 Session,還是會在終端機中同時開啟兩個 Session?您是否會在每次 Prompt 時都開啟一個新的 Session?您何時會使用 compact、rewind 或 subagents?是什麼原因導致了糟糕的 compact 結果?
這裡面有許多令人驚訝的細節,它們確實會影響您使用 Claude Code 的體驗,而幾乎所有這些細節都源自於對 context window 的管理。
關於 Context、Compaction 與 Context Rot 的快速入門

Context window 是模型在生成下一個回應時,能夠同時「看見」的所有內容。它包含了您的系統 Prompt、目前的對話紀錄、每一次的工具呼叫及其輸出,以及所有被讀取過的檔案。Claude Code 擁有 100 萬 token 的 context window。
遺憾的是,使用長 context 會有輕微的代價,這通常被稱為 context rot(上下文衰退)。Context rot 指的是隨著 context 增長,模型效能會下降的現象,因為注意力被分散到更多的 token 上,且較舊、不相關的內容開始干擾當前的任務。
Context window 有嚴格的上限,因此當您接近 context window 的邊緣時,您需要將正在進行的任務總結成較簡短的描述,並在新的 context window 中繼續工作,我們稱此為 compaction(壓縮)。您也可以自行觸發 compaction。

每一個轉折點都是一個分支
假設您剛要求 Claude 完成某件事,而它已經執行完畢,此時您的 context 中已經有一些資訊(工具呼叫、工具輸出、您的指令),而您接下來有許多選擇:
- Continue — 在同一個 Session 中發送另一則訊息
- /rewind (esc esc) — 跳回到之前的訊息,並從該處重新嘗試
- /clear — 開啟一個新的 Session,通常會附上一份您從剛才的學習中提煉出的簡報
- Compact — 總結目前的 Session,並在該總結之上繼續工作
- Subagents — 將下一部分的任務委派給一個擁有獨立乾淨 context 的 Agent,並只將其結果取回
雖然最自然的方式是直接繼續,但其他四個選項的存在是為了協助您管理 context。

何時該開啟新的 Session
您應該何時維持一個長期的 Session,又何時該開啟新的 Session?我們一般的經驗法則是:當您開始一項新任務時,就應該開啟一個新的 Session。
1M 的 context window 確實意味著您現在可以更可靠地執行長期任務,例如讓它從零開始建構一個全端應用程式。
有時您可能會執行相關的任務,其中部分 context 仍然是必要的,但並非全部。例如,為您剛實作的功能撰寫文件。雖然您可以開啟一個新的 Session,但 Claude 將不得不重新讀取您剛實作的檔案,這會比較慢且成本較高。
使用 Rewind 而非修正

如果我必須挑選一個代表良好 context 管理的習慣,那就是 rewind。
在 Claude Code 中,按兩下 Esc(或執行 /rewind)可以讓您跳回到任何之前的訊息,並從該處重新 Prompt。該時間點之後的訊息將會從 context 中移除。
Rewind 通常是修正問題的更好方法。例如,Claude 讀取了五個檔案,嘗試了一種方法,但失敗了。您的直覺可能是輸入「那樣做沒用,試試 X」,但更好的做法是 rewind 到檔案讀取之後,並根據您學到的內容重新 Prompt:「不要使用方法 A,foo 模組沒有公開該功能——直接使用 B。」
您也可以使用「summarize from here」讓 Claude 總結它的學習成果並建立一則交接訊息,這有點像是從未來的自己(已經嘗試過失敗的方法)寫給過去那個版本的 Claude 的訊息。

Compacting 與全新 Session 的比較
當 Session 變得冗長時,您有兩種方式來減輕負擔:/compact 或 /clear(並重新開始)。它們感覺很相似,但運作方式截然不同。
Compact 會要求模型總結目前的對話,然後用該總結取代歷史紀錄。這是有損的,您必須信任 Claude 來決定什麼是重要的,但您不必自己撰寫任何內容,且 Claude 可能會更徹底地包含重要的學習成果或檔案。您也可以透過傳遞指令來引導它(例如 /compact focus on the auth refactor, drop the test debugging)。

使用 /clear 時,您可以自行寫下重要的內容(「我們正在重構驗證中間件,限制條件是 X,重要的檔案是 A 和 B,我們已經排除了方法 Y」)並重新開始。這需要更多工作,但產生的 context 是您認為相關的內容。
是什麼導致了糟糕的 Compact?

如果您執行了許多長期 Session,您可能已經注意到有時 compact 的結果會特別糟糕。在這種情況下,我們經常發現,當模型無法預測您工作的前進方向時,就會發生糟糕的 compact。
例如,自動壓縮(autocompact)在長時間的除錯 Session 後觸發,總結了調查過程,而您的下一則訊息卻是「現在修復我們在 bar.ts 中看到的另一個警告」。
但因為該 Session 專注於除錯,另一個警告可能已經從總結中被刪除了。
這特別困難,因為受到 context rot 的影響,模型在進行 compact 時正處於最不聰明的狀態。擁有 100 萬的 context,您有更多時間主動進行 /compact,並附上您想要執行的任務描述。
Subagents 與全新的 Context Window

Subagents 是一種 context 管理形式,當您預先知道某項工作會產生大量您之後不需要的中間輸出時,這非常有用。
當 Claude 透過 Agent 工具產生一個 subagent 時,該 subagent 會獲得自己全新的 context window。它可以執行所需的任何工作,然後綜合其結果,最後只有最終報告會傳回給父層。
我們使用的心理測試是:我之後還需要這些工具輸出嗎?還是只需要結論?
雖然 Claude Code 會自動呼叫 subagents,但您可能希望明確地指示它這樣做。例如,您可能會想要告訴它:
- 「啟動一個 subagent,根據以下規格檔案驗證這項工作的結果」
- 「啟動一個 subagent 來閱讀另一個程式庫,並總結它是如何實作驗證流程的,然後以同樣的方式實作它」
- 「啟動一個 subagent,根據我的 git 變更來撰寫此功能的說明文件」
總結
總結來說,當 Claude 結束了一個轉折點,而您準備發送新訊息時,您面臨一個決策點。
隨著時間推移,我們預期 Claude 將會協助您自行處理這些問題,但目前為止,這仍是您可以引導 Claude 輸出結果的方式之一。

