跳至主要內容

    為什麼 AI 越聊越笨、一直犯同樣的錯?Anthropic 揭密 Context Engineering 實戰(2026 懶人包)

    別把所有資料全塞進對話!搞懂 CLAUDE.md 分層載入、注意力預算與 /compact 減肥

    sunny 桑尼· · 18 MIN READ · 98 次瀏覽

    為什麼 AI 越聊越笨、一直犯同樣的錯?Anthropic 揭密 Context Engineering 實戰(2026 懶人包)
    本文目錄

    你是不是也遇過 Agent 一直犯同樣的錯!?提醒了一次又一次,它還是照樣亂改。這篇帶你搞懂 Context Engineering,看完馬上用得到!

    Agent 又把同一個欄位改成舊名稱。你提醒它不要碰結帳模組,它下次仍改了。測試失敗後,它反覆修同一行,卻沒有讀懂錯誤訊息。這三種重複錯誤看起來都像「模型不夠穩」,但真正的病灶與處理方式完全不同。 若只要求它再想一次,這次可能勉強過關,下次任務仍會重來。

    遇到這種情況,我建議先問一件事:它在做決定的那一刻,眼前到底有什麼?

    模型每次決定下一步,只能根據當下送進去的那一包文字:系統指令、工具說明、你的規則檔、它讀過的檔案、到目前為止的對話。這一包叫 context,裝得下的上限叫 context window。Anthropic 在工程部落格〈Effective context engineering for AI agents〉裡把 Context Engineering(上下文工程) 定義得很精準:如果說傳統 Prompt Engineering 是在單輪對話裡把一句指令寫好,那麼 Context Engineering 就是在 Agent 多輪執行的每一刻,從大量候選資訊中挑選(Curation)並維護最合適的那組 token。

    Anthropic 原作比較單輪 Prompt Engineering(左)與多輪 Agent Context Engineering(右):關鍵動作在於中間的「Curation(挑選與維護)」。(圖片來源:Anthropic〈Effective context engineering for AI agents〉)

    快速回答 Agent 每次決定下一步,只看得到當下那一包 context:系統指令、規則檔、讀過的檔案和對話。同一類錯誤反覆出現時,先查三件事:該看的資訊在不在這一包裡、裡面有沒有兩條互相打架、錯誤訊息有沒有說清楚哪裡錯,再決定補在哪一層。對話裡交代的事最脆弱,Claude Code 自動壓縮後可能只剩摘要;要長期有效的規則,寫進 CLAUDE.md 或 AGENTS.md 這類規則檔。

    為什麼口頭提醒會被忘記?Context 裡的三層記憶與 /compact 壓縮機制

    以我日常主力用的 Claude Code 為例,別家工具(如 Codex CLI、Gemini CLI 或 Cursor)的分法其實大同小異。為什麼有些規則 Agent 永遠記得住,有些你才剛講完、過十幾輪對話它就忘得一乾二淨?這要分三層看:Agent 下決定時,context 裡的東西依「什麼時候進來、自動壓縮(/compact)後會不會留著」,可以拆成三種完全不同的生命週期(見圖 1)。

    圖 1|你在對話裡口頭交代的事屬於第 ③ 欄,是壓縮後最容易消失的那一層。
    1. 第一層:每輪都在(Always Loaded)。 廠商寫的系統提示和工具定義、專案根目錄的 CLAUDE.md 或 AGENTS.md、每個 skill 的名稱和一句描述,啟動時就載入,之後每一輪都固定佔著位置。
    2. 第二層:用到才讀(On Demand,漸進揭露)。 Agent 用搜尋找到、打開來看的檔案,跑指令得到的輸出;子資料夾裡的規則檔,要等它讀到那個資料夾的檔案才載入;skill 的完整內容,要等它決定用這個 skill 才讀。Anthropic 叫這種做法「漸進揭露(Progressive Disclosure)」:就像查百科全書時先看一頁目錄,確定需要哪一章才翻開內文。Agent Skills 開放標準(agentskills.io)把數字訂得很具體:啟動時每個 skill 只放名稱和描述,大約 100 個 token;啟用時才讀內文,建議控制在 5,000 token 以內。
    3. 第三層:只活在對話裡(Conversation Only)。 你在對話中口頭交代的話、它早先讀過的測試報錯、你們討論出來的決定。這一層最脆弱,因為只要觸發對話壓縮,細節就可能蒸發。

    對話快把 context 塞滿時,Claude Code 會自動壓縮:先清掉舊的工具輸出,再把對話整理成一段摘要。官方文件列得很清楚:根目錄的 CLAUDE.md 會從檔案重新讀進來;子資料夾的規則,要等 Agent 再碰到那裡的檔案才回來;至於對話早期交代的細節,文件的原話是「可能會遺失」,並建議把要長期有效的規則寫進 CLAUDE.md。

    觀察筆記:為什麼口頭提醒永遠救不了下一次?

    開場那句「你提醒它不要碰結帳模組,它下次仍改了」,背後的機制其實很單純:你把一條應該放在第一層(每輪都在)的長期禁令,隨手丟進了第三層(只活在對話裡)。 只要對話一長、系統自動跑了一次壓縮,你當初千叮萬囑的那句話就只剩摘要裡的半句話,甚至一個字都不剩。凡是下一個任務還要守的規矩,一律往左移寫進檔案。

    Context 視窗有 100 萬字,為什麼全塞進去 AI 反而變笨?(Context Rot)

    現在的模型動輒有一百萬 token 的 context window,很多人的直覺是:全部放進去最保險。這個直覺忽略了一件關鍵限制——Anthropic 稱為「注意力預算(Attention Budget)」。

    換句話說,你可以把 Context Window 想成公司的檔案倉庫,而模型的注意力預算是你眼前的辦公桌桌面。倉庫就算能塞進十萬份舊公文,如果你把十萬份公文同時倒在辦公桌上,你連今天要簽的那張單子都找不到。模型讀 context 時,每個 token 都要和其他 token 建立關係,$n$ 個 token 就有大約 $n^2$ 組關係要處理。內容越多,每一條資訊分到的注意力越少。Anthropic 指出這是一條逐漸下滑的坡,他們把這個現象叫做 Context Rot(上下文腐敗):塞進去的 token 越多,模型準確取回關鍵資訊的能力越差。

    Chroma 在 2025 年 7 月發表的《Context Rot》報告,把這件事量得很清楚。他們測了 18 個模型,其中一個實驗用長對話記憶基準 LongMemEval(得分範圍 0 到 1,越接近 1 代表記憶召回越準確,1.0 為滿分):同一批問題,一種只給回答所需的那幾段內容(平均約 300 個 token);另一種給完整的對話紀錄(平均約 11.3 萬個 token)。答案需要的內容一樣都在裡面,只是多了大量無關的對話(見圖 2)。

    圖 2|答案需要的內容一樣都在。多出來的 11 萬 token 無關對話,讓四家推理版旗艦模型全部答得更差。

    從圖 2 可以看到,多塞無關對話讓旗艦推理模型退步了 6 到 26 個百分點。 Chroma 也提醒,Claude 家族的落差有一部分來自它在資訊模糊時選擇不回答,這是比較保守的設計,不全是看漏。但整份報告的結論沒有例外:所有實驗裡,輸入越長,表現越差。

    資訊放在哪個位置也有影響。史丹佛等單位的研究〈Lost in the Middle〉給 GPT-3.5-Turbo 20 份文件找答案:答案放在第 1 份時,正確率 75.8%;放在正中間第 10 份時掉到 53.8%,比一份文件都不給、只靠模型自己盲猜(56.1%)還低。模型最容易看到開頭和結尾,最容易漏掉中間。

    觀察筆記:模型變強了,是不是就可以亂塞 CLAUDE.md?

    值得留意的是,「位置效應」正在隨模型演進變弱。Anthropic 在 2026 年 7 月的文章裡提到,較早的 Claude 模型有時需要重複指令或仰賴結尾位置,但新一代模型已不再需要;他們甚至替 Claude 5 世代刪掉了 Claude Code 八成以上的系統提示,內部 coding 評測完全沒有退步。日本科技媒體 @IT 報導這篇時,直接下了標題:「你的 CLAUDE.md 已經塞太多了」。

    我的判斷是:模型變強,解決的是「不必把同一句話重複罵三遍」,但解決不了「無關垃圾塞爆注意力預算」。 定期幫規則檔減肥、清掉過時的舊對話,依然是工程師自己的責任。

    Agent 一直犯同一個錯?3 種常見死循環與對應修法

    搞懂 context 的分層與注意力預算後,當 Agent 重複犯錯時,我們就能按圖索驥。這可以拆成三條排查路徑:

    症狀它看到了什麼先修哪一層

    該知道的事它不知道
    它看到了什麼
    那條資訊不在這一包裡
    先修哪一層
    讓資訊出現在它會走到的地方
    每次選的做法不一樣
    它看到了什麼
    這一包裡有兩條互相矛盾的資訊
    先修哪一層
    刪掉或標註過時的那一條,由人決定哪條算數
    改了好幾輪還在原地
    它看到了什麼
    錯誤訊息只說錯,沒說哪裡錯
    先修哪一層
    讓回饋指出哪個行為、預期是什麼、怎麼重現

    第一條路徑:該看的沒出現。 假設資料庫一律存 UTC 時間,畫面要顯示台灣時間,換算只在一個共用函式裡做。Agent 新增一張報表,直接拿資料庫的時間來顯示,結果差了八小時。它沒讀到那個函式,也沒有任何地方告訴它這條規矩。這時在對話裡再提醒一次,只能救這一次。持久的修法要依規則範圍放到對應的層級:

    • 全專案都適用的:寫進根目錄 CLAUDE.md(例如「時間一律存 UTC,轉換只在某個檔案做」)。
    • 只跟某個模組有關的:放在那個子資料夾的規則檔。
    • 最穩固的做法:讓錯誤寫法根本寫不出來,例如用型別區分 UtcTime 和 TaipeiTime,混用就直接編譯失敗。

    任務的基準也屬於這一類。請 Agent 修「目前的付款流程」,卻沒說以哪個分支為準,它可能讀到還在開發中的設計,套到已經上線的程式上。任務卡寫明以哪個分支或哪份文件為準,花不了幾秒,卻能省掉整輪白工。

    第二條路徑:看到的互相打架,或規則寫得太碎/太模糊。 README 寫安裝用 npm install,repo 裡的 lockfile 卻是 pnpm 的;舊的設計文件說 API 走 v1 路徑,程式早就搬到 v2。Agent 選了其中一份,未必是不聽話。對它來說,兩份都是你給的資料,你沒說哪份比較新。Claude Code 官方文件說得很直接:兩條指令互相矛盾時,Claude 可能任選一條。

    此外,Anthropic 在原作中也特別畫了一張光譜圖(見下圖),提醒工程師校准規則時的兩個極端陷阱:

    Anthropic 原作整理的規則校准光譜:太瑣碎的硬編碼清單(左)會讓系統脆弱且互相矛盾,太模糊的口號(右)則毫無指導力,最佳甜蜜點在中間(Just right)。(圖片來源:Anthropic〈Effective context engineering for AI agents〉)

    修法是把過時的那份文件刪掉,或標明它只是歷史紀錄。哪條規則有效,是團隊要做的決定,不能丟給模型猜。 Claude Code 內建的 /doctor prompt-audit 指令,可以幫你掃出規則檔裡互相矛盾、指向不存在檔案或寫給舊模型的過時內容。

    第三條路徑:回饋只說錯,沒說怎麼定位。 測試失敗時只印出一大段快照差異,或 CI 只回一句 exit 1。這些錯誤訊息會進到對話那一層,成為 Agent 下一步的依據;訊息越含糊,它越可能靠猜,甚至直接把測試改掉來湊綠燈。好的錯誤回饋必須同時給齊三件事:哪個行為失敗、預期值是什麼、怎麼重現。 測試本身怎麼變得可信,可以讀〈AI 寫的測試全過,為什麼功能還是錯的?驗證閉環完整懶人包(2026)〉。

    5 分鐘實測:用 /context 抓出吃空間元凶,親眼看口頭指令怎麼被洗掉

    在 Claude Code 裡,有兩個指令可以直接看見 context 裡有什麼:

    /context
    /memory
    

    /context 用彩色格子顯示目前 context 被哪些東西佔用,列出載入了哪些 CLAUDE.md 和記憶檔,也會對佔太多空間的工具給建議。/memory 打開並編輯 CLAUDE.md,順便看 auto memory 記了什麼。

    第一步,先跑 /context 檢查兩件事: 你以為 Agent 讀到的規則檔,真的在清單上嗎?哪一類東西佔掉最多空間?如果你接了很多 MCP 工具,或規則檔寫了好幾百行,這裡會看得很清楚。

    第二步,做一個五分鐘小實驗,親眼看壓縮會留下什麼。 準備一個測試用的 Git repo,依序執行這四個動作:

    1. 在根目錄的 CLAUDE.md 寫一行:「commit 訊息一律用英文小寫開頭。」
    2. 開 session 後,在對話裡口頭交代:「這個 session 裡,新增的檔案第一行都加上 // draft 註解。」
    3. 隨便請它做幾件小事,讓對話有點長度,然後執行 /compact。
    4. 請它新增一個檔案並 commit,看兩條規則各自還在不在。

    實驗結果會非常直觀:第 1 條規則會在壓縮後從檔案重新載入,100% 還在;第 2 條只剩摘要裡的一句話,有沒有被記住全靠運氣。 親手看過一次,你對「什麼該寫進檔案」的判斷會準很多。

    規則到底該寫在哪?CLAUDE.md、Skill 與 Hook 分層放置表

    把上面的機制換成日常工程決定,就是這張對照表:

    資訊的性質放哪裡理由

    每個任務都要知道,Agent 自己查不到
    放哪裡
    根目錄 AGENTS.md 或 CLAUDE.md
    理由
    每輪都在,壓縮後重新載入
    只跟某個資料夾或某類工作有關
    放哪裡
    子資料夾的規則檔、skill
    理由
    用到才讀,平常不佔位置
    這次任務的暫時決定
    放哪裡
    寫進計畫檔或任務卡
    理由
    對話會被壓縮,檔案不會
    一定要做到、不能靠它記得
    放哪裡
    hook、測試、CI
    理由
    不管它記不記得都會執行

    另外三個日常習慣也能大幅減少 Context Rot:

    • 換題目就清桌面:換到不相關的工作時用 /clear 開新對話,舊對話只會擠掉接下來需要的檔案。
    • 髒活外包給子代理(Subagent):要讀幾十個檔案做研究時交給子代理,讓它在獨立的 context 裡讀完,只把乾淨摘要帶回來。
    • 壓縮前指定保留重點:長任務執行 /compact 時順手加一句指示(例如 /compact 保留付款 bug 的修正方向與資料庫 schema),確保摘要留下你在意的事。

    規則檔具體寫什麼、寫多長、什麼不該寫,完整的做法和範例在〈AGENTS.md 怎麼寫?規則寫越多,Agent 反而越貴?(2026 完整教學+範例)〉。

    關於 Context 與 CLAUDE.md 最常見的 3 個踩坑誤區

    誤解一:「Context window 有一百萬 token,全部塞進去最保險。」 Chroma 的實驗正好相反:答案需要的內容都在,多塞無關內容,旗艦模型照樣退步最高 26 個百分點。容量是倉庫上限,能用的注意力預算有限。

    誤解二:「同一件事講三次,它就會記住。」 在對話裡講三次,壓縮後可能一次都不剩。新一代模型也不需要重複指令,要它長期記住,唯一解是寫進檔案。

    誤解三:「規則檔寫得越細越安全。」 每一行都是每輪都要付的 token 成本,也多一個跟別處矛盾的機會。Claude Code 的官方建議是每份 CLAUDE.md 控制在 200 行以內,越長越容易被忽略。

    總結:下次 AI 又鬼打牆,先跑 /context 檢查它的桌面

    模型會繼續變強,對位置的敏感、對重複的依賴,都在減少。但有兩件事不會因為模型變強就消失:不在那一包裡的資訊,它不可能知道;互相矛盾的兩條規則,必須由人決定哪條算數。 這篇的排查順序,專門解決「同一類錯誤反覆出現」的情況;偶發一次的錯,可能只是模型單次抽樣失準,不值得為它多寫一條規則。

    下一次 Agent 又犯同一個錯,先別急著換模型或責怪 AI 變笨。打開 /context 看看它眼前那張辦公桌擺了什麼,再決定那條資訊該補進哪一層。

    對話裡講的會被摘要,寫進檔案的才會回來。

    常見問題

    什麼是 Context Engineering?

    Context 是模型每次決定下一步時讀到的那一包文字:系統指令、規則檔、讀過的檔案、對話。Anthropic 把 context engineering 定義成「在推論時挑選並維護最合適的那組 token」(token 是模型讀寫文字的單位),重點在挑選:資訊給得多,模型不一定看得到;看得到的,也可能互相打架。

    Context window 有一百萬 token,全部塞進去不就好了?

    不保險。Chroma 在 2025 年 7 月測了 18 個模型:同一批問題給完整對話紀錄(平均約 11.3 萬 token),比只給相關內容(約 300 token)答得更差,四家推理版旗艦模型落差 6 到 26 個百分點。Anthropic 把這個現象叫做 context rot:token 越多,模型準確取回資訊的能力越差。

    Claude Code 壓縮對話後會忘記什麼?

    自動壓縮會先清掉舊的工具輸出,再把對話整理成摘要。專案根目錄的規則檔 CLAUDE.md 會從檔案重新載入;放在子資料夾的規則檔,要等 Agent 再讀到那裡的檔案才回來;對話早期交代的細節,官方文件說「可能會遺失」。長任務開始前,可以用 /compact 加一句要保留的重點。

    怎麼看 Claude Code 的 context 裡有什麼?

    執行 /context,它用彩色格子顯示 context 被哪些東西佔用,列出載入了哪些 CLAUDE.md 和記憶檔,也會對佔太多空間的工具給建議。先看兩件事:你以為它讀到的規則檔在不在清單上、哪一類東西佔掉最多空間。/memory 可以打開並編輯 CLAUDE.md。

    延伸閱讀

    參考資料

    工程文章與官方文件

    研究

    報導

    留言0

    登入後就能留言。

    登入