dsh-context-saver:在提交給模型前裁剪上下文,本地會話仍完整保留

前言

在 DeepSeek Harness(DSH)裏跑長會話智能體時,成本往往不來自「輪數多」,而是每一輪都會把同一段材料再次塞進請求:模型自己的 thinking 會隨輪次單調增長;同一文件或頁面被反覆 read,內容在上下文裏出現多次;終端工具每次回傳完整命令參數,而決策通常只看輸出;更早的輪次仍佔窗口,卻未必影響當前一步。

常見做法是手動刪歷史或換會話,本地 trajectory 與導出會丟信息。下面介紹維護者 DaVinci-2nd 的 dsh-context-saver:只在向模型提交的那一刻裁剪 outbound 副本,本地 session log、聊天記錄與 trajectory 視圖保持完整;插件關閉或所有選項關閉時,請求與未裁剪版本字節一致。

這是什麼

dsh-context-saver 是 DSH 的 send-time 上下文裁剪插件,歸類爲模型推理相關能力。它解決的是長 agent 會話裏 prompt token 膨脹、重複 payload 與 KV cache 前綴穩定性之間的平衡——裁剪僅作用於即將提交的 messages,不寫入 session event,不改動本地深凍結的原始請求。

工作原理

DSH 中每次模型請求會經過 llm/stream waterfall,攜帶即將提交的完整 messages。插件在此攔截,按已啓用規則構造新的 message 數組,再通過 ctx.llm.stream() 重新派發。原始請求不被修改。

因此:

  • 本地 session log、session/event、trajectory 與導出始終是全量歷史;
  • 每一輪裁剪都從完整本地記錄重新計算;
  • 裁剪是確定性的,相同輸入得到相同輸出,連續兩次請求的公共前綴保持字節一致,KV cache 命中率基本不受影響。

Compaction 與 session-title 類請求(帶 purpose)不會被裁剪,避免其輸入在提交時被悄悄改掉。

插件發出的 message 形狀圍繞 DeepSeek Messages 適配器的結構約束設計並做過線上校驗:例如 tool-call 塊不會被移除,僅將 arguments 置爲 {};tool 角色消息不會被移除,僅清空 content;reasoning 塊不會被移除,僅清空 text 並保留 signature。

核心功能與界面

控制入口在 composer 工具欄,與模型、沙箱選擇器同一行。點擊後打開浮動面板(隨 DSH 語言設置顯示中文或英文)。設置保存在本機,對所有 session 生效:

$DSH_HOME/dsh-context-saver/settings.json

面板選項(與 README 默認一致):

選項 默認 作用
總開關 開 關閉後 outbound 與未裁剪一致
Strip thinking content 開 保留 think 塊結構,清空 text,模型仍收到簽名
Strip repeated reads 開 相同文件/頁面 read 只保留第一份完整內容,後續保留標識與空結構
Strip terminal inputs and process 關 終端工具保留輸出,去掉模型傳入的參數
Strip the middle of the context 關 開啓時會警告:可能去掉長對話中間仍重要的內容
Leading turns kept 5 僅在中部裁剪開啓時生效
Trailing turns kept 5 僅在中部裁剪開啓時生效

中部裁剪規則:一輪 = 一條 user 消息及其後的模型輸出,邊界以 user 消息爲準。總輪數 N,保留開頭 H 輪、末尾 T 輪;當 N ≤ H + T 時不裁剪;否則僅落在兩窗口之外的輪次被清空內容但保留結構(tool 配對、reasoning 位置與 signature 等)。配置的 0 會被抬升爲 1,保證首尾至少各保留一輪。

重複 read 的佔位符使用固定序數描述(如第 N 次 tool result),短於 200 字符的 read 不處理,避免標記比原文更貴。

實測效果(README 披露)

README 在真實 deepseek-flash 端點上給出兩組測量,供評估默認配置時使用,非第三方獨立審計。

本機一段 65 輪真實 session(按適配器序列化規則回放,含該 session 的 34 個 tool 聲明):

Prompt tokens 回覆
未裁剪 867,787 accepted
默認裁剪 574,347 accepted

約少 33.8% prompt tokens。

60 輪合成 session(大量重複 read),比較第 N 輪與第 N+1 輪請求的前綴複用:

配置 Prompt tokens Cache hit rate
裁剪關閉 21,102 98.9%
默認(thinking + repeated reads) 3,242 94.8%
默認 + terminal 3,242 94.8%
默認 + terminal + middle 1,847 90.1%

默認配置在該合成場景下 prompt tokens 約爲關閉時的 1/6.5,cache hit rate 94.8%;開啓中部裁剪時命中率會下降,README 將其歸因於任何中部裁剪方案在輪次滑出保留窗口時的固有代價。

安裝與啓用

插件爲純 JavaScript,無構建步驟、無 prepare script,從 GitHub 安裝時 README 說明不需要 allowBuilds 權限。package.json 要求 DSH 版本 >=0.2.0-0 <0.3.0-0,許可證 MIT,當前包版本 0.1.0。

從 GitHub 安裝:

dsh plugin add github:DaVinci-2nd/dsh-context-saver

需要可復現安裝時,可固定 commit:

dsh plugin add github:DaVinci-2nd/dsh-context-saver#<sha>

也可在插件管理器中選擇本地 checkout 目錄,或將 install_bundle 指向該目錄。安裝後 bundle 中典型插入項爲 id: dsh-context-saver。卸載時刪除對應行或在插件管理器中卸載 bundle;settings.json 可手動刪除。

典型用法

1、安裝插件並確認 composer 工具欄出現 context saver 控件。

2、長會話中保持默認(thinking + 重複 read 裁剪)即可在 outbound 側減 token,本地仍可在 trajectory 中查看完整 thinking 與 read 內容。

3、若終端命令參數在上下文中佔比大,可在面板中打開 Strip terminal inputs and process(默認關閉)。

4、僅在明確接受「中間輪次內容不進入模型請求」的風險時,再開啓中部裁剪,並按任務調整 Leading / Trailing turns kept;面板會給出英文警告文案。

5、調試對比時關閉總開關或全部子選項,請求應與未裝插件時字節一致,便於確認問題是否來自裁剪邏輯。

核心裁剪邏輯在 src/trim.js(純函數、單測覆蓋),宿主攔截在 index.js。

適用場景與注意

適合:長時間 DSH agent 會話、頻繁 read 同一文件、thinking 塊隨輪次累積、希望降低 prompt token 又要在本地保留完整審計軌跡的開發者。

注意:

  • 插件以當前 DSH 進程的權限運行;安裝前請自行查看 GitHub 源碼 與 MIT 許可證,確認符合你的安全策略。
  • 中部裁剪會結構性清空部分輪次內容,可能丟失對當前決策仍有用的中間信息;默認關閉是刻意設計。
  • 社區目錄 SkillHub 插件頁 與 GitHub 倉庫由社區維護,與 DeepSeek / 幻方無官方從屬關係;DSH 生態強調「一切皆插件」,目錄站點是獨立索引,不是官方應用商店。

結尾

dsh-context-saver 把裁剪限制在「提交給模型的那一刻」,本地記錄與導出不受影響,並在 README 中給出了 token 與 KV cache 命中率的實測表格。若你在 DSH 裏做長鏈路 agent 開發,可以從默認配置試起,再按需打開終端或中部裁剪。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