用 billion-context-dsh 把 DeepSeek Harness 的上下文壓縮交給模型自己

前言

長會話裏,模型最先撞上的往往不是任務本身,而是上下文窗口。對話一長,早期的文件路徑、決策和報錯會被硬截斷悄悄丟掉;另一種常見做法是系統到了閾值就自動摘要,摘要寫得好不好,模型自己看不見。DeepSeek Harness(DSH)內置了自動壓縮後端,思路接近後者:用自動生成的摘要替換一段範圍。

billion-context-dsh 走的是另一條路。它把壓縮做成模型可調用的工具:由模型決定何時壓縮、壓縮哪一段,並自己寫出摘要。自動策略只 nudge(提醒),不替模型摘要。社區目錄把它歸在「會話與消息」。需要說明的是,DeepSeek Harness 插件庫是獨立社區站點,和 DeepSeek / 幻方沒有官方從屬關係;DSH 官方倉庫的核心理念是「一切皆插件」,這個插件是社區移植,不是官方應用商店裏的內置件。

本文按社區目錄詳情頁、GitHub 倉庫 README / docs/INSTALL.md / package.json,以及 npm 發佈頁覈對後整理:它是什麼、裝完怎麼掛、模型側有哪些工具。

這是什麼

billion-context-dsh 是 DeepSeek Harness 的 CompactionEngine 後端,實現的是 Active Context Pruning(ACP,主動上下文裁剪):給模型一個 compress 工具,讓它把一段會話範圍寫成高保真摘要,同時把關鍵細節(路徑、決策、錯誤信息)留下來,回收上下文空間。維護者是 Tyan66666,倉庫與 npm 包均使用 MIT 許可證,主要語言是 TypeScript,要求 Node.js ≥ 20。

這裏的 ACP 不要和 DSH 官方包 @deepseek-ai/dsh-acp 搞混。後者是面向編輯器等客戶端的 Agent Client Protocol 橋;本插件的 ACP 來自 opencode-acp 那套「模型決定何時壓縮、壓縮什麼」的設計,壓縮內核原樣複用 acp-kernel,適配層移植自 billion-context-pi(Pi 編碼代理上的同名方案)。倉庫說明:內核與 Pi 側默認行爲保持一致,DSH 適配層(會話事件投影、持久化 surface 事務、模型工具、nudge、配置)是本倉庫的工作。

版本以倉庫和 npm 爲準。2026-08-17 查詢時,GitHub package.jsonnpm 包 均爲 v0.2.2;社區目錄頁仍寫着 v0.1.7,星標也停在 11,而 GitHub 倉庫爲 20 星。目錄頁會滯後,安裝和能力邊界請以倉庫 README 爲準。插件與 DSH 本身都還在公開測試版,README 明確寫了:不要用於工程化 / 生產環境,預期會有破壞性變更。

核心功能

摘要由模型自己寫

DSH 內置的自動壓縮會再跑一次摘要流程,用生成結果替換一段範圍。ACP 不這麼做:模型調用 compress 時就把摘要寫進去,沒有第二次 LLM 摘要調用。倉庫把它寫成成本上的差異——壓縮內容是當前對話模型的產物,而不是另一路靜默摘要器。

只提醒,不替模型按下壓縮

壓力策略在 agent/pre-step 注入 nudge:效率提示、上下文分解、壓縮規則,以及一張可壓縮範圍表(surface seq)。compactIfNeeded 返回 null,也就是自動路徑不會自己摘要。是否調用 compress、壓哪一段,仍由模型決定。引擎默認把過限 nudge 線放在用量約 70%、緊急 nudge 放在約 85%,刻意低於宿主 compaction-basic 常見的 80% 自動壓縮線,讓提醒先出現。增長路徑還可以在中前期觸發:某層 pending ≥ 5 萬 token 且較上次檢測增長 ≥ 2.25 萬 token(這條沒有百分比下限)。這些閾值來自倉庫 README 與 docs/INSTALL.md,不是實測會話數據。

壓縮可恢復,原文還在日誌裏

