AI 程式設計教程中文版
從原理到實戰

02 · 一次能看多少程式碼

上下文視窗不是記憶,是一張會滿的工作臺。100 萬 token 聽起來巨大,但用了 78% 你就會覺察 Claude 變笨——理解這張桌子怎麼運作、怎麼管,操作上的困惑就全解開了。

翔宇用 Claude Code 的頭一個月,有時候它分析得頭頭是道,有時候聊著聊著就變笨了。翻了文件才發現,這不是智力波動,是工作臺被堆滿了。搞清楚這張工作臺的運作方式之後,很多操作上的困惑就全解開了。——翔宇

這一篇用 13 分鐘換什麼:上一篇 01 我們理解了 Claude Code 的核心是位置——AI 住在你電腦裡。這一篇拆它怎麼你的專案:透過上下文視窗,把程式碼攤在一張大桌子上。理解了桌子怎麼滿、怎麼管,後面的 CLAUDE.md、Skills、SubAgents 才有清晰的位置感。

1. 從最簡單的情況開始

想象你面前有一張桌子。你和 Claude 在這張桌子上協作——你把檔案攤開,它看了之後給你建議。

這張桌子就是上下文視窗(context window,會話工作臺)

最簡單的情況是這樣的:桌子是空的,你問了一個問題,Claude 回答了。桌上放了兩樣東西——你的問題和它的回答。很輕鬆,空間綽綽有餘。

這是所有人最開始用 Claude Code 的體驗:反應快、回答精準、感覺什麼都能搞定。

但隨著工作推進,事情會發生變化。我們用一個具體的會話場景往下走——今天你要修一個支付回撥的 bug

👤 你:賬戶充值後金額沒到賬,支付回撥日誌在 /logs/payment.log,可能跟 webhook 重試有關,幫我查一下。

🤖 Claude:好,我先看 payment.log 和 webhook 處理程式碼 (讀 8 個檔案:logs/payment.log 最近 200 行、controllers/webhook.tsservices/payment.tsmodels/transaction.tsqueue/retry.ts ……)

這個場景會貫穿整篇——從乾淨的桌子,一路跑到桌子被堆滿,再到我們決定怎麼處理。

2. 桌子上的東西越來越多

剛才那個支付 bug 調查繼續推進:你讓 Claude 看了 8 個檔案,每個幾百行;它跑了一次 webhook 重試測試,輸出了 600 行日誌;你和它來回討論了十幾輪,每輪分析至少 200 字……桌上已經堆了不少。

還有一些你看不到但確實存在的東西也在桌上:Claude Code 自身的系統提示(大約 50 條內建指令)、你的 CLAUDE.md 配置檔案、Auto Memory(自動記憶)的 MEMORY.md 前 200 行。這些在每次會話開始時就自動上桌了。

flowchart TB
    Desk["📋 上下文視窗<br/>(你的工作臺)"]

    System["🧠 系統級內容<br/>會話開始自動上桌"]
    User["💬 你說的話<br/>每條訊息、每個追問"]
    AI["🤖 Claude 的回答<br/>通常比你的提問更長"]
    Files["📁 讀取的檔案<br/>500 行 ≈ 5000-7000 token"]
    Cmd["⚡ 命令執行輸出<br/>測試 / 編譯 / 安裝日誌"]

    System --> Desk
    User --> Desk
    AI --> Desk
    Files --> Desk
    Cmd --> Desk

    Desk -.->|持續累積| Full["⚠️ 桌子被堆滿<br/>表現開始下降"]

    style Desk fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
    style Full fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
    style AI fill:#fee2e2,stroke:#ef4444

通俗講:想象你在開一個長會。每個人說的話都在往白板上寫——你說的、對方說的、中途查的資料、開啟的檔案。白板很大,但不是無限大。如果會開得夠久,白板總會寫滿。

回到支付 bug 的會話。10 輪對話後,桌上已經堆了:

  • 8 個原始檔 ≈ 4 萬 token
  • 600 行日誌 ≈ 8000 token
  • Claude 的 10 段分析 ≈ 1.5 萬 token
  • 你的提問 + 系統提示 + CLAUDE.md ≈ 3000 token

加起來 7 萬 token——感覺寫滿了?還差得遠。繼續往下讀。

3. 這張桌子有多大

