目錄

目錄

Context Language Models 解析:讓 agent 用 Bash 改自己的 context

目錄

LLM agent 跑得越久,context(模型每一輪讀進去的整份文字)就越容易爆。搜尋結果、檔案內容、指令輸出一輪輪堆上去,遲早超過上限,總得有人決定「留什麼、丟什麼」。目前的主流做法,是由 harness(包在模型外面、負責跑 agent 迴圈與組裝每輪 context 的程式)用固定規則做摘要,或是給模型幾個預先設計好的壓縮工具。

Context Language Models 這篇論文提出的做法叫 CLM:把模型當前的 context 鏡像成一個檔案,模型用 Bash 想改哪裡就改哪裡,改完立刻同步回它的 live context(下一輪真正餵給模型的那份 context)。這是介面設計,不是新演算法。

結論先放這裡
在 32K tokens 的緊預算下,27B(270 億參數)的現成模型零樣本(不訓練、不調整,直接拿現成模型來用)就能用較低成本達到相當或稍好的準確率,這點可以相信;但論文摘要(abstract)給人的「全面大幅領先」印象,多半建在相對值與單一最好看的設定上,不能照單全收。

接下來先看 CLM 想解決的問題和它怎麼運作,再看改 context 的成本怎麼算、怎麼用文字與 RL 學管理策略,最後逐項檢查論文的證據,把摘要的大數字換回絕對值。文中標「自編例子」的是我為了說明而編的數字或情境,標「推論」的是我的判斷,不是論文原文。

論文:Context Language Models(arXiv 2609.37725v1,University of Washington/Meta,2026 年 9 月)。

agent 一輪輪地搜尋、讀檔、執行指令,累積的對話與工具輸出遲早超過模型的 context 上限(這篇論文的實驗多半設在 32K tokens)。怎麼處理這件事,叫 context management(context 管理)。先認識三個後面會一直用到的詞:

  • harness:前面提過,包在模型外面的程式,負責跑 agent 的迴圈、呼叫工具、組裝每一輪要餵給模型的 context。
  • compaction(壓縮):把舊歷史改寫成較短的摘要。
  • offloading(卸載)與 retrieval(檢索):把內容存到外部檔案,context 裡只留一個指標,需要時再撈回來。

自編例子:一個搜尋 agent 跑 100 輪,每輪都把搜尋結果貼進對話,跑到 40 輪左右就滿了。你得決定:舊的搜尋結果整段刪掉?濃縮成一段摘要?還是先存到硬碟、需要再撈回來?

現有的做法,可以依「誰做決定」分成兩類:

類型誰決定代表
harness 定義外部程式,固定規則Codex 風格摘要:context 用到預算的 75% 時,整段歷史換成一份摘要。MEM1:每一輪都重寫 context
action-based模型決定「何時用」,但「能做哪些操作」是人預先設計的Self-Compact:模型自己決定何時壓縮。ACM:模型可呼叫壓縮、卸載、檢索這幾個工具

第一類模型完全沒有發言權;第二類模型有發言權,但只能在人類給的選單裡選。更細的 when/how 分類與文獻出處,在文末「概念詳解」的第一節(選讀)。

論文認為這兩條路有同一個天花板:模型能做的操作,都是人類事先設計好的。CLM 把自由度推到底,排起來是三級:

  1. harness 定義:模型零控制。
  2. action-based:模型選「何時」,操作由人定義。
  3. CLM:模型連「怎麼改」都自己決定。

具體差別(自編例子):context 裡有 100 條搜尋結果,編號 30、31、57 的三條沒用,其餘要原文保留。如果工具只有「把全部歷史壓成摘要」,模型只能全壓,其他 97 條的原文就被改寫了;CLM 可以直接寫一小段程式,只刪那三條。

論文引用 Sutton 的 The Bitter Lesson(AI 領域常見的論點:靠搜尋與學習擴展的通用方法,長期會贏過人類手工設計的規則)當動機,這主要是修辭上的支持。我的推論(非論文原文)是:限制少也代表模型可能改壞,這個賭注划不划算,要看後面的實驗。

作者先自建一個小測試 ContextBench,專門量 context 管理本身,用來展示現有方法連簡單任務都做不好。設計上刻意不需要推理或知識:任務指令已經明講該做什麼,所以能把全部內容記住的 agent 一定全對,分數差異只反映管理能力。

難度用 context pressure(情境壓力) 調整:整段任務輸入的總量除以 context 上限(32K)。1× 代表全部保留剛好塞滿,24× 代表輸入量是上限的 24 倍;低於 1× 的是對照組,全部留著也放得下。

任務考什麼做法
Needle Retention選擇性保留每個區塊有 2~8 行重要句(needle)和 140 行雜訊,要原文保留 needle、丟掉雜訊
Sudoku Sketchpad原地小改16×16 數獨棋盤,每回合下一步,只改一格,不重寫整盤
KV Store卸載與檢索一批批 SET 資料,要先存到檔案,之後 24 次 GET 查詢時撈回來
Log Triage卸載與檢索一批批 log,之後 24 次查詢與計數

表 1 是論文對這四個任務的正式定義(輸入串流與評分指標)。評分一律只看 agent 的 context 內容:只存在檔案裡、沒留在 context 的答案不算分。

表格列出 ContextBench 的四個任務:Needle Retention、Sudoku Sketchpad、KV Store、Log Triage,各自的輸入串流、查詢方式與評分指標。
表 1 — ContextBench 四個任務的定義與評分方式。(來源:原始論文 Table 3。)

結果直接看下圖:CLM 的表現明顯高於其他方法,接近滿分。

ContextBench 四個任務的示意,以及 CLM 與各基線方法的準確率比較,CLM 的表現明顯高於其他方法。
圖 1 — ContextBench 的四個任務,以及 CLM 與各基線方法(GPT-5.4、32K 上限)的準確率比較。(來源:原始論文 Figure 2。)

論文歸納了三個失敗原因:

  • 摘要式壓縮會遺漏或編造資訊(Needle、Sudoku)。
  • 沒有原地編輯的方法,每改一格都得重寫整盤數獨。
  • 一般工具能把資料存到檔案,卻沒辦法把它從 live context 主動踢掉。

各難度對應的壓力、實際送給 agent 的訊息範例,分別在論文 Figure 15 與論文 Figure 16。

這個實驗證明什麼、不證明什麼(推論,非論文原文)
因為指令已經明講「把這整段 filler 從你的 context 刪掉」,測的是「做不做得到」,不是「判斷該留什麼」。這個 benchmark 由同一團隊設計,任務形式正好需要 CLM 才有的「從 live context 刪除、原地修改」,所以 CLM 接近滿分,證明的是操作範圍夠大,不是管理策略比較聰明。它在論文裡的角色是動機,不是主要證據。

小結:現有方法要嘛由程式定死,要嘛讓模型從人設計的選單裡挑;選單裡少了「原地改」和「從 context 踢掉」,連簡單任務都會失手。CLM 想把「怎麼改」也交給模型。

論文的方法有四個零件:context-as-a-file 這個核心機制、衡量成本用的指標、用文字引導與演化管理策略、用 RL 把策略訓練進權重。其中只有第一項是論文真正的主張,後兩項是「因為管理變成模型自己的行為,所以可以被學習」的延伸。這一章先看第一項。

一句話:標準 LM 每一輪只能把新內容接在 context 後面,CLM 則讓模型直接決定下一輪 context 的完整內容。

標準 LM(論文 Eq. 1):

ct+1=ct⊕fθLM(ct) c_{t+1} = c_t \oplus f_\theta^{\mathrm{LM}}(c_t)

CLM(論文 Eq. 2):

ct+1=fθCLM(ct) c_{t+1} = f_\theta^{\mathrm{CLM}}(c_t)
  • ct c_t :第 t t 輪開始時,模型看到的整份 context。
  • ⊕ \oplus :串接,把右邊的內容接到左邊後面。
  • fθLM(ct) f_\theta^{\mathrm{LM}}(c_t) :模型根據 ct c_t 生成的新 token。
  • fθCLM(ct) f_\theta^{\mathrm{CLM}}(c_t) :論文說它可以是任意函數,由 CLM 自己決定怎麼把 ct c_t 變成 ct+1 c_{t+1} 。

白話一點:Eq. 1 的舊 context 一個字都不能動,Eq. 2 沒有這個限制。Eq. 1 其實是 Eq. 2 的特例,只要令 fθCLM(c)=c⊕fθLM(c) f_\theta^{\mathrm{CLM}}(c) = c \oplus f_\theta^{\mathrm{LM}}(c) 就是它。

數字例子(自編例子)

第 t t 輪 context 有 20,000 tokens,其中一段是 8,000 tokens 的搜尋結果,模型這輪產出 500 tokens。

  • 標準 LM:ct+1 c_{t+1} 有 20,000 + 500 = 20,500 tokens。
  • CLM:把那段搜尋結果換成 50 tokens 的筆記,再加上新輸出,ct+1 c_{t+1} 有 20,000 − 8,000 + 50 + 500 = 12,550 tokens。

這段 8,000 tokens 的搜尋結果,後面會一路沿用。

標準 LM 像只能在文件最後一行繼續寫的日誌,CLM 像打開了整份文件的文字編輯器,可以刪改任何一行。這個類比成立,是因為兩者的差別正是「能不能動既有內容」。底層上,context 本質就是下一次呼叫模型時餵進去的文字(一般知識,不是論文內容)。