DSH 的每次模型請求都從 append-only 會話日誌(surface)派生。compress 落地的是持久化 surfaceOp: { op: 'replace' }:模型寫的摘要成爲 checkpoint 節點,原文仍留在日誌中。因此可以:

  • decompress:只讀恢復被遮蔽的原文
  • search_context:在塊摘要和原文裏按關鍵詞查找
  • 重啓後從日誌重建塊賬本,不另寫旁車文件

引用用的是 surface seq,不需要給每條消息打 m00001 這類標籤。範圍邊界會自動平衡到 tool-call / result 配對點,seq 上帶 #callId 片段也可以。

四個模型工具,外加 /acp

默認會在 ctx.tools 註冊四個工具,並在命令欄掛 /acp

名稱 作用
compress 用模型書寫的摘要替換一段 seq 範圍;對某塊的摘要節點再壓一次,就是分層蒸餾(tier 2/3)
decompress 按塊恢復原文
search_context 搜索壓縮塊的摘要與原文
acp_status 看佔用、壓縮塊、可壓縮範圍、窗口來源
/acp 在命令欄做 status / compress / decompress

分層蒸餾會把 tier 和內核塊 id 寫進日誌,重啓後內核狀態可以從日誌再水合,並繼續蒸餾。命令欄的 /acp compress 只做普通 T1 範圍壓縮;碰到已有壓縮塊的摘要節點時,源碼會拒絕,要求改用 compress 工具做蒸餾。

上下文窗口可以自動探測

modelContextLimit 省略時,會走 agent.ctx.llm.resolveModelInfo 探測模型真實窗口,失敗則回退 128000。顯式寫了這個值就會跳過探測。INSTALL 提醒:分母配小(例如百萬窗口模型寫成 128K)會讓使用率虛高,nudge 過頻。

安裝與啓用

社區目錄頁給出的安裝命令是:

dsh plugin add github:Tyan66666/billion-context-dsh

需要可復現安裝時,目錄頁建議固定 commit:

dsh plugin add github:Tyan66666/billion-context-dsh#<commit>

DSH 官方 CLI 的完整形態是 dsh plugin --profile <profile> add <source>。倉庫從 v0.2.0 起聲明瞭 dsh.bundle manifest,README 推薦的一鍵安裝是從 npm 裝進 web profile(發佈物帶預構建的 dist):

dsh plugin --profile web add billion-context-dsh

裝完需要重啓 dsh,bundle 層在啓動時纔會組合進去。這一點值得單獨說:GitHub 倉庫的 .gitignore 忽略了 dist/package.json 也沒有 prepare 構建腳本;官方文檔也寫過,從 git 安裝拿到的是源碼而不是構建產物。目錄頁的 github: 命令仍可按原文使用,但若加載失敗,優先改用上面的 npm 包名,或先在本地 npm run build 再按 docs/INSTALL.md 的 tarball / symlink 方式掛。

插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前請自己看源碼和許可證。

掛上壓縮後端

每個 agent 只能有一個上下文管理器。同一 realm 裏兩個後端同時 provide ctx.compaction 會衝突,所以要先禁用宿主的 compaction-basic,再插入本引擎。倉庫推薦全局掛到 host 平面,對 standard / code / minimal / cordis / 自定義預設都生效。編輯 profile 補丁,例如 ~/.dsh/profiles/web/cordis.patch.yml

- id: compaction-basic
  disabled: true

- insert:
    - id: compaction-acp
      name: 'billion-context-dsh'
      config:
        modelContextLimit: 128000   # 可選;省略則自動探測,失敗回退 128000

bundle 自帶的 cordis.patch.yml 只插入無 config 的默認行。需要改窗口或提示詞時,按上面手寫組合行。只想在某一個 agent preset 的 compaction realm 裏替換默認後端,同樣是先 disabled: true,再插入 compaction-acp

INSTALL 還寫了一層細節:shipped 預設(standard / code / cordis)內部仍可能帶着 realm 級 dsh-compaction-basic 兜底,ACP 的工具和 nudge 可用,但系統自動摘要仍可能在壓力過高時觸發。若某個模式要完全由模型決定壓縮時機,文檔的做法是複製該預設,並把副本里 compaction-basicauto 設爲 false。shipped 安裝本身不可直接改。