現在給桌子加一個數字:100 萬 token(1 million token,詞元)。

1 個 token 大約是 4 個英文字元(約 0.75 個英文單詞),中文大約 2 個 token 對應 1 個漢字。所以 100 萬 token 約等於 50 萬中文字——5 到 6 本長篇小說的篇幅。

換算到程式碼場景:

單位大約 token實際大小直覺對照
1 行程式碼10-151 個完整語句
1 箇中型原始檔3000-7000200-500 行一個 controller / service
20 萬 token(舊版上限)200,0001.5 萬行程式碼能看一個模組的幾個檔案
100 萬 token(Sonnet 4.6 / Opus 4.7 當前)1,000,0007-8 萬行程式碼能看完一箇中型專案全部原始碼

事實基準:Opus 4.7、Opus 4.6、Sonnet 4.6 都支援 1M context window(官方說明)。Max / Team / Enterprise 套餐 Opus 自動啟用 1M。其它套餐 / Sonnet 1M 可能需要額外用量。模型別名加 [1m] 字尾顯式啟用:/model opus[1m]

回到支付 bug 的場景。我們剛才算了 7 萬 token——這張桌子用了 7%。剩下 93 萬 token 還能裝很多東西。

能裝很多東西不等於應該裝很多東西。這就引出了下一個問題。

100 萬 token 和 20 萬 token 的區別不只是大了 5 倍。當你能同時看到整條鏈路時,你能發現的問題型別發生了質變——路由傳了 userId 但控制器期望 user_id 這種跨檔案的欄位不匹配,只看一個檔案永遠發現不了。100 萬 token 讓一類原本不可能發現的問題變得可以發現

20 萬 token 像是隻能透過鑰匙孔看房間——你能看清某個角落,但看不到全貌。100 萬 token 像是開啟了房門走進去——你能同時看到傢俱之間的空間關係。找一件東西的效率完全不同,不是快了 5 倍,而是從碰運氣變成了一眼看到

4. 桌子一定會滿

下一個自然的問題:它會滿嗎?

答案是:看你怎麼用。如果你只做簡單問答——問個問題、得到回答、再問一個——100 萬 token 可以聊很久很久。

但實際工作中不是這樣。繼續支付 bug 的故事——你越查越深,桌子從 7% 一路膨脹到 78%:

第 1-10 輪:7% 佔用

讀 8 檔案 + 跑測試 + 討論。桌上:原始碼 + 日誌 + Claude 的初步分析。

第 11-25 輪:18% 佔用

讓 Claude 重讀相關 controller 全部測試。又加了 12 個檔案 + 測試輸出。

第 26-40 輪:28% 佔用

檢查支付閘道器 SDK 原始碼。SDK 整個 src/ 目錄 ≈ 6 萬 token 進入工作臺。

第 41-60 輪:55% 佔用

讓 Claude 寫修復程式碼 + 跑全量測試。大量長 diff + 測試日誌。

第 61-80 輪:78% 佔用

反覆改 + 驗證 + 聯調。所有歷史持續累加,沒東西被釋放。

第 81+ 輪:接近上限

你開始覺察 Claude 回答變慢變笨——它需要掃描的桌面太大了。

關鍵點:上下文視窗不是一個裝東西的桶——東西放進去就靜靜待著。它更像一個每輪都要翻一遍的工作臺。每一輪互動,Claude 都要把桌上所有東西掃一遍才能回答。桌上東西越多,每輪掃描越慢、成本越高。所以能用多少就用多少不是最優策略,只放需要的東西才是。

而且有一個容易忽略的點:上下文消耗不是線性的。隨著對話深入,Claude 需要回顧之前的內容來保持連貫——這意味著每輪新互動,實際處理的資訊量都在增長

為什麼 Claude 在 78% 時會"變笨":模型每輪都要掃一遍桌上所有內容才能決定下一步動作。桌子越滿,掃描越慢、注意力越分散、關鍵資訊越容易被淹。這跟人開會到第 4 小時記不清前面討論一個道理——不是腦子壞了,是認知頻寬被堆滿。1M token ≠ 1M 都好用——經驗上 60-70% 佔用就開始觸發降級(Anthropic 的 prompt cache 機制對字首重讀有快取,但全域性注意力代價是真實的)。

所以問題不是會不會滿,而是滿了怎麼辦