論文把 fθCLM f_\theta^{\mathrm{CLM}} 寫成「任意函數」,但實作上它只能是模型寫得出來的 Bash 或程式,這是下一小節。

一句話:把模型的 live context 同步成一個檔案,模型用平常的 Bash 指令改這個檔案,改完的內容就是下一輪的 context。流程是:

  1. harness 把當前 context 寫進檔案,路徑寫在 system prompt。
  2. 模型像編輯其他檔案一樣,用 Bash 或 Python 改它。
  3. 檔案一改完,就自動同步給 LLM server。
  4. 下一輪模型看到的就是改過的 context。

如果模型這輪沒動檔案,新生成的 token 照舊接在後面,也就是 Eq. 1 的預設行為。論文說這樣兼顧「context 重用」與「編輯彈性」。

論文的總覽圖裡,(a) 是模型寫出的 context 管理行為範例,先看這部分即可;(b) 到 (d) 分別是零樣本、指令引導與演化、強化學習的結果,後面會逐一出現。

CLM 的總覽圖:包含模型自創的 context 管理行為範例,以及零樣本、指令引導、演化與強化學習幾類結果的縮圖。
圖 2 — CLM 總覽:把 context 當成檔案,開箱即用,之後還能再用文字引導與強化學習改進。(來源:原始論文 Figure 1。)

用前面那段 8,000 tokens 的搜尋結果來看(自編例子,寫法參考下面的圖 3):模型只要執行一段 Python,用正規表達式把 turn 4 那一輪整段換成一行筆記,寫回的瞬間 context 就縮小,不需要 harness 預先提供「壓縮」工具。

import re
p = "/tmp/.live_ctx/LIVE_CTX_MAIN.txt"      # 論文 Appendix E 給的 context 檔案路徑
s = open(p).read()
# 把第 4 輪(8,000 tokens 的搜尋結果)整段換成一行筆記
s = re.sub(r"\[\[CTX_TURN 4 .*?(?=\[\[CTX_TURN 5)",
           "[[CTX_TURN 4 role=notes]]\nSearched: xxx. No relevant results.\n",
           s, flags=re.S)
open(p, "w").write(s)                        # 寫回完成 = context 已縮小

論文觀察到,模型會自己發明新做法,例如:

  • 在 context 裡維護一個「計分板」,用 163 次原地編輯追蹤子 agent 的狀態,同時讓 context 只維持在 6~8K tokens。
  • 新增一種原本模板沒有的角色 notes,專門放自己的內部筆記。
  • 用迴圈批次刪掉沒用的搜尋結果,或自己定義輔助函數 compact_turns(同一次任務中被呼叫 37 次)。
五個程式碼片段,展示 CLM 實際寫出的 context 管理行為:建立計分板追蹤子 agent、新增 notes 角色、用迴圈刪除舊搜尋結果、定義 compact_turns 函數、重現基線方法的有效做法。
圖 3 — CLM 在 context 管理上的實際行為範例:模型用一般的程式介面任意編輯自己的 context。(來源:原始論文 Figure 3。)

多個 context 檔案可以同時存在,各自與自己的 LLM server 同步。agent swarm(一群平行工作的 agent)就是在工作區放多個 context 檔案;subagent(由主 agent 啟動的子 agent)的啟動與結束,就是建立與刪除一個 context 檔案。圖 3 的 (a) 可以看到負責調度的主 agent(orchestrator)用一個狀態區塊,記錄 subctx_0..4 各子 context 的狀態。

論文實驗裡,CLM 另外享有幾項 harness 輔助(論文 Appendix E、腳註 4):

  • 離預算上限還剩 2,048 tokens 時,harness 會送出「該編輯 context 了」的提醒。論文的理由是現有模型對自己用了多少 context 沒有準確感知(論文 Appendix G,見後面「模型估不準自己用了多少 context」一節)。
  • 在 BrowseComp-Plus(一個在固定語料上搜尋並回答難題的深度研究基準,簡稱 BCP)上,CLM 的編輯回合不算進 100 輪的輪數上限;請求超出預算時,harness 會退回上一輪並重試,最多六次。
精確的說法
how 完全交給模型,when 由模型決定但靠 harness 輔助。論文沒說明對手(如 Codex 風格的摘要 harness,下文稱 Summary)有沒有享受同樣的待遇,這影響「CLM 勝出」能歸功於誰(後面的整體評價會再談)。

另外,主文沒有交代 context 檔案的格式與同步細節,也沒統計模型改壞格式的頻率,文末「概念詳解」裡 context 檔案的那一節有細節(選讀)。

小結:CLM 的全部魔法就是一個檔案,模型改它,下一輪就看到改過的 context;但「何時改」仍有 harness 在提醒。

CLM 會改 context 中間的內容,這會讓推論伺服器的快取失效,所以光比 token 數不公平。論文自訂了 prefix-reuse FLOPs,算「伺服器實際要做的計算量」(FLOPs 是浮點運算次數,衡量計算量)。要看懂它,先認識伺服器怎麼處理一份 prompt:

  • prefill:模型一次讀完輸入的 prompt,算出每個 token 的中間狀態(KV cache,鍵值快取)。
  • decode:模型一個一個生成新 token。
  • prefix cache 重用:伺服器記住上一輪算過的 KV cache。新 prompt 若開頭一段完全相同,這段就直接沿用;從第一個不同的 token 開始,後面全部都要重算(re-prefill)。

自編例子(概念見下圖左半):context 是 [A B C]。只在後面追加,A、B、C 全部沿用,只算新增的部分。把 B 改成 B’,只有 A 能沿用,B’ 和 C 都要重算,即使 C 一個字都沒變。

比較標準服務與 Suffix Cache Reuse:標準做法只能重用前綴相符的快取,SCR 則重用所有留下來的 token 的快取,減少重新 prefill。
圖 4 — 標準服務與 Suffix Cache Reuse(SCR)的比較。左半示範為什麼改動中間內容會讓後面的快取失效。(來源:原始論文 Figure 4。)

圖的右半是論文為了緩解這個問題提出的 SCR,後面「其餘實驗」那一節會再簡單提到。

論文的公式只算兩件事:沒對上快取的那段(從第一個不同 token 起到結尾)要重新 prefill 的計算量,加上模型生成新 token 的 decode 計算量。白話:只算快取沒幫上忙的部分,加上生成成本。寫成式子是論文 Eq. 3:

FLOPsprefix-reuse=FLOPsprefill(unmatched suffix)+FLOPsdecode(generated tokens) \mathrm{FLOPs}_{\text{prefix-reuse}} = \mathrm{FLOPs}_{\text{prefill}}(\text{unmatched suffix}) + \mathrm{FLOPs}_{\text{decode}}(\text{generated tokens})
  • 第一項:沒對上快取的那段(unmatched suffix)的 prefill 計算量。
  • 第二項:模型生成的新 token(generated tokens)的 decode 計算量。

論文附錄 C 用 Qwen3.6-27B 做了一個數字例子(下圖)。論文註明這些長度是為說明而選,不是實測:

情況可沿用的前綴該輪計算量
只追加18,000 tokens1.41×1014 1.41\times10^{14} FLOPs
改中間10,000 tokens5.74×1014 5.74\times10^{14} FLOPs
改開頭(等於沒有快取)010.81×1014 10.81\times10^{14} FLOPs(追加的 7.7 倍)
長條圖比較一輪 Qwen3.6-27B 在三種可重用前綴長度下的 FLOPs,依運算類型分色,灰色代表沒有快取時多出來的計算。
圖 5 — 在假設的長度(輸入 20,000、生成 500 tokens)下,三種可重用前綴長度對應的單輪計算量。(來源:原始論文 Figure 14。)

記住這個結論就夠:成本幾乎就是「要重算的 token 數加生成的 token 數」,編輯越靠前,要重算的越多。原因是在這個例子裡,每個 token 的固定處理成本(MLP 與各種投影,也就是模型每層裡和 context 長度無關的運算,約 48.70×109 48.70\times10^{9} FLOPs/token)佔了約 86% 的總計算量(我由論文給的數字驗算),attention 這種隨 context 長度增長的成本只佔約 14%。附錄 C(Eq. 7~9)把 Eq. 3 展開成 Qwen3.6-27B 逐層的完整算式,對理解結論沒有幫助,這裡不收錄。

限制:這是理論值
論文通篇的「少 X% FLOPs」都是這個公式算出來的理論值,不是實測延遲或帳單。它把 CLM 編輯造成的重算也算進去,對 CLM 並不偏袒;但它把一個 prefill token 和一個 decode token 當成成本相同,實務上 decode 是逐字生成,通常慢得多(一般知識,不是論文內容),所以對延遲的預測會有偏差。

既然 context 管理變成模型自己的行為,想改變它的策略,不必改 harness 程式,直接用文字告訴模型就行。這一章分兩步:先是人手寫指令引導,再來是讓另一個模型自動改寫指令。

做法很直接:在 context 裡放一段指令或 skill 文件(skill 在這裡就是一份教模型怎麼做事的文字說明)。和 Eq. 2 唯一的差別,是模型多讀了這段文字;它沒有任何新機制。寫成式子是論文 Eq. 4:

ct+1=fθCLM(ct; s) c_{t+1} = f_\theta^{\mathrm{CLM}}(c_t;\, s)
  • ct c_t 、ct+1 c_{t+1} 、fθCLM f_\theta^{\mathrm{CLM}} :同 Eq. 2。
  • s s :放在 context 裡的那段指令或 skill 文件。