可選的 config.prompts 能覆蓋 nudge 首句、範圍表、系統提示段和四個工具描述。模板用命名佔位符(如 {pct}),拼寫錯誤會在引擎啓動時拋錯,而不是把字面 {pct} 漏進模型上下文。未配置時直接用 acp-kernel 的渲染。

典型用法

下面步驟來自倉庫 docs/INSTALL.md 的驗證清單和工具約定,可以按原文復現。

1. 確認工具掛上了

新開一個會話,讓模型列出可用工具,或看工具目錄。應出現 compressdecompresssearch_contextacp_status。也可以直接讓模型調用 acp_status,返回塊數、已壓縮 token、估計佔用和窗口來源。

命令欄等價寫法:

/acp status

2. 在長會話裏壓縮一段範圍

上下文漲起來之後,模型會按 nudge 裏的範圍表調用 compress。參數形狀是一段或多段 surface seq,外加模型自己寫的摘要(源碼要求摘要至少 50 個字符):

compress({ content: [{ startSeq, endSeq, summary }] })

成功時文檔預期返回類似 Compressed N block(s),會話可見上下文變短,acp_status 的 blocks 增加。命令欄也可以壓一段 T1 範圍(摘要不要碰到已有壓縮塊的 checkpoint 節點):

/acp compress <startSeq> <endSeq> <summary...>

3. 恢復和檢索

壓縮不是刪除。需要原文時:

decompress({ blockId })
/acp decompress <blockId>

在塊內查找:

search_context({ query })

重啓同一會話後,再跑一次 acp_status,塊賬本應從日誌裏的 compaction/summary 事件重建出來。

4. 把安裝指南交給當前會話

README 還寫了一種用法:本倉庫本身就跑在 DSH 上,把 docs/INSTALL.md 交給會話裏的 agent,讓它讀指南、看 profile、改組合配置並驗證掛載。前提是配置在 ~/.dsh 下,需要批准一次文件權限;裝完再讓它調用 acp_status 自證。

適用場景與注意事項

適合已經在用 DSH、會話經常跨很多輪工具調用的人:編碼智能體、需要反覆對照早期報錯和文件路徑的長任務。它解決的是「窗口滿了之後,早期細節被靜默丟掉或被另一路摘要器改寫」這一類問題,不是把上下文窗口真的擴到無限大。插件名裏的 billion 來自上游 ACP 方案的命名,本倉庫沒有給出 DSH 側自己的壓測數字。

使用前注意這幾條:

  1. 測試版。README 要求不要把本插件和 DSH 用於生產;破壞性變更是預期行爲。
  2. 同一 realm 不要掛兩個壓縮後端。衝突對象是 ctx.compaction。全局方案要禁用 host 的 compaction-basic;單模式方案要先處理該 realm 裏的 dsh-compaction-basic
  3. shipped 預設可能仍有自動摘要兜底。只插 host 平面時,standard / code / cordis 的 realm 級 basic 仍可能在高壓時自動摘要,和「純模型驅動」不完全一致。
  4. 窗口分母不要配錯modelContextLimit 寫小了,nudge 會過頻。
  5. 權限與來源。插件以當前 dsh 進程權限運行。安裝前檢查 GitHub 源碼和 MIT 許可證;需要可復現環境時固定 commit 或使用已發佈的 npm 版本。
  6. 縮寫衝突。本文的 ACP 是 Active Context Pruning。DSH 另有 Agent Client Protocol 相關插件,不是同一件事。
  7. 和 Pi 版能力不完全相同。上游 billion-context-pi 還帶 acp_delegate 一類委派工具;DSH 這個移植暴露的是壓縮四件套和 /acp,不要按 Pi 文檔去找委派接口。

小結

billion-context-dsh 把 DSH 的上下文壓縮從「系統到點就自動摘要」換成「模型自己決定壓什麼」。壓縮結果是 checkpoint,原文留在 append-only 日誌裏,可以恢復、可以搜索,重啓後賬本還能從日誌重建。它是社區維護的 MIT 插件,不是 DeepSeek 官方商店應用;和宿主一樣仍在測試期,適合先在自己的 profile 裏驗證,而不是直接鋪到生產會話。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/billion-context-dsh/

GitHub:https://github.com/Tyan66666/billion-context-dsh

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

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

小夜