5. 滿了怎麼辦:三種策略

Claude Code 提供了三種應對策略,它們適用場景完全不同。先用一張決策樹判斷該走哪條路:

flowchart TD
    Start["⚠️ 覺察上下文接近上限<br/>Claude 回答變慢 / 變笨"]
    Q1{"接下來的工作<br/>跟之前有關聯嗎?"}
    Q2{"任務本身能不能拆<br/>成多個獨立步驟?"}
    Compact["✨ /compact<br/>壓縮當前對話保留精華"]
    Clear["🧹 /clear<br/>清空重來"]
    Split["🪓 拆分任務<br/>每步用獨立會話"]

    Start --> Q1
    Q1 -->|有關聯,要繼續| Q2
    Q1 -->|完全無關,換主題| Clear
    Q2 -->|可以拆| Split
    Q2 -->|不能拆,必須連續做| Compact

    style Compact fill:#dcfce7,stroke:#22c55e
    style Clear fill:#dbeafe,stroke:#3b82f6
    style Split fill:#fef3c7,stroke:#f59e0b
    style Start fill:#fee2e2,stroke:#ef4444

三種策略各自的細節看下面的 tab:

/compact 壓縮

原理:讓 Claude 回顧當前對話,把核心資訊提煉成精簡摘要,然後用這個摘要替代原來那一大堆內容。

比喻:開了兩小時的會,有人站起來說要總結一下剛才討論的要點,然後擦掉白板上的細節,只留下幾條關鍵結論。白板騰出了空間,核心決策沒丟。

回到支付 bug:已經查到 78%,但 bug 還沒修完,正在反覆聯調。這時候用 /compact:Claude 把前 60 輪濃縮成一段 webhook 重試丟失冪等鍵、已修 4 檔案、測試還缺一輪,桌子從 78 萬 token 縮回 8 萬。繼續幹活,不丟上下文

進階用法:指定壓縮重點。

/compact 保留 webhook 幂等性相关的所有讨论

自動觸發:Claude Code 在上下文接近上限時會自動觸發壓縮,你不需要時刻盯著 token 數。但提前手動壓縮 / 清空仍然更聰明。

適合:任務還在進行 + 不能丟上下文 ❌ 不適合:下一步跟前面無關

/clear 清空

原理:直接清空整個對話歷史,回到一張乾淨的桌子。

比喻:擦掉整塊白板,重新開會。

回到支付 bug:bug 修完了,你接下來要寫一個新功能使用者郵件訂閱設定頁——這兩件事完全不相關。繼續在同一個會話裡幹,前面的 webhook / 冪等性討論就是噪音。/clear/compact 更省 token。

和 /compact 的本質區別

  • /compact = 壓縮但保留核心資訊
  • /clear = 全部丟棄

判斷標準很簡單——問自己:接下來的任務跟剛才聊的有沒有關係?有關聯用前者,無關聯用後者。

適合:切換到完全不同的任務 ❌ 不適合:當前任務還要繼續

拆分任務

原理:第三種不是命令,是工作方式。把大任務拆成多個小任務,每個用一個獨立會話完成。