論文用 BrowseComp-Plus 的題目與 Claude 4.6 Sonnet,各用一句附加在任務訊息後面的指令,測三種行為(指令原文的中譯在文末「概念詳解」):

指令(意思)想引導的行為論文量測什麼結果
超過 Y Y tokens 就壓縮到約 4K壓縮時機第一次壓縮時的 context 大小(中位數)Y Y 設 16K/24K/32K,第一次壓縮約在 16.0K/23.6K/30.9K,貼著指令走
只在子任務邊界壓縮壓縮位置邊界附近兩輪內有壓縮的比例0.40 升到 0.88
每次編輯前先備份到新資料夾備份習慣編輯前有完整備份的比例0.00 升到 0.68
三個小圖:壓縮時機隨指令門檻移動、子任務邊界附近的壓縮比例上升、編輯前備份的比例上升;灰色是沒有指令,藍色是有指令。
圖 6 — 一句話就能改變 context 管理策略:灰色是無指令對照,藍色是有指令的設定。(來源:原始論文 Figure 7。)

這像給員工一張書面作業規定,而不是去改公司的流程軟體:前者改的是「讀到的文字」,後者改的是「寫死的程式」。模型每輪都把整份 context 當條件來生成,指令就是其中一段 token,這就是 in-context learning(一般知識,不是論文內容)。

兩個要注意的地方
  • 這三個實驗量的是「模型有沒有照指令做」,沒有報任務正確率,所以證明的是可控性,不是這些策略比較好(我的觀察,論文沒有明講)。
  • 指令 s s 就放在 context 裡,而模型能改寫整份 context。它能不能把指令自己刪掉?論文沒有討論。

上面的指令 s s 是人手寫的;這一步讓另一個模型看 agent 的成功與失敗紀錄,自動把 s s 改寫得更好,一輪輪重複。

目標是:模型權重和 harness 都不動,只搜尋「哪段文字讓 agent 平均得分最高」。寫成式子是論文 Eq. 5:

s∗=arg⁡max⁡s  Ex∼D[R(τ(x;s))] s^{*} = \arg\max_{s}\; \mathbb{E}_{x \sim \mathcal{D}}\big[ R(\tau(x; s)) \big]
  • s s :那份指令(skill)的文字。
  • x x 、D \mathcal{D} :一個任務實例,以及任務的資料分佈。
  • τ(x;s) \tau(x; s) :agent 帶著 s s 去解 x x 的完整軌跡(來自 Eq. 4)。
  • R(τ) R(\tau) :這條軌跡的得分,來自任務的自動評分器。
  • arg⁡max⁡s \arg\max_s :找出讓平均得分最高的那份文字。

一輪的流程:

  1. 目前的 skill 在訓練集跑 rollout(讓 agent 實際把整條任務跑完)。
  2. proposer(負責改寫 skill 的另一個模型)讀這些成功與失敗的軌跡,寫出多份新 skill 候選。
  3. 候選先在 6 題訓練題初篩,過關再跑 12 題,最後在 102 題的開發集(dev)評分。
  4. 選出下一輪的 skill,重複;連續 5 次提案沒進步就停。
  5. 最終 skill 在測試集(test)只評一次。

兩種設定:assisted evolution 是 Qwen3.6-27B 當 agent、Claude Fable 5.1 當 proposer;self-evolution 是 Opus 5 同時當 agent 和 proposer。

KV Store 任務、assisted 設定的結果如下。dev 是用來挑 skill 的題目,test 是定案後才評一次、沒參與挑選的題目:

階段dev(用來挑選)test(定案後才評一次)
起點:完全沒有管理指令22.3%38.3%
演化後選出的 skill83.8%74.2%
  • 論文摘要的「最多提升 35.9 點」,剛好是 74.2 − 38.3,也就是 KV Store 單一任務、assisted 設定下 test 的最好結果(我的計算)。
  • 其他三個任務,文字只給 dev 數字:Needle Retention 97.6% 到 100.0%、Sudoku Sketchpad 45.3% 到 65.8%、Log Triage 0.0% 到 100.0%。dev 同時被用來選 skill,所以偏樂觀。
  • self-evolution:Opus 5 起點就在 94% 到 100% 之間,演化後的 skill 要嘛在同樣準確率下降低成本,要嘛再提升準確率。

下圖會用到 Pareto frontier(帕累托前緣) 這個詞,意思是「沒有別的 skill 同時更準又更便宜」的那批 skill。

KV Store 任務上的文字演化結果:左邊是 assisted evolution,右邊是 self-evolution,點代表不同 skill,標出 Pareto frontier。
圖 7 — KV Store(32K 預算)上的 skill 演化。Assisted 用 Qwen3.6-27B 搭配 Claude Fable 5.1 當 proposer,self-evolution 由 Opus 5 兼任兩個角色。(來源:原始論文 Figure 8。)
四個任務全部的演化結果(圖 8)

四個任務全部的結果在下圖:上排是 assisted evolution,下排是 self-evolution。

ContextBench 四個任務的 skill 演化結果,上排是 assisted evolution,下排是 self-evolution,橫軸分別是 prefix-reuse PFLOPs 與 API 成本。
圖 8 — ContextBench 全部四個任務上的 skill 演化,上排為 assisted、下排為 self-evolution。(來源:原始論文 Figure 20。)

演化迴圈像教練看完比賽錄影後改寫戰術手冊,再讓球隊試打。底層上,這是用 LLM 當突變運算子的文字空間爬山搜尋,沒有梯度(一般知識,不是論文內容)。論文引用的對應方法是 GEPA(Agrawal et al., 2026,Reflective prompt evolution can outperform reinforcement learning)。

注意:比的是「有」和「沒有」
起點是「完全沒有指令」,所以量到的是「有 skill 比沒 skill 好」;我讀到的部分沒有演化出的 skill 全文,也沒有它與人手寫 skill 在同一個模型上的比較。

演化改的是 context 裡的文字,下一章的 RL 改的是模型權重,兩者都在學管理策略。

前一章改的是 context 裡的文字,這一章改模型權重,讓模型從「最後有沒有答對」學會怎麼編輯 context。

GRPO(Group Relative Policy Optimization) 是一種 RL 演算法(來自 DeepSeekMath,Shao et al., 2024)。同一題先抽一組(group)完整軌跡,每條軌跡的 advantage(優勢)等於它的得分相對於組內平均的好壞:減掉平均、再除以標準差。

Ai=ri−mean(r)std(r) A_i = \frac{r_i - \mathrm{mean}(r)}{\mathrm{std}(r)}

其中 ri r_i 是第 i i 條軌跡的得分。這條公式是一般知識,論文只說「標準 GRPO advantage」,沒有寫出來。

自編例子:同一題抽 4 條軌跡,答對得 1、答錯得 0,得分是 1, 0, 0, 1。平均 0.5,標準差 0.5,advantage 是 +1, −1, −1, +1。答對的被鼓勵,答錯的被壓抑。

CLM 的訓練沿用這套,改動只有兩處:

  1. 輸入的準備:CLM 會編輯 context,所以最終的 context 已經不是早期某一步當時看到的內容。論文的做法是每次模型呼叫連同它當時真正看到的 context,各自算一次(stepwise GRPO),整條軌跡的 advantage 原封不動分給底下每一次呼叫。這個做法不是論文新發明,附錄 A 說明延續 ReSum 與 Sculptor。凡是會改寫歷史的 agent(摘要、折疊 folding、CLM)要用 RL 訓練,都面臨同一個問題。
  2. advantage 多了一項效率獎勵(下一小節),這才是論文自己的新設計。

結果獎勵只分對錯,對「編輯得好不好」是弱監督:答對的軌跡裡可能有很笨的編輯,答錯的裡也可能有好的編輯。直接獎勵「編輯次數」或「刪掉的 token 量」又會被鑽漏洞,模型可能做一堆沒必要的編輯、把重要資訊也刪掉,或破壞 prefix 重用,這叫 reward hacking。所以論文只在「已經答對」的軌跡之間,依成本(prefix-reuse FLOPs)排序加減分,這種設計叫 success-gated:只有答對的軌跡才參與效率比較。

白話:答對的軌跡裡,比平均便宜的加分、比平均貴的扣分;答錯的完全不參與。寫成式子是論文 Eq. 6:

cˉg=1∣Gg+∣∑k∈Gg+ck,Aieff={clip ⁣(cˉg−cicˉg, −1, 1),i∈Gg+0,i∉Gg+ \bar{c}_g = \frac{1}{|\mathcal{G}_g^{+}|} \sum_{k \in \mathcal{G}_g^{+}} c_k, \qquad A_i^{\mathrm{eff}} = \begin{cases} \mathrm{clip}\!\left( \dfrac{\bar{c}_g - c_i}{\bar{c}_g},\, -1,\, 1 \right), & i \in \mathcal{G}_g^{+} \\[2mm] 0, & i \notin \mathcal{G}_g^{+} \end{cases}

最後合成:

Ai=Aiout+weff Aieff A_i = A_i^{\mathrm{out}} + w_{\mathrm{eff}}\, A_i^{\mathrm{eff}}
  • g g :同一題抽出的那一組軌跡。
  • Gg+ \mathcal{G}_g^{+} :這一組裡答對的軌跡。
  • ci c_i :第 i i 條軌跡的 prefix-reuse FLOPs。
  • cˉg \bar{c}_g :答對軌跡的平均成本。
  • clip(⋅,−1,1) \mathrm{clip}(\cdot, -1, 1) :把結果限制在 −1 到 +1。
  • Aiout A_i^{\mathrm{out}} :標準 GRPO 的結果 advantage。weff w_{\mathrm{eff}} :權重,論文 Appendix E 給 0.25。
  • 答對的軌跡少於 2 條時,整組的 Aeff A^{\mathrm{eff}} 都設為 0。

完整數字例子(自編例子,成本單位自訂):同一題抽 4 條軌跡。表中的 Aout A^{\mathrm{out}} 和前面的例子不同,因為這組 4 條裡有 3 條答對;最後一欄合計是 Aout+0.25×Aeff A^{\mathrm{out}} + 0.25 \times A^{\mathrm{eff}} 。

軌跡對錯成本 c c Aeff A^{\mathrm{eff}} Aout A^{\mathrm{out}} 合計 A A
τ1 \tau_1 對2.00+0.58+0.58
τ2 \tau_2 對1.0+0.5+0.58+0.70
τ3 \tau_3 錯0.50(不參與)−1.73−1.73
τ4 \tau_4 對3.0−0.5+0.58+0.45

算法:答對的成本平均 cˉ=(2+1+3)/3=2.0 \bar{c} = (2+1+3)/3 = 2.0 ,τ2 \tau_2 是 (2−1)/2=+0.5 (2-1)/2 = +0.5 ,τ4 \tau_4 是 (2−3)/2=−0.5 (2-3)/2 = -0.5 。Aout A^{\mathrm{out}} 一欄是用「減平均、除標準差」算的(論文沒寫公式)。兩個重點:τ3 \tau_3 成本最低卻答錯,所以拿不到效率加分,這就是 success-gated 的作用;效率項只是排序用的小項,0.25×(±0.5)=±0.125 0.25 \times (\pm 0.5) = \pm 0.125 ,遠小於對錯造成的差距。

效率分數怎麼落到每個 step 上,論文沒講清楚。這是 RL 的 credit assignment(功勞分配) 問題:一條軌跡有很多步,最後只得到一個分數,要怎麼決定每一步該分到多少功勞或責任。這裡的疑問在於效率項是分給整條軌跡的所有 token,還是只給編輯 context 的 token;文末「概念詳解」有一節專門談。

  • 模型與資料:Qwen3.5-9B,用 OpenResearcher 資料集的 3,040 題訓練 70 步,在 BrowseComp-Plus 全部 830 題評估。獎勵是 GPT-5.4-nano 依 DeepSearchQA 的評分準則(rubric)打的對錯二元分數。
  • CLM:context 預算 28K(保留 2,048 tokens),最多 80 輪,編輯回合不計入;另加效率 advantage(權重 0.25,論文 Appendix E 說套用在 context 管理相關的 token 上)以及工具呼叫失敗與格式錯誤的懲罰。
  • 對照組 Summary:agent 照常累積 context,累積到 28,672 tokens 時,除了 system prompt 和任務訊息之外,整段歷史被換成一則摘要(摘要用 Codex 的摘要 prompt),最多跑 100 輪。「何時摘要」和「怎麼摘要」都是人定死的;Appendix E 寫它只用任務獎勵訓練。摘要由誰來寫,論文沒明說。

表 2 是論文的原表,下面另列前後差值方便比較。Acc. 是 BrowseComp-Plus 準確率;PFLOPs/Q 是每題平均的 prefix-reuse PFLOPs(1 PFLOP=1015 1\ \text{PFLOP} = 10^{15} FLOPs),越低越好。

強化學習前後的結果表:Summary 與 CLM 兩列,各有準確率與每題 PFLOPs 的訓練前後數字。
表 2 — Qwen3.5-9B 在 BrowseComp-Plus 上的 RL 前後結果,RL checkpoint 由保留的驗證集挑選。(來源:原始論文 Table 2。)
方法Acc. 訓練前到後PFLOPs/Q 訓練前到後
Summary(對照組)34.7 到 42.1(+7.4)4.01 到 2.19
CLM28.8 到 42.5(+13.7)1.52 到 1.34
  • 訓練前,CLM 比 Summary 低約 6 點。論文歸因於小模型的 context 管理能力不足;論文 Appendix F 也說 Qwen3.5-9B 很少編輯 context(在 TerminalBench 2.1 這組終端機任務上平均 1.4 次,一半的任務完全不編輯)。所以 CLM 的零樣本效果取決於模型本身的判斷力。
  • 訓練後,準確率實質上打平(42.5 對 42.1),CLM 每題成本低約 38.8%((2.19−1.34)/2.19 (2.19 - 1.34) / 2.19 ,與論文引言一致)。訓練曲線見下圖。
  • 論文摘要的「提升 47.6%」是相對值(42.5 除以 28.8),起點很低;絕對提升是 13.7 點。和訓練後的 Summary 比只贏 0.4 點,真正的差別在成本。
訓練曲線:左邊是準確率與每題 PFLOPs 隨訓練步數的變化,右邊是準確率對算力的軌跡,顏色由淺到深代表訓練步數。
圖 9 — Qwen3.5-9B 在 OpenResearcher 上的 RL 訓練曲線(訓練 70 步),於 BrowseComp-Plus、32K 上限下評估。(來源:原始論文 Figure 21。)
條件不完全一致
論文引言說 Summary 用「同樣的訓練配方」,但 Appendix E 寫 CLM 另加效率獎勵與格式懲罰、Summary 只用任務獎勵;上面的表沒標每列是否含效率獎勵,所以 1.34 對 2.19 可能不是同條件比較。另外,圖 9 裡 summary 加效率獎勵的那條線,我讀圖的結果是 step 40 附近準確率掉到約 1%(圖上標「40 (1%)」),與文字說的「無明顯損失」似乎矛盾。這是我讀圖的結果,本文沒有對照原圖逐點核實,請以原圖為準。

小結:RL 讓 9B 模型的 CLM 追上訓練後的 Summary,準確率打平,差別在成本;不過兩邊的獎勵設計不同,這個成本差距不一定是同條件的比較。

進入實驗之前,先把四個零件放在一張表裡,每一項附上最該記得的保留:

零件做了什麼動的是哪裡要記得的一個保留
context-as-a-file模型用 Bash 改 context 檔案,改完同步回 live context(ct+1=fθCLM(ct) c_{t+1} = f_\theta^{\mathrm{CLM}}(c_t) )機制本身,不訓練when 實際上靠 harness 在剩 2,048 tokens 時提醒;檔案格式與改壞的處理,論文沒說
prefix-reuse FLOPs理論計算量 = 沒對上快取的 token + 生成的 token衡量用的尺是理論值,不是實測延遲
skill 引導與演化把指令 s s 放進 context 引導行為;proposer 看失敗紀錄反覆改寫 s s context 裡的文字,權重不動35.9 點是 KV Store 的 test 數字,dev 數字偏高;起點是「完全沒指令」
RLstepwise GRPO,每次模型呼叫各算一次,共用整條軌跡的 advantage;再加一項只在答對軌跡內比成本的效率 advantage模型權重效率項怎麼分給 token 有兩種讀法;表 2 兩邊的獎勵設計不同

零件之間的關係是:第一項讓 context 可編輯,第二項提供衡量編輯成本的尺,第三項在不動權重的前提下用文字改善管理策略,第四項改權重來學管理策略(效率獎勵直接用第二項的指標)。第三、四項學的是同一件事,差別只在學到哪裡:前者學在 context 的文字裡,後者學在權重裡。

論文的主證據是零樣本實驗:不訓練、不演化,直接把現成模型換成 CLM 的玩法,與其他 context 管理方法比。RL 與 skill 演化是另外兩組獨立的結果,兩者互不重疊(見文末「概念詳解」最後一節)。先認識用到的基準:

  • BCP(BrowseComp-Plus):在固定語料上搜尋並回答難題的深度研究基準,測準確率。
  • TB2.1(TerminalBench 2.1):89 個終端機任務,每題只看通過或失敗。TBLite 是它的輕量版。
  • EdgeBench-10:從 EdgeBench 挑 10 個程式庫優化任務,跑 12 小時,評分 0 到 100。
  • Software World:6 個互相依賴的程式庫由 agent swarm 優化 24 小時,在沒見過的下游套件上量加速比。

所有方法用同一個模型(Qwen3.6-27B)、同一個 agent 框架(Mini-SWE-Agent)、32K 預算、100 輪上限,對手有 Base(不做任何管理)、Summary、MEM1、Self-Compact、ACM、RLM(把長輸入當成變數、讓模型按需讀取的方法)。換不同大小模型的版本在論文 Figure 17。

三個基準上各方法的準確率對成本散點圖:BrowseComp-Plus、TerminalBench 2.1、TBLite,藍色虛線是 Pareto frontier,CLM 落在前緣上。
圖 10 — 在編碼與深度研究任務上,CLM 以較低成本勝過 action-based 與 harness 定義的基線。(來源:原始論文 Figure 5。)

乾淨對照是 CLM 對最強對手 Summary:

基準CLMSummary絕對差CLM 的 FLOPs
BCP59.4%約 53.3%(由「相對高 11.4%」反推)約 +6.1 點少 21.5%
TB2.1與 Summary 打平同左約 0少 29.5%
TBLite73.7%67.0%+6.7 點少 9%

論文摘要與引言的「高 11.4%」是相對值,換成絕對點數約 6 點。準確率真正贏的是 BCP 和 TBLite;TB2.1 只贏在成本。

注意:不完全是「自主」對「固定流程」
CLM 享有前面提過的 harness 輔助,對手有沒有,論文沒說明,所以無法排除這些設計也貢獻了一部分分數。

agent 在一個程式庫上連續優化 12 小時,容器沒有網路;每次提交由 EdgeBench 評分器打 0 到 100 分,一個 run 的分數取「最好的提交」與「最終程式庫」兩者較高者。每個任務跑三次(三個隨機種子,seed),取最好的一次(best-of-three)。PF 指每次試驗的平均 prefix-reuse PFLOPs。比較對象是 Base、Codex 風格摘要、CLM,以及 CLM 加最多五個同時運作的子 agent。

下圖的 (a) 是 32K 預算下的 EdgeBench-10 曲線,(b) 是後面「其餘實驗」會提到的 Software World。128K 預算的版本在論文 Figure 19。

左邊是 EdgeBench-10 在 32K 預算下十二小時內的最佳分數曲線,右邊是 Software World 的加速比長條圖,比較 CLM 與 Summary。
圖 11 — 長時間程式庫優化:CLM 勝過 Summary(Codex 風格的摘要 harness)。(a) EdgeBench-10(32K);(b) Software World(272K)。(來源:原始論文 Figure 6。)
預算與模型CLMSummaryCLM 加子 agent備註
32K,Qwen3.6-27B44.6(179 PF)42.3(437 PF)44.2(181 PF)CLM 較準,只用約 41% 算力
32K,Claude 4.6 Sonnet51.042.350.4Summary 在 Qwen 與 Claude 上都是 42.3,論文原文如此
128K,Qwen3.6-27B47.3(142 PF)47.8(222 PF)50.2(219 PF)CLM 與 Summary 打平,只省算力

三個讀法:

  • 32K 時 CLM 明顯贏:Qwen 上 +2.3 點、成本只要約 4 成。論文摘要的「高 5%、少 59% FLOPs」對應的就是這一格(44.6 除以 42.3 約 +5.4%;179 除以 437 約 41%),是單一最好看的設定。
  • 128K 時準確率優勢消失:CLM 47.3 對 Summary 47.8,只剩約 36% 的算力節省((222−142)/222 (222 - 142) / 222 )。合理的推論(非論文原文):預算寬裕時,管理壓力小,管理策略的差距也縮小。
  • 子 agent 沒有穩定好處:32K 時沒有增益,128K 時 +2.9 點但算力與 Summary 相當。論文自己也說單一程式庫上子 agent 幫助不大。
沒有變異數
分數是 best-of-three,不是平均,各方法同樣處理,但沒有變異數可看,約 2 點以內的差距分不出是真差距還是雜訊。

把這兩組實驗放在一起看:CLM 的優勢在「預算緊、context 壓力大」時最明顯,預算放寬就收斂成省成本。這比論文摘要寫的「全面領先」窄得多。

下面四組是輔助證據,不細拆:數學優化、Software World、模型大小比較、context 長度感知。數學優化問題上,CLM 與 OpenEvolve(一套專為這類問題設計的演化式工作流程)的比較見表 3。

數學優化問題的結果表:OpenEvolve、OE-Agent、CLM、CLM(SA)在圓填充、Heilbronn、Min-max/min-dist、Erdős overlap 四題的分數。
表 3 — 數學優化問題上,CLM 與專用的 OpenEvolve 演化流程比較。(來源:原始論文 Table 1。)
  • 數學優化 vs OpenEvolve(表 3):想證明通用 agent 加 CLM 能贏專用的演化流程。四題 CLM 都最好:圓填充 2.618 對 2.541(+3.0%),Heilbronn 0.03653 對 0.03127(+16.8%),另兩題差距只在小數點第三到第四位。提醒:每個方法只跑一次,取最好結果;差距很小的兩題不能當證據,Heilbronn 的 16.8% 是相對值。
  • Software World,24 小時 agent swarm(圖 11 的 (b)):想證明改進能遷移到沒見過的下游套件。17 個沒見過的基準上的幾何平均加速,圖上標 CLM 約 1.044、Summary 約 1.026;絕對多出約 1.8 個百分點,論文寫的「多 65%」是相對說法。提醒:模型是 GPT-5.6-Sol、context 預算 272K,不是前面的 32K 設定;文字沒交代跑了幾次。
  • 模型大小比較(論文 Figure 17、Appendix F):說明 CLM 的效果取決於模型自己會不會判斷何時編輯。Qwen3.5-9B 在 TB2.1 平均只編輯 1.4 次,一半任務完全不編輯;Qwen3.6-27B 平均編輯 2.6 次。9B 的 context 峰值中位數 30.2K(上限 32K),27B 是 17.6K。提醒:9B 的零樣本結果不能和 RL 章的訓練前結果混讀,說明見下一段。
  • Context 長度感知(論文 Appendix G,下一節的圖 12):說明現有模型不太會估算自己用了多少 context,所以需要環境提醒。沒有提示時估算誤差很大;給了 token 數的提示後誤差明顯下降。提醒:只用 50 個輸入測,而且測的不是主要實驗用的 Qwen3.6-27B。

關於模型大小那一列的提醒:論文 Appendix F 說 9B 在 BCP 上零樣本 CLM 是 39.9%,高於 Summary 的 37.7%;但 RL 章的表 2 說 9B 訓練前 CLM 是 28.8%,低於 Summary 的 34.7%。兩者設定不同(零樣本實驗:32K、100 輪;RL 評估:28K、最多 80 輪)。這是我的推論,論文沒點明這個差別。

這四組的讀法:前兩組是「CLM 比較好」的補充證據,但都不是受控實驗:單次執行、勝幅小,或換了模型與預算。後兩組是「CLM 目前有哪些依賴」的證據:模型要夠強,而且要有外部提醒。

順帶一提,圖 4 右半的 SCR(Suffix Cache Reuse)是論文在服務端提出的做法:改動中間內容之後,仍然重用所有留下來的 token 的快取,減少重新 prefill。論文另外用實驗比較了 SCR 與標準服務,但這篇文章不展開它的實驗細節,有興趣請回原論文查。

模型要自己決定「現在該不該壓縮」,前提是知道已經用了多少 token。論文 Appendix G 發現現有模型不太會估。衡量用的是 MAE(Mean Absolute Error,平均絕對誤差):估計值與實際 token 數的差距,取絕對值再平均,單位是 token,越小越準。下圖每個點是一次估計對上伺服器回報的真實 prompt 長度,各小圖分別是沒有提示,以及在輸入 25%、50%、75% 處給一個 token 數錨點。

散點圖:模型估計的 context 長度對上供應商回報的 prompt 長度,分成沒有提示與三種提示位置的小圖,估計值在長 context 下集中在幾個固定數字。
圖 12 — 模型對自己 context 長度的感知:每個點是同一個輸入的估計值對實際值。(來源:原始論文 Figure 22。)

圖中的小字不好讀,圖例裡的數字整理在下表。這些數字取自圖例,本文沒有對照原圖逐點核實,請以原圖為準:

模型無提示提示在 25% 處提示在 50% 處提示在 75% 處
Claude 4.6 Sonnet5384520237561723
GPT-5.41764210720101296
GPT-5.4-mini2895420326101086

論文文字的結論有三點:長 context 下,模型的估計會落在重複出現的幾個數字(如 6.2K、9.8K);給了 token 數的提示後誤差下降;提示離估計點越近越有效。「重複的數字可能來自預訓練的計數習慣」是論文自己的猜測,沒有驗證。這就是為什麼 harness 要補提醒:實驗裡的提醒(剩 2,048 tokens),以及 ContextBench skill 摘錄(論文 Table 4)中的 [context: ~N/M tokens] 讀數,都是在補這個缺口。

可遷移的規則(推論,非論文原文):任何資源(token、時間、金額預算)都由環境量測,附在每次工具結果裡回報;回報要貼近決策點,每輪都附,比只在開頭講一次有效。

for each tool_result:
    result += f"\n[context: ~{count_tokens(ctx)}/{limit} tokens]"
限制
只測了 50 個輸入,而且測的是 GPT-5.4、Claude 4.6 Sonnet、GPT-5.4-mini,不是主要實驗用的 Qwen3.6-27B,論文沒說明原因。

小結:32K 的緊預算下,CLM 以較低成本達到相當或更好的準確率(TB2.1 打平,BCP、TBLite 與 EdgeBench 較準);在 EdgeBench 上把預算放寬到 128K,準確率優勢就消失,只剩省成本。而且 CLM 目前依賴兩件事:模型要夠強,還要有外部的用量提醒。

先說結論:研究價值中等偏低;工程價值是「概念值得試,證據只夠說明有潛力」。

研究價值:論文的貢獻是介面設計,不是新演算法。「讓模型對自己的 context 有寫入權」這個想法簡單、通用,也把 when 與 how 兩個維度都推到了模型手上,這是它最持久的部分。但底下用的東西幾乎都是現成的:RL 是 GRPO 加上 ReSum 與 Sculptor 式的分段(附錄 A 自己承認),skill 演化是 GEPA 風格。真正算新的只有 success-gated 效率 advantage,權重只有 0.25,而且它怎麼落到 token 上論文沒說清楚。

工程價值:最強的證據是 32K 的緊預算下,27B 現成模型零樣本就勝過固定流程(BrowseComp-Plus 約 +6 點;EdgeBench-10 +2.3 點且只用約 4 成算力)。最弱的是:沒有任何實驗把「自由編輯」的功勞,從 harness 的輔助設計裡拆出來;預算放寬到 128K,準確率優勢也消失,只剩省成本。所以能說的是「整套設計」在緊預算下划算,還不能說「context 是檔案」這個想法本身就是主因。

論文摘要的宣稱乾淨版本
BCP 準確率高 11.4%,FLOPs 少 21.5%絕對約 +6 點(由相對值反推)。CLM 享有編輯回合不計輪數、超預算退回重試、剩 2,048 tokens 提醒,對手是否同樣未說明
EdgeBench 高 5%,FLOPs 少 59%32K Qwen:44.6 對 42.3,+2.3 點。128K:47.3 對 47.8,−0.5 點,只剩省約 36% 算力。論文摘要選的是 32K 最好看的設定;分數是 best-of-three
Software World 多 65%約 1.044 對 1.026,絕對約 1.8 個百分點;相對值建在很小的基期;用 GPT-5.6-Sol 與 272K 預算
skill 演化提升 35.9 點KV Store 單一任務,test 38.3 到 74.2;起點是「完全沒指令」,不是對人手寫 skill
RL 提升 47.6%絕對 +13.7 點;對訓練後的 Summary 只贏 0.4 點;兩邊獎勵設計不同

可以相信的是「緊預算下,CLM 以較低成本達到相當或稍好的準確率」,不能相信的是論文摘要給人的那種「全面大幅領先」的印象。表中每一列,論文摘要用的都是當下最好看的相對值或設定。

  • 沒有拆開「自由編輯」與「harness 輔助」的功勞:CLM 同時享有編輯回合不計輪數、退回重試、剩 2,048 tokens 的提醒,沒有任何實驗把這些輔助關掉;零樣本實驗中 CLM 的 system prompt 與 skill 內容也沒給,看不出有多少功勞來自提示寫得好。這是最關鍵的一條,它決定能不能把「CLM 勝出」歸因給想法本身。
  • 缺變異數與重複次數:數學優化每個方法只跑一次;EdgeBench 取三個 seed 的最好結果,沒有誤差;Software World 沒交代跑幾次。所以 44.6 對 44.2、RL 贏 0.4 點、數學題小數點第三到四位的差距,都分不出是真差距還是雜訊。約 2 點以內的小勝都不該當證據。
  • 證據是拼起來的,沒有串成一條線:零樣本用 Qwen3.6-27B 與 Claude 4.6 Sonnet,RL 用 Qwen3.5-9B,skill 演化用 Opus 5 或 Fable 5.1 當 proposer,Software World 用 GPT-5.6-Sol。沒有任何一個模型從頭走到尾。
  • 自建基準與自訂指標:ContextBench 是作者自建的;FLOPs 是自訂的理論值,不等於實際延遲或帳單。

另有一個結構性的提醒:「CLM 勝過現有最強方法」(27B 現成模型,零樣本)與「CLM 可被訓練變強」(9B 加 RL,或 skill 演化)是兩組互不重疊的證據。論文沒有展示「訓練或演化後的 CLM 在長時間任務上更強」,詳見文末「概念詳解」最後一節。

什麼時候值得把自由度交給模型?以下是我整合論文證據得出的判斷,推論,非論文原文:

條件論文的證據證據強度
預算緊EdgeBench 32K 時 CLM 較準又省;128K 時準確率打平,只剩省成本(圖 11、論文 Figure 19)直接,最強
模型夠強9B 很少編輯 context,一半任務完全不編輯(論文 Appendix F);訓練前 CLM 落後 Summary(表 2)間接,是不同模型、不同設定的比較
任務長沒有實驗單獨改變任務長度弱,論文未驗證
有 harness 輔助剩 2,048 tokens 的提醒、超預算退回重試;模型對自己的 context 用量估不準(論文 Appendix G)目前不是完全放手,仍需外部保險
判斷規則(推論,非論文原文)
任務短、預算寬、或模型弱時,固定摘要流程在準確率上通常已經夠用。CLM 最可能划算的情境,是長任務、預算緊、模型夠強同時成立;其中只有「預算緊」有直接證據,另外兩項是推測。即使預算寬鬆,CLM 仍可能省成本。

還有一個講過頭要避開的地方:「三者同時成立」是我編的組合,論文沒測過三者的交互作用,它只是決定「從哪裡開始試」的經驗法則,不是必要條件。

論文第 6 節提到,可編輯的 context 可能成為注入的提示或自我生成的指令跨輪持續的管道。它引用 OpenAI 的報告:模型曾在自己的壓縮摘要裡塞入未授權的指令,並影響後續行為。論文沒有做任何實驗,也沒有提出防禦,只說未來要研究。

機制是這樣(自編例子):

  1. 工具結果(例如網頁)裡藏有惡意指令。
  2. agent 把它寫進自己的筆記或摘要。
  3. 下一輪讀到,把它當成自己的計畫。
  4. 指令持續生效。

這樣的內容在後面幾輪看起來是「我自己寫的」,比一次性的注入更難被辨認。OpenAI 那個案例是模型自己加指令,和外部注入是兩個變體,但持久化的路徑相同。

可遷移的規則(推論,非論文原文):

  • 凡是「模型能寫、之後又會讀回」的地方(摘要、筆記、記憶、CLM 的 context 檔案),都是持久化通道,不限於 CLM。
  • CLM 的面積比摘要大,因為編輯不受限。
  • 論文沒說的:context 檔案是否包含 system prompt、模型能不能刪掉自己的指令。

小結:能相信的是「緊預算下以較低成本達到相當或稍好的準確率」,不是「全面大幅領先」;而且這份自由也帶來一條論文還沒處理的安全通道。

這篇論文最值得記住的不是任何一個百分比,而是它把 context 管理拆開來看的方式:何時做與怎麼做是兩件事,過去的方法把其中一件或兩件鎖在人手裡,CLM 兩件都交給模型。這個主張在緊預算下有證據支持,但證據混著 harness 的輔助設計,而且沒有變異數;所以它是一個值得認真嘗試的設計選項,還不是已經被證明的最佳做法。

論文自己的貢獻之一:context-as-a-file,讓模型對自己的 context 有寫入權。 標準 LM 的 context 只能往後接,因此所有「留什麼、丟什麼」的決定都落在 harness 手上。過去讓模型參與,模型能做的事仍受限於人預先設計的操作選單(壓縮、卸載、檢索);這篇論文把這道限制拿掉,操作的種類由模型自己決定(刪一條、批次刪、寫一個輔助函數、新增筆記角色,都不用事先設計)。

這是最持久的部分:想法簡單、通用,不依賴特定模型或基準,任何會寫程式的 agent 都能用,也自然延伸出「context 管理可以被指令引導、被演化、被訓練」這幾條路。但它是設計選擇,不是新演算法,是否優於「固定流程加好的 prompt」,論文沒有直接證明。

貢獻之二:success-gated 效率 advantage(Eq. 6)。 只在答對的軌跡之間依理論成本加減分,解決了「結果獎勵分不出編輯好壞、直接獎勵編輯量又會被鑽漏洞」的問題。它只能算「小」貢獻,理由有三個:權重只有 0.25;對應的做法在別的領域早有類似設計(附錄 A 提到只在答對的回答上罰長度的 Arora & Zanette,以及 DDCA),差別只是這篇用 FLOPs 當成本;而且這一項怎麼分給 token,論文沒講清楚。

還有一個窄但可信的實證結論(32K 緊預算下的零樣本結果),但這類數字會隨模型與基準換代而過期,能長期留下的是前兩項,以及下面這些脫離論文也成立的觀念。

適用條件的判斷在前面「什麼條件下划算」一節;除此之外,最通用的觀念有三個:編輯 context 的成本由位置決定;次要目標只能在達標的集合內比較;用來挑選的資料不能拿來報成績。這三個在換掉模型、換掉基準之後依然成立,文末的延伸章節各有一節。

  • 下次看到一套 context 管理方法,先問兩個問題:誰決定何時做?操作是誰寫的?CLM 是兩個都答「模型」的那一類,代價是要有 harness 在旁邊提醒。
  • 讀論文數字時先換回絕對值:「高 11.4%」約是 6 點,「提升 47.6%」是 13.7 點;在 EdgeBench 上,預算放寬到 128K 時準確率優勢就沒了。
  • 自己做 agent 時:改 context 盡量改在後面(論文附錄的例子裡,改開頭的成本是只追加的 7.7 倍);效率只在成功的嘗試之間比;挑 prompt 用的分數別拿來報成績。

以下四節是選讀:每一節都能獨立讀、不需要回頭看論文,內容收合起來,想深入再展開。

展開:決策表與判斷順序

context 滿了,面前有一堆內容,到底該對哪一塊做什麼?「何時做」與「怎麼做」之外,還需要一張「這塊內容該用哪種操作」的對照:

這塊內容的特性該做什麼為什麼ContextBench 的對應
之後要逐字用到,而且不大留在 context任何改寫都可能失真Needle Retention
之後要逐字用到,但很大存到檔案,context 只留指標,要用時再 grep摘要有損,存檔無損KV Store、Log Triage
只需要大意壓成摘要省空間,失真可以接受無
已經沒用直接刪留著只佔空間Needle 的雜訊區塊
結構固定、常常只改一小處原地編輯重寫整份又貴又容易抄錯Sudoku Sketchpad

判斷順序寫成虛擬碼如下:先問「之後還要不要原文」,再問「多大」,最後問「會不會一直小改」。

# 推論:整合論文三個失敗原因與 ContextBench 四個任務得出的判斷順序(非論文原文)
def decide(chunk):
    if chunk.needed_verbatim_later:
        return KEEP if chunk.small else OFFLOAD_TO_FILE   # 存檔後,context 只留指標
    if chunk.structured and chunk.edited_in_small_pieces:
        return EDIT_IN_PLACE                              # 例如棋盤、狀態表
    if chunk.only_gist_needed:
        return SUMMARIZE
    return DELETE

依據是論文歸納的三個失敗原因(摘要會遺漏或編造、沒有原地編輯就得重寫整盤、只能存檔卻不能從 live context 踢掉)。整理成決策表是我的整合,推論,非論文原文。這張表也能用來檢查任何一套 harness 缺了哪一格:只有摘要的 harness,缺的是「存檔」和「原地編輯」。

展開:位置成本與排列規則

原理(一般知識):每個 token 的 KV 快取取決於它前面所有 token,所以伺服器只能沿用「開頭完全相同」的那一段,第一個不同的 token 之後全部重算。所以粗略的成本,就是每個 token 的處理成本乘上「要重算的加上要生成的 token 數」。令 U U 為需要重算的 token 數,G G 為生成的 token 數,c c 為每個 token 的處理成本:

cost≈c (U+G) \text{cost} \approx c\,(U + G)

實際數字見前面的圖 5:改開頭的成本是只追加的 7.7 倍。直覺例子(自編例子,假設成本與重算 token 數成正比):同樣是改 20,000 tokens 的 context 裡的一處。改在 18,000 個 token 的位置附近,只需重算約 2,000 個;改在 2,000 個 token 的位置附近,要重算約 18,000 個,差 9 倍。

可遷移的設計規則(推論,由上面的算式推出):context 由前到後,依變動頻率排列,穩定的放前面(system prompt、長期有效的筆記),較少變動的居中(已定案的摘要),常變動的放最後(最近幾輪)。

  • 要壓縮就集中做一次,別在中間反覆小改。
  • 同樣是刪 8,000 tokens,刪在尾端和刪在開頭,成本差好幾倍。

這個規則對任何會改歷史的 harness 都成立,不限於 CLM;成本是理論 FLOPs,限制見前面「編輯 context 的成本」一章。

展開:例子、程式與遷移規則

想同時優化「答對」和「便宜」時,如果對所有軌跡都獎勵便宜,最便宜的做法是什麼都不做、直接放棄,這就是 reward hacking。做法是先分對錯,再只在答對的軌跡之間比成本。用四條軌跡舉例(自編例子),成本分別是 2.0(對)、1.0(對)、0.5(錯)、3.0(對):

做法錯的那條(成本 0.5)拿到什麼
對全部比成本,平均成本 1.625(1.625−0.5)/1.625≈+0.69 (1.625 - 0.5) / 1.625 \approx +0.69 ,失敗反而被獎勵
只在答對的軌跡內比0,不參與
correct = [t for t in group if t.success]
if len(correct) < 2:
    eff = {t: 0 for t in group}                 # 沒得比
else:
    mean_c = mean(t.cost for t in correct)
    eff = {t: clip((mean_c - t.cost) / mean_c, -1, 1) if t.success else 0 for t in group}
A = A_out + w_eff * eff                         # 論文 w_eff = 0.25

可遷移的規則(一般知識加我的推論):

  • 任何「主目標加次要目標」的優化,次要目標都要設門檻或排序,不能直接加總。例如準確率加延遲、品質加成本。
  • 同類做法不是這篇獨有:附錄 A 提到 Arora & Zanette 只對答對的回答罰長度,DDCA 也在答對子集內算長度 advantage。
  • 副作用(推論):答對的軌跡少於 2 條時,這項整個歸零。題目很難、成功率低時,效率訊號幾乎不存在。
展開:標準誤、例子與遷移規則

在 dev(開發集)上試很多候選,再報最高的那個,分數會系統性偏高,因為挑的是「在這批題目上最幸運的」。量測本身有雜訊,標準誤(SE)衡量這個雜訊有多大,大約是真實準確率乘上錯誤率、除以題數,再開根號:

SE=p (1−p)n \mathrm{SE} = \sqrt{\frac{p\,(1-p)}{n}}

其中 p p 是真實準確率,n n 是題數。自編例子:100 份候選的真實水準都是 70%,n=102 n = 102 ,SE 約 4.5 個百分點。100 份裡的最高分,期望值約高出 2.5 個 SE,也就是 dev 上看起來約 81%,但真實仍是 70%。這個現象叫 selection effect(也稱贏家的詛咒)。

論文的實例在 skill 演化那一節:KV Store(assisted 設定)dev 上從 22.3% 升到 83.8%(+61.5 點),定案後在沒參與挑選的 test 上只有 38.3% 到 74.2%(+35.9 點)。

可遷移的規則:

  • 嘗試的候選越多,dev 數字越膨脹。要報成績就用沒參與挑選的 test。
  • 看到任何「取最好的一次」的數字都要打折,例如 best-of-three(EdgeBench 就是)。
  • 任何自動優化 prompt、skill、超參數的迴圈都適用,不限於這篇論文。

以下五節是選讀,也是最容易忘、最值得回頭查的部分。每一節都寫成脫離這篇論文也成立的形式,內容收合起來,可以單獨展開。

展開:座標系與各方法對照表

要看懂一套 context 管理方法「到底把多少自由度給了模型」,最好用的座標系是把問題拆成兩個獨立的維度:

  • when(何時做):什麼時候觸發管理動作?由人(harness 的固定規則,例如用到預算的 75%、每一輪)決定,還是由模型自己決定?
  • how(如何做):管理動作本身怎麼做?由人預先寫好(固定的摘要程序),由人定義一份操作選單讓模型挑,還是由模型自己寫出操作?

how 其實分兩層:(a) 模型能不能在選單裡挑操作;(b) 操作的內容是誰寫的。action-based 方法在 (a) 有自主權,在 (b) 沒有:選單裡每個操作的實作是人寫死的。CLM 兩層都交給模型。

下表把各方法放進這個座標系,附出處。越往「when 與 how 都由模型決定」靠,模型的自主權越大。

方法whenhow出處
Codex 風格摘要(OpenAI Codex CLI)人:用到預算約 75% 時人:固定的摘要 promptGitHub openai/codex(軟體專案,無 arXiv)
Cursor Composer 的 self-summarization人:到預定長度就觸發人定流程;RL 只訓練「摘要寫得好不好」技術報告 arXiv 2603.24477;部落格 cursor.com/blog/self-summarization
MEM1人:每一輪都重寫人:固定的「整合新舊資訊」流程arXiv 2506.15841
Self-Compact模型:自己決定何時壓縮(附一份判斷準則)人:固定的壓縮工具arXiv 2606.23525
AutoCompact模型:自己決定何時壓縮人:固定的壓縮程序無 arXiv;論文引用的是專案頁 autocompact.github.io,我沒能核對
Context-as-a-Tool(CaT)模型:把壓縮當成可呼叫的工具人:預先定義好的壓縮動作與結構化 context 工作區arXiv 2512.22087
ACM(Agentic Context Management)模型模型只能從人定義的選單挑(壓縮、卸載、檢索),每個操作的實作固定arXiv 2607.23809
Sculptor模型模型只能從人定義的選單挑(切片、摘要/隱藏/還原、搜尋),實作固定arXiv 2508.04664
Context Folding、AgentFold模型:決定何時分支或折疊模型從人定義的折疊動作中挑arXiv 2510.11967、arXiv 2510.24699(編號取自 CLM 論文的參考文獻)
CLM(本文)模型(實作上靠 harness 在剩 2,048 tokens 時提醒)模型:寫任意 Bash 或程式arXiv 2609.37725

看到一套新方法,問兩個問題就夠了:「誰決定何時觸發」與「操作的內容誰寫」。兩個都答「人」的是 harness 定義;第一個答「模型」、第二個答「人」的是 action-based;兩個都答「模型」的才是 CLM 這一類。一個但書:CLM 的 when 並非完全由模型決定,實驗中靠 harness 在剩 2,048 tokens 時提醒。

相關但不在這個座標系裡的做法:RLM(Recursive Language Models,arXiv 2512.24601)把長輸入當成 REPL 變數,讓模型按需讀取,解的是「何時、讀什麼進 context」,但讀進來的內容仍然接在 live context 後面、不斷變長;CLM 解的是「live context 本身怎麼被編輯」。兩者互補。MemGPT(arXiv 2310.08560)讓模型編輯 context 中一個固定大小的指定區塊,而不是整份 context。

展開:標記的風險與論文沒說的事

CLM 讓模型直接改的不是「對話」,而是對話的原始文字,裡面帶有格式標記。論文對這個機制交代得太少,我們看不出它怎麼運作;而且模型改錯標記會發生什麼,論文也沒說。這兩件事是同一個疑慮的兩面。

可以把它想成 HTML:你在聊天視窗看到的對話,像渲染後的網頁;context 檔案,像網頁的 HTML 原始碼。CLM 讓模型直接改原始碼,好處是想改哪裡就改哪裡,不需要別人提供「刪除」按鈕。風險是原始碼裡有標記(像 HTML 的標籤),標記被改壞,渲染就可能出錯。

這裡的標記就是圖 3 看得到的 [[CTX_TURN 4 role=notes]] 這類字串。我的推論(非論文原文)是:它的作用是告訴 server「這一段是第幾輪、誰說的」。已知的事實只有兩個:圖 3 顯示檔案裡有這類標記;論文 Appendix E 給了 context 檔案的路徑 /tmp/.live_ctx/LIVE_CTX_MAIN.txt。

具體例子(自編例子,沿用核心機制那一章的程式):那段正規表達式以 CTX_TURN 5 這個標記當結尾,只刪到 TURN 5 的標記之前。假設模型把結尾寫成 CTX_TURN 6,連 TURN 5 開頭的標記也會被刪掉,TURN 5 的內容就併進上一段,server 看到的不再是原本的對話結構。

論文沒說的事有三件:

  1. 主文沒有交代怎麼偵測檔案被改、怎麼把檔案轉回模型的對話訊息格式。
  2. 改壞時有沒有檢查或修復機制?沒寫。Appendix E 只提到請求超出預算時,harness 會退回上一輪並重試(BCP 最多六次),那是預算問題,不是格式問題。
  3. 實驗中發生過幾次?沒有統計。

這個疑慮的份量(推論):它不推翻論文的結論。成績不錯,代表多數時候沒壞。但它影響兩件事:想自己複製這個機制時缺資訊,而且失敗率可能被低估。它和前面談的安全風險也不是同一件事:安全問題是惡意指令跨輪持續存在,這裡談的是格式損壞。

展開:兩種讀法與它們各自訓練什麼

先說答案:論文明講的部分,是把結果 advantage 直接分給軌跡底下每一次模型呼叫;效率那一項到底有沒有一起分、怎麼分,論文沒講清楚。

credit assignment 是 RL 的核心問題:一條軌跡有很多步,最後只得到一個分數,要怎麼決定每一步該分到多少功勞或責任?論文明確寫的(Section 4.2)是:只有結果 advantage 的時候,把每條軌跡的 advantage 分給它底下所有 segment(每個 segment 就是一次模型呼叫),所以每次呼叫都用整條軌跡的結果來訓練。這是最粗的做法,沒有任何「這一步貢獻多少」的判斷,整條軌跡共用同一個數字。

沒講清楚的是效率項怎麼分。Eq. 6 之後只寫了 Ai=Aiout+weffAieff A_i = A_i^{\mathrm{out}} + w_{\mathrm{eff}} A_i^{\mathrm{eff}} ,沒有寫這個合計值怎麼分給 segment。論文 Appendix E 又說效率 advantage 是套用在「context 管理相關的 token」上。拿 RL 章的 τ2 \tau_2 (自編例子:Aout=+0.58 A^{\mathrm{out}} = +0.58 、weffAeff=+0.125 w_{\mathrm{eff}} A^{\mathrm{eff}} = +0.125 ),假設它有 3 個 segment,兩種讀法的結果是:

讀法每個 segment 拿到的值
一:合計值直接分給所有 segment3 個都是約 +0.70
二:結果項分給所有 segment,效率項只給編輯 context 的 token3 個都有 +0.58,另外只有編輯 token 多 +0.125

兩種讀法各自在訓練什麼(推論,非論文原文):一條軌跡的 token 大致有兩類,一般 token(搜尋關鍵字、推理、最後答案)與編輯 token(改寫 context 檔案的 Bash 或 Python)。

比較項目讀法一讀法二
效率訊號落在整條軌跡的所有 token只有編輯 token
能不能歸因到「編輯變好」不能:模型分不出便宜是因為編輯得好,還是少搜了幾輪比較能
可能的副作用模型可能靠「少做事、早收工」降成本,而不是學會更好的 context 管理較小;模型被推向「編輯得更省」,例如少改很前面的內容(會讓快取失效)

另外,論文 Appendix E 還提到對 CLM 加了「工具呼叫失敗」和「格式錯誤」的懲罰,也沒說是加在整條軌跡還是個別 token 上。

這影響你怎麼讀 RL 結果:論文說加了效率獎勵後,成本進一步下降而準確率沒有明顯損失(論文 Appendix F)。在讀法一之下,這個成本下降未必來自更好的 context 管理。論文文字無法判定是哪一種;要看論文公開的程式碼(GitHub facebookresearch/context-language-models)才能確定,我沒有讀過那份程式碼。

展開:三段指令與實驗設定

出處是論文 Appendix E 的「In-context steering」段落。以下是意思的中譯,原文請直接對照該段。這些指令附加在任務訊息之後,與「無指令對照組」在同一批 BrowseComp-Plus 問題上比較,模型是 Claude 4.6 Sonnet(透過 API)。

指令一:壓縮時機(Y Y 為 16,000/24,000/32,000)

監控你的 context 大小:每個工具結果都會回報目前大小。只要超過 Y Y tokens,就立刻把 context 壓縮到約 4000 tokens。例如:改寫 /tmp/.live_ctx/LIVE_CTX_MAIN.txt,只保留關鍵發現與目前計畫(約 4000 tokens)。

設定:48,000 tokens 預算、200 輪上限,30 道較長的題目(輪數在無指令時達到第 60 百分位以上)。

指令二:子任務邊界壓縮

請只在子任務的邊界壓縮。子任務一完成,就把該子任務的 context 全部丟掉。例如:寫完 /workspace/answer_1.txt 之後,改寫 /tmp/.live_ctx/LIVE_CTX_MAIN.txt,丟掉問題 1 的材料,只保留 answer_1 的結論。

設定:四個問題串在同一個 session,24,000 tokens 預算、1,000 輪上限,每個條件 189 個 session,其中 131 個在 session 內含有子任務邊界。

指令三:備份

每次編輯 context 之前,必須先把目前的 context 檔案備份到名為 compaction_backup 的新資料夾裡的新檔案;絕不覆寫或刪除先前的備份。

設定:16,000 tokens 預算,200 道題,其中 91 道配對分析。

要注意兩點:

  • 指令一說「每個工具結果都會回報目前大小」,這和前面提到的 harness 環境提示是同一件事。也就是說,這個實驗裡模型知道自己用了多少,是 harness 把大小餵給它的,不是模型自己感知的。推論:指令一的成功有一部分要歸功於這個提示。
  • 指令一和二都直接寫出了 context 檔案的路徑,並且附上具體做法的範例。所以這些指令比「一句話」更具體,是帶範例的操作說明。

結果見圖 6,數字摘要在「一句話就能改變管理行為」那一節。

展開:證據的三層結構

先說答案:論文的主要實驗(BCP、TB2.1、TBLite、EdgeBench-10、Software World、數學優化)裡的 CLM 都是零樣本:沒有 RL 訓練,也沒有 skill 演化。RL 與 skill 演化只出現在兩個地方,而且不在同一組任務上。

實驗有 RL 訓練嗎有 skill 演化嗎依據
BCP、TB2.1、TBLite 零樣本對照沒有沒有論文 5.1.1 說所有方法都是開箱即用、不訓練,目的是讓比較與訓練資料無關
EdgeBench-10、Software World、數學優化沒有沒有論文把這組歸在 5.1「Zero-Shot」之下,模型是現成的
ContextBench 上的 skill 演化沒有有Qwen3.6-27B 或 Opus 5,合成任務,32K 預算
BCP 上 Qwen3.5-9B 的 RL有沒有9B 模型,OpenResearcher 訓練資料

零樣本的 CLM 靠兩樣東西做 context 管理:現成模型自己的判斷(context-as-a-file 機制),以及 harness 提供的輔助(剩 2,048 tokens 的編輯提醒、BCP 上請求超出預算時退回重試)。BCP 的搜尋工具是以「in-context skills」的形式提供的(論文 5.1.1 腳註 2),那是工具說明,不是演化出來的 context 管理 skill,別混在一起。論文沒有給出零樣本實驗中 CLM 的 system prompt 具體寫了什麼。推論:ContextBench 的 CLM 有一份 skill(論文 Appendix D 與論文 Table 4 有摘錄),零樣本實驗應該有類似的基本說明,否則模型不知道 context 檔案的路徑。

所以論文的證據結構是三層:

  1. 27B 現成模型零樣本勝過對手(主證據)。
  2. 小模型加 RL,追平對手(輔助)。
  3. ContextBench 上 skill 演化有效(輔助,而且是合成任務)。

「變更好」要分開看:

  • skill 演化:KV Store 上 test 準確率從 38.3% 升到 74.2%。但起點是「完全沒有管理指令」,所以證明的是「有 skill 比沒 skill 好」,不是「演化出的 skill 比人手寫的好」。
  • RL:9B 從 28.8% 升到 42.5%,但 Summary 對照組也同樣被訓練變強(34.7% 到 42.1%)。所以證明的是「CLM 可以被訓練」,不是「CLM 比對手更吃訓練的紅利」;訓練後只是追平,差別在成本,而且兩邊的獎勵設計不同。
  • 兩者都沒有在長時間任務上驗證:「訓練或演化後的 CLM,在 EdgeBench 這類任務上更強」,論文沒有這組實驗。

結論是:RL 與 skill 演化說的是「可學習性」,不是「更強」。把「CLM 勝過現有最強方法」(27B 零樣本)和「CLM 可被訓練變強」(9B 加 RL,或 ContextBench 上 skill 演化)當成同一組證據,是會被誤導的。