AI 程式開發與代理

[AI 脈絡 #1] Agent 為什麼會忘記指示

使用 Claude Code 等程式設計 Agent 時,畫面底部會出現「Context left until auto-compact: 8%」之類的警告。這是聊天型 AI 不會出現的提示。但能說明這個數字為何減少、歸零後會發生什麼事的人,意外地不多。

閱讀 6 分鐘
[AI 脈絡 #1] Agent 為什麼會忘記指示 封面圖

使用 Claude Code 等程式設計 Agent 時,畫面底部會出現「Context left until auto-compact: 8%」之類的警告。這是聊天型 AI 不會出現的提示。能說明這個數字為何減少、歸零後會發生什麼事的人,意外地不多。若你在工作階段初期明確說「不要修改測試」,一小時後 Agent 卻若無其事地改了測試檔案,十之八九就和這個數字有關。

本文是從原理到實務介紹 AI Agent 脈絡的系列第 1 篇。何時使用 /compact 和 /clear、為什麼用子 Agent 拆分工作等實務技巧,全都建立在「脈絡視窗有限」這項限制上。因此本篇從基礎開始,透過 Token、Attention 與 KV Cache 三把鑰匙,解析脈絡視窗究竟是什麼,以及為什麼無法無限擴大。

Token:AI 計算文字的單位

脈絡視窗的單位不是字元或單字,而是 Token。LLM 無法一次讀取完整文字,而是接收 Tokenizer 切分出的片段序列。切分依據是 BPE(Byte Pair Encoding)系列演算法,原理很簡單:在訓練資料中越常相鄰出現的字元組合,越會被合併成一個片段。像英文的「the」或「ing」這類常見組合會成為一個 Token,罕見單字則會被切成多個片段。

這裡有個對韓文使用者很重要的事實。由於 Tokenizer 的訓練資料以英文為主,即使內容相同,韓文通常也會比英文多用 1.5~2 倍 Token。「20 萬 Token 的脈絡視窗」以英文文件來看相當於兩本長篇小說,但放入韓文文件後體感容量大幅縮水,原因就在這裡。

脈絡視窗以 Token 為單位,代表「模型一次能讀取的最大量」。系統提示、對話紀錄、附件文件,以及模型目前正在產生的回答,都必須放在這個上限內。

為什麼 Agent 的脈絡特別快就滿了

首先必須知道,LLM 是沒有狀態(stateless)的機器。處理完一次請求後,模型不會把內容儲存在任何地方。別說昨天的對話,就連上一個回合的對話,對模型而言也從未存在過。

那麼對話如何延續?答案簡單得令人洩氣:App 每個回合都會重新傳送從系統提示到目前為止的完整紀錄。模型寫第十個回答時,不是「記得」前九次對話,而是剛剛重新從頭讀過。

如果是聊天型 AI,紀錄只有人類輸入的句子和模型回答,因此累積得較慢。Agent 則不同,因為每個回合都會伴隨工具呼叫。讀取一個檔案,就會把整個檔案內容加入脈絡;執行測試,會加入數百行失敗日誌;搜尋時,所有搜尋結果也會加入其中。使用者只輸入「幫我修好 Bug」一行,但若 Agent 讀了十個檔案、執行三次建置,一個回合就會消耗數萬 Token。這就是程式設計 Agent 會顯示脈絡剩餘量的原因:聊天可能要幾天才耗盡的容量,Agent 一兩個小時就會用完。

只靠一個回合的工具呼叫就會累積數萬 Token,而且每個回合都會重新傳送完整內容
只靠一個回合的工具呼叫就會累積數萬 Token,而且每個回合都會重新傳送完整內容

達到上限後,App 必須捨棄一些內容。它可能從最舊的回合開始刪除,或壓縮成摘要;如果工作階段初期訂下的「不要修改測試」等指示在此過程中被擠出去,模型就會在沒有做過這項約定的狀態下開始下一回合。不是記憶力變差,而是模型原本就沒有記憶,只是內容被推到可讀範圍之外。

有限的原因一:Attention 的平方成本

那麼,把視窗擴大到約 1 億 Token 不就好了嗎?Transformer 的核心運算 Attention(attention)會在這裡造成阻礙。

Attention 是處理新 Token 時,計算它與前面所有 Token 的關聯程度的機制。當程式碼出現 user 這個變數時,能把它和 3,000 行之前的宣告連起來,靠的就是這項能力。這是 LLM 看似理解脈絡的關鍵,也是成本來源。

由於每個 Token 都要查看所有 Token,計算量與長度的平方成正比。脈絡長度增加 10 倍,Attention 運算就會增加 100 倍。多虧稀疏 Attention、滑動視窗、FlashAttention 等最佳化,現在已有 100 萬 Token 的模型,但「參照完整脈絡的能力會隨長度產生急遽增加的成本」這項本質並未改變。

有限的原因二:KV Cache 這張記憶體帳單

問題不只有運算。記憶體方面還有另一張名為 KV Cache(Key-Value cache)的帳單。

模型逐一產生回答 Token 時,如果每次都從頭計算完整脈絡,會非常浪費。因此模型會將每個 Token 已計算出的 Attention 中間結果(Key・Value 向量)存進 GPU 記憶體並重複使用,這就是 KV Cache。問題是,這份 Cache 會按 Layer、按 Attention Head 分別累積,並隨脈絡長度成正比增加。

以 700 億參數級的開放原始碼模型為例,即使採用節省記憶體的技術(GQA),每個 Token 的 KV Cache 仍約為 300KB。填滿 12 萬 8 千個 Token 的脈絡後,光是 Cache 就約 40GB,會在模型權重之外,整整佔用一張高階 GPU 的記憶體。這就是擴大脈絡視窗不只是軟體設定,而是硬體與金錢問題的原因。

這項成本會直接反映在使用者費用上。LLM API 依輸入 Token 數量計費;再加上每個回合都重新傳送完整紀錄的架構,就能解釋為什麼長工作階段越到後面越昂貴、越慢。

stateless 模型的記憶每回合都從頭重讀,因此越長越慢、越昂貴
stateless 模型的記憶每回合都從頭重讀,因此越長越慢、越昂貴

總結

  • 脈絡視窗是模型一次能讀取的最大 Token 數。韓文比英文多用 1.5~2 倍 Token,因此不能直接相信規格上的數字。
  • LLM 是 stateless。對話記憶其實是每回合重新傳送完整紀錄,而 Agent 還會累積工具呼叫結果,所以脈絡比聊天型 AI 快得多就會填滿。
  • 視窗有限,是因為 Attention 運算會按長度平方增加,而 KV Cache 會按長度佔用 GPU 記憶體。脈絡既是能力,也是成本。

下一篇要打破一個常見觀念:脈絡越大越好。但多項研究已確認,脈絡越長,模型效能反而越低。本文將介紹 lost in the middle、context rot,以及規格數字為何不同於實際有效容量。

延伸閱讀