第十七節 歷史折疊(Compact)
當上下文接近模型上限時,AVL Code 會自動把歷史折疊為摘要,確保對話可以無限延續。
17.1 觸發方式
- 手動:工作階段分頁欄右鍵 → 折疊當前工作階段。
- 自動:助手在自身上下文接近上限時自動觸發,不打斷當前回合。
17.2 折疊後的可見性
折疊是只追加的:原訊息物理保留,只是被標記為"對當前回合不可見"。你可以在訊息流上點擊折疊摘要展開檢視原始內容。
17.3 保留的結構化訊息
折疊摘要中至少保留:
- 當前計畫與待辦的最新狀態
- 關鍵的工具執行結論
- 使用者已確認的關鍵決策
- 上下文必需的事實(路徑、版本號等)
17.4 多次折疊
長工作階段可能經歷多次折疊;每次折疊都是疊加而非取代,最早的內容總能逐層回溯回去。
17.4.1 自動折疊被中止時顯示真實原因
自動折疊(自動 compact)歷史被中止時,聊天區會顯示具體原因而不是籠統提示,方便你判斷是配置、上下文還是其它情況導致;優雅中止 / 保留工作階段的既有行為不變。
17.4.2 上下文超限根治
某些場景下對話可能突然報錯斷流(上游傳回 400),且自動壓縮也救不回來。真因往往不是 token 統計低估,而是 單條工具結果太大 — 例如安全掃描 sec.* 一次吐出近 300 KB 的 strings 提取,幾乎占滿整個上下文視窗,兩條背靠背就把下一次請求頂過視窗被上游直接拒絕(這種拒絕不傳回用量,反應式壓縮看不到、來不及觸發)。
兩層根治:
- 工具結果鉗制:每條工具結果先鉗到一個安全大小(約為上下文視窗的 6%,按 UTF-8 字元邊界安全截斷並留「繼續讀取」標記),從源頭消除「一步頂爆視窗」。
- 發送前預估式護欄:以上一輪真實用量為錨 + 本機估算本輪新增;預判會超窗就提前走"壓縮後繼續",不再白發一個註定被拒的請求。
17.4.3 自動壓縮後可靠續跑
自動壓縮歷史後,AI 有時會停下來只回一句寒暄 / 報當前時間 / 反問「請問需要我做什麼」,而不接着完成手裡的活。本版做了一組改進讓它可靠續跑:
- 續跑指令改為明確的指令式:直接要求依據壓縮摘要裡未完成 / 進行中 / 受阻的任務從下一步繼續自主執行,不要只回寒暄或當前時間。
- 續跑那一輪不再在末尾注入時鐘提示,避免弱模型把「當前時間」當成最新重點而忽略待辦。
- 萬一續跑還是停在反問上,自動補一記「繼續」(復刻你手動敲「繼續」的效果)把後續工作推完。
- 進度列復用手動
/compact同款(帶百分比 / 預計時間 / 實時字數),不再只有一個模糊的「處理中」指示。
17.4.4 思考型模型的壓縮不再被誤判超時
之前自動壓縮對所有模型用同一個固定總時限,遇到 reasoning / extended-thinking 型模型時,模型在思考階段沒立刻吐 token 就被錯殺,於是續跑前的摘要直接失敗。本版把等待改為空閒看門狗:只要伺服器端還在持續產出(包括 thinking 段落),就繼續等;只有真正一段時間無任何動靜才超時。結果:思考型模型也能正常完成壓縮摘要,對話不再被中途掐斷。
17.4.5 純空白回復不再被誤判為"結束"
推理型模型有時會在思考中間態吐出只有換行 / 空格的片段。之前終止判定是「輸出非空就算還在幹活」,這種純空白片段會被反向解讀為"已結束",整輪被提前掐斷。本版把判定改為「按去空白後是否為空」 — 思考中間態的空白段不再誤停,整段推理完整保留。
17.5 KV Cache 前綴快取治理(性能)
上游模型服務按「前綴快取」工作:系統提示 → 工具列表 → 對話歷史 這一長串,只要靠前的位元組沒變就能命中快取、跳過重算;一旦靠前位置有任何一位元組變化,從該處往後的快取全部作廢、整段重算。
為讓快取在整段對話裡持續保溫,AVL Code 在三個"每輪都在變"的源頭做了治理:
| 源頭 | 治理 |
|---|---|
| 工具列表順序 | 按工具名排序釘成確定順序(之前 Go map 遍歷是隨機的,每輪順序抖;治理收益最大、無條件每輪生效) |
| 目標(goal)塊 + 記憶召回 | 從系統提示前綴剝離,改為行尾瞬態注入(介面不可見、不落盤),只花當輪增量 token,不再牽連前綴快取 |
| 專案指令(AGENTS.md) | 特意保留在前綴 — 一次工作階段內穩定,留在前綴同位元組重讀不失效;編輯時才失效(正是期望行為) |
TUI 模式同步治理 — 命令列介面也把目標塊改為行尾瞬態注入,桌面 / 終端機兩種使用方式的快取表現一致。
效果:長對話、多輪工具呼叫場景下,命中快取的比例顯著提升 — 回應更快、token 成本更低。這條優化對使用者透明,無需任何配置。
17.6 記憶宮殿(長期記憶)
AVL Code 內置「記憶宮殿」作為跨工作階段的長期記憶庫。一段對話結束後,HookStop 會觸發記憶候選抽取,落到當前宮殿的草稿盒(_pending/ 子目錄)由你審閱;批准後才正式入函式庫進入相應「房間」(Room)。命令面板裡 /memorize <text> 直寫一條、/memory 開啟宮殿面板。
17.6.1 越用越聰明:召回加權與負反饋
記憶不再只按時間或匹配度排序:
- 召回 / 成效雙計:每條記憶帶
recall_count(被翻出來次數)與success_count(用了之後這一輪順利完成的次數),加權後常被命中又確實幫上忙的排得更靠前;老被翻出卻沒派上用場的慢慢沉底,不再乾擾判斷。 - 罕見詞加權:檢索時偏冷門 / 特徵更強的詞命中權重更高 — 更容易把真正相關的那一條翻出來,而不是被一般詞淹沒。
- 無關時少塞:與當前提問相關性弱的記憶不再一股腦注入,只保留你置頂(pinned)的幾條 — 既省 token 又減少乾擾。
- AI 自審的教訓自動沉澱:自檢門禁的
judge檢查器發現的問題(見 §10.11.1)會自動沉澱成記憶草稿進入待審區,下次遇到同類問題能直接復用。
17.6.2 衝突放「待審」,不硬覆蓋
新記的內容與舊記憶矛盾(同 Subject + Predicate 但 Object 不同 — 典型如偏好 / 決策翻轉)時,不直接覆蓋,而是落到草稿盒並標 ConflictHint = 舊記憶 ID:
- 前端
MemoryReviewPanel在該條上醒目顯示顯示「與舊記憶衝突」。 - 你可一鍵取代(舊記憶置過期)/ 保留舊的 / 駁回新的。
- 與
MergeHint(與舊記憶三元組高度重合 → 疑似重復、建議合並)互補:merge = 該合並,conflict = 該取代。
17.6.3 記憶健康看板
設置 → 記憶宮殿 → 健康看板 把每座宮殿的狀況一屏攤開:
| 指標 | 含義 |
|---|---|
| 總數 / 已過期 / 從未召回 | 概覽 |
| 房間數 / 每房間記憶數 | 容量分布 |
| 熱度榜(Top 10) | 召回最多的 — 經常派上用場的記憶 |
| 冷門清單(≤ 20) | 從未被召回的 — 可考慮清理 |
| 低效清單(≤ 20) | 召回夠多(≥ 5)但成功率 ≤ 20% 的 — 負反饋正在壓制,建議人工復核 |
| 疑似重復簇(≤ 20) | 同房間三元組高度重合(≥ 2/3 命中)的記憶簇 — 建議合並 |
| 草稿盒待稽核數 | pending_duplicates(疑似重復)+ pending_conflicts(疑似衝突) |
每一條都能直接跳到正式條目做置頂 / 編輯 / 刪除;簇可一鍵合並。
17.6.4 自動反省(復盤學習,GRAI+KISS)
開啟 *設置 → 智慧體 → 自省 → 「自動反省(復盤學習)」*(預設關,因為會有一次 LLM 呼叫成本)後,多步任務收尾時會自動跑一次復盤:按 GRAI 框架回顧這一輪——目標(Goal)、結果(Result,讀本次軌跡摘要 + 自愈統計)、歸因(Analysis,5-WHY,優先看自己可控的原因)、洞察(Insight)——再把可行動的經驗教訓按 KISS 分類(保持 / 改進 / 停止 / 開始)沉澱下來,下次遇到類似情況能直接用上。
- 只在做過多步工作的任務收尾時觸發:單輪問答不會觸發;非同步進行、不阻塞你繼續用。
- 教訓落到記憶宮殿的「待審草稿盒」(
_pending,房間scratch、類型 decision、不衰減),需你人工簽核後才進入正式記憶庫參與檢索(每次最多 8 條,按標題去重)。 - 全程 fail-safe:記憶關閉 / 無 LLM / 解析失敗都會靜默跳過,絕不影響任務本身。
自動反省讀取的「自愈統計」正是 §8.5.1 裡那套自愈成敗歷史,二者共同構成經驗學習閉環:自愈從歷史學着調整嘗試次數,復盤把教訓沉澱供你審閱。