回到支付 bug:其實它一開始就可以拆——

  • 會話 1(30 分鐘):分析 webhook + 冪等性,輸出根因報告 + 修復方案,儲存到 docs/bug-payment-webhook-analysis.md
  • 會話 2(20 分鐘,乾淨桌子):讀分析檔案,實施第一部分修復(修 controllers/webhook.ts
  • 會話 3(30 分鐘,乾淨桌子):讀分析檔案 + 修改後的 controller,寫測試 + 跑全量回歸

每個會話都從一張乾淨的桌子開始,只放當前步驟需要的東西

為什麼高效:一個任務的每個階段需要的資訊是不同的。分析階段需要看很多檔案但不需要之前的對話記錄;實施階段需要方案檔案和目標檔案但不需要分析過程。把所有階段塞進一個會話,大量空間被已經過時的中間資訊佔據。

適合:任務很大 + 階段之間能傳遞檔案 ❌ 不適合:必須強連續上下文的緊密任務

速記:三種策略不是互相替代——/compact 保留精華繼續幹,/clear 清桌子換任務,拆分任務從一開始就別讓桌子堆滿。

新手最常踩的坑:等 95% 才 /compact。他們盯著進度條,到 95% 才動手壓縮——這時候 Claude 已經"變笨" 半小時了,前面的判斷質量大打折扣。正確做法是 60-70% 主動 /compact,趁還沒明顯降級時把桌子騰乾淨;或者更早就用"拆分任務"從源頭避免堆積。

另一個常見誤區:以為 /compact 是免費操作。壓縮本身要讓 Claude 把整張桌子讀一遍再總結——這一輪本身就消耗大量 token + 時間。所以 /compact 不是"想壓就壓",是"任務還要繼續 + 上下文確實滿了"才用。簡單換主題直接 /clear 更省。

6. 一個容易混淆的地方

到這裡你可能注意到了:我一直在說桌子,沒有說記憶。這是故意的。

很多人把上下文視窗類比成記憶力——100 萬 token 就是記憶力超強,能記住很多東西。這個類比有一個致命的偏差:記憶是可以長期保留的,但上下文不是

一句話理解:上下文視窗是 AI 在一次會話中同時能看到的資訊總量,不是它能永久記住的東西。你一旦關掉這次會話,桌上的東西全部清空。下次開啟,桌子是空的。

看到記住是兩件事。你看一本書的時候,翻開的那些頁面你都看到了——但合上書之後你不一定記住了。上下文視窗決定的是 Claude 能同時翻開多少頁面,不是它能永久記住多少內容

那 AI 怎麼記住你的習慣和專案資訊?那是另一套系統——長期記憶。下一篇 03 · 怎麼記住你的習慣 會拆。

7. 回頭看全貌

把前面所有內容串起來,形成一個可操作的心智模型

階段桌子狀態你該做什麼
開始任務空(僅 CLAUDE.md + Auto Memory 摘要)放心讓 Claude 讀檔案、跑命令
工作進行中持續累積有意識關注趨勢:Claude 回答變慢 / 變笨 = 上下文快滿訊號
覺察到訊號接近上限走 §5 決策樹:/compact / /clear / 拆分
整個過程一個會話一個主題——上下文管理最省心的方式

底層邏輯:上下文管理的核心原則——讓桌子上永遠只有當前最需要的東西。不是追求桌子多大,而是追求桌子多幹淨。

8. 檢驗你真懂了嗎

費曼說,檢驗你是不是真的理解一件事,試試能不能解釋給朋友聽。

#試著用自己的話回答對應章節
1有人說 100 萬 token 就是記憶力好——你能解釋這說法錯在哪?上下文和記憶的本質區別是什麼?§6
2上下文從 20 萬擴到 100 萬,為什麼是質變不是量變?舉一個只有看全貌才能發現的問題型別。§3
3動手題 ⭐:在你下次 Claude Code 會話開始前,先想清楚這次任務要分幾步:① 調研 ② 設計 ③ 實現 ④ 測試。每步是同一個會話連著幹,還是開新會話?寫下你的拆分理由。提示:如果四步會議中前一步的程式碼片段對後一步不直接相關,就該開新會話——這就是 §5 拆分任務的核心。§4 + §5

過關標準:能用一句話說清——上下文視窗是 AI 一次會話能同時看到的資訊總量,不是永久記憶;桌子會滿,所以要主動管理。

📖 本篇術語速查表
英文 / 縮寫中文一句話解釋
context window上下文視窗AI 一次會話中同時能看到的資訊總量,本篇主角
token詞元模型讀 / 寫文本的最小單位,1 箇中文字大約 2 token
1M / 100 萬 token100 萬詞元Sonnet 4.6 / Opus 4.6 / Opus 4.7 當前的最大上下文
/compact壓縮命令把當前對話提煉成精簡摘要替換原內容,騰出桌面空間
/clear清空命令直接清空整個對話歷史,回到乾淨桌子
CLAUDE.md專案記憶檔案寫給 Claude 的長期指令,會話開始自動上桌(詳見 03 篇)
Auto Memory自動記憶Claude 自動維護的專案學習筆記,存在 MEMORY.md(詳見 03 篇)
MEMORY.md自動記憶主檔案啟動時只載入前 200 行或 25KB(取較小)
prompt caching提示快取重複字首快取機制,省 token 不省桌面空間

官方資料

接下來去哪

不用按順序全讀。挑你最好奇的那條線走就行。

本頁目錄