我以為 reset 會清乾淨。結果只是把同一包 context 換個名字再送一次
我昨天踩了一個超蠢的坑,分享一下我的 setup。
一開始我看到有人說 reset 之後還是立刻 context overflow,我第一反應也是,蛤,這不是模型太小嗎。結果我自己重現一次之後,老實說,問題常常根本不在 model。
我那條 agent workflow 原本有三層東西一起掛著:長 system prompt、專案記憶、還有上一輪壓過的摘要。平常不覺得,因為 session 是一路長大的。直到我手動 reset,理論上應該從乾淨狀態重來,結果新 session 第一句就又爆。
我先做了一個很土的檢查,把每次送出的 prompt 大小記下來。
第一次乾淨開局,大概 11k tokens。
reset 之後重開,直接跳到 33k。
再重試一次,還是 33k 左右。
看到這裡就知道不對了吧 XD
如果真的是全新 session,數字不可能長一樣。
後來我往三個地方查。
第一個是 agent 層的固定掛載。有些規則檔、memory、workspace note,不會因為你輸入 /reset 就消失。UI 看起來像新對話,實際上 preflight 還是先把那包東西塞進去。
第二個是 summary blob 被重用。我原本有一段自己的壓縮摘要流程,超過一定長度就把前面對話壓成一段 recap。問題是我 reset 的時候只清 chat,沒有把 recap cache 一起清掉。於是新 session 一進來,又把舊摘要整包貼回去。
第三個是 scope 設錯。我本來有一段設定偷懶寫成近似 global,想說省事。結果同一個 agent 開新 session,還是會撈到前一輪留下的狀態。這種東西平常很難注意,因為它不是每次都炸,是 context 快滿的時候才一起報仇。
我最後改了兩件事,效果差很多。
先把 reset 後的第一跳改成只載最小必要資訊,連 recap 都先不帶。真的要補,再由第二輪按需抓回來。
再來是把幾個本來共享的欄位拆成 per-session,包含壓縮摘要鍵、暫存工具輸出、還有我自己加的 debug note。
改完之後,同樣 workflow 再跑一次,reset 後第一輪回到 12k 左右,至少不會一開場就自爆。成功率沒有瞬間變神,但那種「明明重開了卻還背著舊包袱」的感覺就沒了。
所以我現在遇到 reset 後還 overflow,不會先怪模型。我反而會先問三件事:
- 新 session 到底載了哪些固定上下文
- 壓縮摘要或 memory cache 有沒有真的清掉
- 你的 scope 是 session 級,還是假裝 session 級
其實很多 agent 問題都這樣啦,看起來像模型不夠大,實際上是 workflow 沒切乾淨。
我現在甚至會直接留一個 debug 開關,reset 後先印出 prompt token 組成。因為只要看到新 session 還背著上一輪 20k 以上的東西,基本上就不用再瞎猜了 😅
作者:阿哲 (A-Zhe)