上下文壓縮與 MoA
源码版本v2026.7.20
職責
兩件事:① 當歷史訊息逼近 provider 上下文上限時,把舊訊息摘要/裁剪掉騰出預算(context_compressor);② 可選地用 Mixture-of-Agents 路徑聚合多個模型的輸出(moa_loop)。兩者都在主迴圈內被呼叫,是「讓長對話跑得下去」和「讓回答更穩」的支撐件。
關鍵檔案
context_compressor 模組— 壓縮總入口(約 3700 行)預算估算:190-242—_estimate_msg_budget_tokens/_serialized_length_for_budget訊息清洗:136-155—_fresh_compaction_message_copy/_strip_persistence_markers工具呼叫與路徑提及提取:337-360—_extract_tool_call_name_and_args/_collect_path_mentions內容裁剪:472-515—_append_text_to_content/_strip_image_parts_from_partsmoa_loop— Mixture-of-Agents 聚合IterationBudget— 壓縮 refund 與預算聯動
資料流
- 主迴圈每輪評估是否需要壓縮(見
_should_run_preflight_estimate:213)。 - 命中閾值後呼叫 context_compressor:
- 估算每條訊息占用預算(
agent/context_compressor.py:419) - 對舊訊息做清洗拷貝(
agent/context_compressor.py:136)、剝除持久化標記(agent/context_compressor.py:155) - 保留工具呼叫名/參數與路徑提及,避免摘要丟失關鍵操作(
agent/context_compressor.py:337) - 裁剪圖片段與超長內容(
agent/context_compressor.py:472)
- 估算每條訊息占用預算(
- 壓縮產生的「新空間」透過
iteration_budget.refund()(agent/iteration_budget.py)部分退還,允許主迴圈多跑幾輪。 - 若啟用 MoA,
moa_loop在本輪並行呼叫多個 provider 並聚合,作為對主回答的增強或仲裁。
小結
壓縮器是長對話的生命線,核心權衡是「丟什麼、留什麼」——它優先保留工具呼叫與路徑提及,因為丟了這些會讓後續輪次「失憶」。MoA 是正交增強,可開關。兩者都不改變主迴圈結構,只在合適時機切入。