前言¶
在 DeepSeek Harness(DSH)裏做長會話智能體開發時,上下文窗口遲早會頂到壓力閾值。原生 compaction-basic 會在閾值到達後發起一次摘要模型調用,這段時間裏當前回合處於前臺阻塞——界面轉圈、工具鏈停住。裁剪工具輸出(例如 tool-result-pruner)能減輕載荷,但基準數據顯示阻塞時長几乎不變,因爲主要成本是一次模型往返,而不是發送體積。
下面介紹社區插件 dsh-plugin-background-compaction:它在對話越過水位線後於後臺投機生成摘要並持有,閾值觸發時直接提交已校驗結果,把「壓縮卡頓」從關鍵路徑上挪走。維護者爲 GitHub 用戶 Jisiyong-A,當前版本 v2.0.1,MIT 許可,分類爲模型推理。插件目錄頁託管在 SkillHub(獨立社區站點,與 DeepSeek / 幻方無官方從屬關係)。
這是什麼¶
一句話定位:該插件是 compaction-basic 的替代品(不是旁掛組件)。DSH 在每個上下文中只掛載一個 CompactionEngine 作爲 ctx.compaction,因此要改變壓縮行爲,插件必須接管這一服務。
它解決的核心問題是:原生壓縮在觸發瞬間才調用 summarizer,用戶必須等待整段模型往返。本插件在達到硬閾值之前(默認約爲閾值的 72%)後臺調用 super.summarize(),持有 SummaryResult;閾值到達時 summarize() 直接交出持有摘要,不再發起模型調用。摘要仍由模型生成(與規則型壓縮器 dsh-dcp 不同),失敗路徑一律退化爲一次原生 compaction-basic,不會留下宿主讀不懂的狀態。
核心功能¶
零等待提交(有測量依據)¶
在同一份 16 份文檔、約 49K token 的任務上,作者從會話事件日誌讀取 compaction/end.time − compaction/start.time(基類在構建摘要輸入前寫入 compaction/start),三次運行取中位數:
原生 compaction-basic |
本插件 | |
|---|---|---|
| 壓縮期間回合凍結 | 16,095 ms | 7 ms |
完整對照與復現方式見倉庫 benchmark/ 與 BENCHMARK.md。
與裁剪器、確定性壓縮的分工¶
tool-result-pruner:基準中阻塞從 16.1 s 僅降到 15.3 s(約 5%)。本插件在提交前仍會跑裁剪器,兩層疊加。dsh-dcp:延遲同樣可忽略(12 ms vs 7 ms),但摘要由規則生成,無法壓縮語義;本插件多約 2% 計費輸入(緩存攤薄後),保留模型摘要能力。
相對原生方案,基準中計費輸入約 +2.2%,緩存輸入 +1.5%,輸出 −4.0%——後臺調用與最終提交共用 prompt 前綴,投機調用大多命中已預熱緩存。
釘住 span 與指紋校驗¶
compactRegion(start, end) 從不可變的 surface 序號重新推導摘要輸入,使預計算與提交時 payload 逐字節一致。提交前 fingerprintSummarizationInput()(SHA-256 覆蓋系統頭、被遮蔽消息、工具定義及 { provider, model, maxTokens })與預計算時記錄值比對;漂移則丟棄持有項並走一次原生 super.compactIfNeeded()。
Fail-open¶
未達閾值、TTL 過期、裁剪改寫 surface、compactRegion 拒絕、前臺搶先壓縮、auto: false / enabled: false 等路徑,最壞情況與原生 compaction-basic 一致。
安裝與啓用¶
DSH 要求 Node.js >= 20;插件聲明 dsh 引擎 >=0.2.1-rc.5,並依賴 @deepseek-ai/dsh-compaction 與 @deepseek-ai/dsh-compaction-basic(peerDependencies,版本區間與 package.json 一致)。
安裝命令來自官方 README(需指向已獲取的包目錄,而非憑名稱拼接 GitHub 短路徑):
dsh plugin --profile <profile> add <path-to-this-package>
peerDependencies 聲明與 DSH 啓動期 routeLinked 模塊攔截相關:只有包名出現在插件 peerDependencies 中時,鏈接插件的 @deepseek-ai/* 導入纔會路由到運行中 app.asar 內置副本。
隨包附帶的 cordis.patch.yml 會禁用 compaction-basic 並插入本引擎。典型片段如下:
- id: compaction-basic
disabled: true
- insert:
- id: background-compaction
name: dsh-plugin-background-compaction
config:
enabled: true
precomputeAtRatio: 0.72
經過上面的步驟,壓縮服務由 background-compaction 接管;基類鍵(如 thresholdRatio、headroomTokens)仍透傳給 BasicCompactionEngine。
典型用法與配置¶
日常使用時多數場景只需保持 enabled: true 與默認 precomputeAtRatio: 0.72。需要調參時,在 patch 的 config 中修改;基類鍵與後臺鍵分開,未知鍵會導致基類在校驗時拋錯。
與本插件直接相關的常用項:
| 鍵 | 默認值 | 含義 |
|---|---|---|
enabled |
true |
總開關;false 時行爲等同純 compaction-basic |
precomputeAtRatio |
0.72 |
佔 thresholdTokens 的比例,越過即武裝後臺投機 |
heldTtlMs |
300000 |
持有摘要有效期(毫秒) |
debounceMs |
1500 |
投機開始前的靜默期 |
gateEnabled |
true |
滑窗命中率熔斷,預測失準時暫停投機 |
trace |
false |
輸出 [bgc] 診斷;環境變量 DBG_BGC=1 亦可開啓 |
若要自行驗證構建與單測(在插件源碼目錄內):
pnpm exec tsc --noEmit
node scripts/build.mjs
node scripts/test.mjs
跨策略端到端證據在 BENCHMARK.md;真實 dsh --profile bc-headless 進程記錄見 SANDBOX-REPORT.md。
適用場景與注意¶
更適合:長會話、頻繁觸發壓縮、希望保留 LLM 摘要語義且不能接受十幾秒回合凍結的 DSH 開發者;可與 tool-result-pruner 疊加。
考慮其他方案:
- 嚴格控 token、可接受規則摘要 →
dsh-dcp(後臺零額外模型調用)。 - 保真度爲硬指標 → 任何壓縮策略都可能丟信息;基準 workload 下四組均保留 3/3 事實,不代表無損。
已知限制(README 原文):
- 預計算與提交之間若 surface 被改寫,持有摘要可能作廢,多花一次後臺調用(基準中 3 次裏有 2 次觀測到)。
- 單步直接跨過閾值時跳過準備窗口,退化爲原生行爲。
- headless runner 在 surface 摺疊後重新注入完整提示包,可能抵消部分壓縮收益。
- 無法與
compaction-basic並存,只能替換。
安全與信任:DSH 插件以當前 DSH 進程的權限運行。安裝前應閱讀倉庫源碼與 MIT 許可證,確認 patch 與配置符合你的 profile 策略;SkillHub 目錄頁便於發現插件,但不替代你對源碼的審查。
結尾¶
dsh-plugin-background-compaction 用後臺投機摘要把壓縮從「前臺等模型」改成「閾值處毫秒級提交」,在作者基準裏回合凍結從約 16 s 降到 7 ms,token 開銷約 +2%。它是 DSH「一切皆插件」生態裏針對 CompactionEngine 的一條路徑,與確定性壓縮、工具裁剪解決的是不同層面的問題。
- 目錄頁:https://www.skillhub.cn/plugins/Jisiyong-A/dsh-plugin-background-compaction
- 源碼與文檔:https://github.com/Jisiyong-A/dsh-plugin-background-compaction