前言¶
在 DSH 裏跑長會話時,上下文窗口遲早會頂滿。常見做法是宿主自帶的 /compact 或自動壓縮:把舊對話拍成一層摘要,細節一旦合併就難再找回。若你更希望「舊內容分辨率逐步變低、但原文仍留在會話日誌裏」,需要一種由模型按需決策、且只寫宿主本來就會記錄的會話事件的壓縮方式。下面介紹社區插件 dsh-ebbing-context(維護者 Light-EI,分類:記憶),它在 DSH 上實現「漸漸消退(ebbing)」式的分層壓縮。
這是什麼¶
dsh-ebbing-context 是模擬記憶衰退的 DSH 分層上下文壓縮插件:模型自己決定壓哪裏、自己寫摘要;插件只寫宿主本來就認識的會話事件,把舊內容一層層降成更粗的表示:
原文(逐字) → L1 塊(一段的結論與數據) → L2 塊 → L3 塊(只剩關鍵詞句)
越舊的越粗,但從來沒有被刪掉——原文仍在會話日誌裏,裝了「會話搜索」插件就能按事件號取回。ebbing 即「漸漸消退」:降不降、降多少,由模型看着上下文壓力自己決定,不是定時任務。
當前 package 版本爲 0.1.19,許可 MIT,要求 Node >= 20。README 標明目標宿主爲 DSH 0.2.1-rc.3 ~ 0.2.2-alpha.2;功能完整、測試全綠,已在真機跑通過壓縮,但作者說明未歸檔可復現的驗證記錄。試用的請先備份 profile、用新會話試。
它怎麼工作¶
工具與命令¶
- 兩個工具 + 一條命令:
context_map(分層結構與佔用)、compress(執行一次壓縮)、/context-status(只讀,同地圖)。
壓縮鍵與級聯¶
- 鍵名 = 要壓的那一層:
l0壓原文 → L1 塊;l1壓 L1 → L2;l2壓 L2 → L3;l3把整個 L3 區壓成一塊(唯一不寫to的鍵)。 to只能從地圖上抄:l0寫輪號(如T19),l1/l2寫該區從 1 起的塊序號。寫錯就被拒,拒絕回執裏帶刷新後的地圖。- 級聯:壓深層時,比它淺且還能壓的層必須同批給完,否則整批拒絕(只斷一次前綴緩存)。
設計要點¶
- 零臺賬:不建庫、不寫狀態文件;層級每輪從會話表層現算,塊的身份寫在正文第一行,形如
〔L1|T16–T19|ev 4121–4390〕標題。 - 提醒但不代勞:佔用到線、又長了、某層超配額時,在本輪收尾把模型叫醒並附一張新地圖。從不自動壓縮,也不催
/compact。
完整設計見倉庫 docs/SPEC.md。
安裝與啓用¶
npm 暫不上架(名字已佔位 dsh-ebbing-context)。README 給出兩種方式,在真機上裝起來過。
方式一:從源碼目錄裝(推薦)
git clone https://github.com/Light-EI/dsh-ebbing-context.git
dsh plugin add ./dsh-ebbing-context
方式二:手動掛到 profile
- 把倉庫內容放進 profile 的
node_modules/dsh-ebbing-context/ - 在 profile 的
cordis.patch.yml里加一行dsh-ebbing-context:(路徑寫法見 SPEC 的「目錄與開發」) - 重啓 DSH
裝完確認三件事:插件卡片顯示運行中、context_map / compress 兩個工具都在、/context-status 能出地圖。
卸載:執行 dsh plugin remove dsh-ebbing-context 之後還要:
- 打開 profile 的
cordis.patch.yml,刪掉dsh-ebbing-context那一節(包括面板裏改過的config),否則下次啓動會在 stderr 刷 patch 指向不存在的警告。 - 日誌在
$DSH_HOME/logs/ebbing-context.log(滾動時還有.1/.2),卸載不會自動刪,不需要排查時手動刪掉即可。
建議關掉宿主自帶的自動壓縮(compaction-basic 的 auto,默認 80% 觸發)。它一旦觸發會把多層摘要重新拍平,細節永久丟失。插件照樣能壓,只是效果打折。關的位置取決於你的安裝方式與預設。
配置¶
共 17 項(triggerPct、keepTurns、pruneFirst、foldCallRecord、requireSessionQuery、reservedTokens、budget.*、segment.*、title.maxTokens、notice.*),在插件面板裏改,改完點「保存」才生效。默認值、含義與拒絕規則見 SPEC 第 6 節。
典型用法¶
- 用
/context-status或工具context_map查看當前分層結構與 token 佔用。 - 當上下文壓力增大、插件在本輪收尾附上地圖後,由模型調用
compress,按地圖填寫l0/l1/l2/l3與對應的to(l3除外)。 - 需要逐字原文時,配合「會話搜索」插件的
session_event_read/session_event_search按事件號取回。
插件默認要求安裝會話搜索;取不回原文就不讓壓。
依賴、限制與適用注意¶
依賴與邊界
- 需要宿主提供
agent/pre-step、agent/turn-stopping、agent/followup與會話表層 API。 - 只做「成對替換」或「只改
tool/result正文」,從不單點刪節點。 - 不聯網、不讀文件、不收集遙測。
已知限制
- 並行調用時不折疊(也不改寫返回),摘要正文會以參數形式留在上下文裏。
- 摺疊只在下一次請求發出之前做;錯過這一步的那條就不再折。
- 圖片無法取回,只按張數記賬。
- 輪次大綱損壞(日誌缺
turn/start或亂序)時,該輪報紅色錯誤並停用。 - 區佔用由插件自估(中文 1 字 ≈ 1 token),與宿主計價器略有差異,會略早提醒。
適用場景與安裝前檢查
適合需要在 DSH 長會話裏保留可追溯原文、又希望模型按壓力主動分層摘要的開發者。插件以當前 dsh 進程權限運行;安裝前請自行查看 GitHub 源碼 與 MIT 許可證,確認與本地 DSH 版本、profile 預設一致。
DSH 生態是「一切皆插件」;社區目錄 skillhub.cn 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-ebbing-context 把長會話上下文收成 L1/L2/L3 多級摘要,同時不刪會話日誌裏的原文;壓縮節奏由模型結合 context_map 與 compress 決定,插件只負責校驗、寫入與提醒。目錄頁與倉庫: