前言¶
DeepSeek Harness(DSH)在會話變長時,通常會走「壓縮成一段摘要」:舊消息被壓成扁平文本,模型想覈對某次決定或某條命令時,往往只能依賴摘要是否寫全。對長期調試、多輪改代碼的會話,摘要越疊越厚,細節也越容易丟。
dsh-memory-tree 是社區維護者 bgx666 發佈的 DSH 插件,分類爲「記憶」。它不改 DSH 的觸發時機,而是在需要壓縮時,把待壓區間換成帶結構的樹形節點,並保留逐層下鑽到原文的路徑。插件仍處於開發階段,配置與行爲可能變化;重要會話建議保留原始日誌或先在測試會話試用。
這是什麼¶
一句話:把框架的「壓縮成一段摘要」換成分層記憶樹 compaction provider。
維護者 bgx666,源碼與文檔在 GitHub,社區目錄頁見 SkillHub。簡介爲 Hierarchical memory-tree compaction provider for DeepSeek Harness;npm 包名安裝後爲 @your-scope/dsh-memory-tree 等形式,以 profile 裏實際生成的包名爲準。
壓縮完成後,上下文裏不再是單純的長摘要,而是由節點消息組成;某層活躍節點攢夠 9 個(默認)就把最早 3 個合併成父節點,再往上疊。模型可通過工具 explore_memory_tree(node_id) 逐層下鑽到葉子裏的原始消息。
核心功能¶
與會話綁定的開關¶
安裝並啓用插件後,輸入框下方統計行(輪次/步數、token、緩存命中)最左側有「本會話使用記憶樹」:
- 默認不勾選:新會話、以及裝插件之前就存在的會話,仍用框架普通摘要。
- 勾選:僅對當前會話啓用;上下文超預算時改分層節點壓縮,開關寫入
session_prefs,不影響其他會話。 - 取消勾選:之後不再用記憶樹壓縮;已生成的節點和卡片保留,已壓掉的原文不會自動回到上下文,原文仍在會話日誌與樹節點
details中。
啓用記憶樹的會話,Host 還會在系統提示裏要求模型在回答「之前討論過什麼/決定過什麼」類問題前先調用 explore_memory_tree;關閉的會話不會收到該規則。
壓縮與樹結構¶
框架仍按 thresholdRatio / retainRatio(或插件側的 triggerTokens、retainMessages)決定「壓哪一段」;插件負責把這一段落成樹:
| 環節 | 說明 |
|---|---|
| 分片 | 約 3 萬 token/片、最多 12 片/輪,優先在用戶消息邊界切分 |
| 葉子 | 調用模型輸出 JSON(summary、任務、決策、經驗等),歸一化後 addLeaf |
| 合併 | 某層節點 ≥ mergeThreshold(默認 9)時,取最早 branch(默認 3)個合併爲父節點 |
| checkpoint | 活躍根節點進入 checkpoint;對話區只渲染這些根,整棵樹不會一次性展開成消息 |
節點編號形如 node0_067(第 0 層第 67 個節點);卡片上還有「第 a-b 條」等範圍,便於對齊時間線。
界面與按需加載¶
壓縮完成後對話區會出現記憶卡片:點標題展開字段,點子節點繼續下一層,葉子展示覆蓋的原始消息。卡片按需請求 /memory-tree/api/node 加載子節點;SQLite 與頁面緩存只保留展開過的分支,不等於把整個庫讀進內存。磁盤上的 nodes.details 與數據庫會隨會話增長,長期運行若需控體積,README 提到後續可能做詳情壓縮或老葉子保留期(超出則只能看摘要字段)。
配置入口¶
設置 → 記憶樹 可改分片大小、觸發閾值、保留條數、節點預算、合併閾值、中英文壓縮提示詞與系統提示詞等;壓縮參數下一輪壓縮生效,系統提示詞在之後重新組裝提示詞時生效。也可通過 profile 補丁 $DSH_HOME/profiles/desktop/cordis.patch.yml 的 memory-tree.config 寫默認值,但 README 建議優先在設置頁保存,以免 composition 層舊值要到下次激活才穩定。
常用字段示例(與 README 一致):
chunkTokens: 30000
maxChunks: 12
nodeBudget: 1000
triggerTokens: 500000 # 0 表示按窗口比例
retainMessages: 30
mergeThreshold: 9
branch: 3
maxMerges: 8
language: zh
async: true
輸入框下方的「上下文已用 xx%」是 DSH 的 contextPressure 投影,與記憶樹節點個數不是同一套計量;若壓完仍偏高,可調低 retainMessages 或 triggerTokens(README 舉例:triggerTokens: 100000、retainMessages: 10)。
安裝與啓用¶
要求 DeepSeek Harness 版本:
>=0.2.1-rc.3 <0.3.0
插件管理器從 GitHub 安裝 bundle 時,target 填:
github:bgx666/dsh-memory-tree
安裝後在 profile 中啓用 memory-tree 行並重啓 DSH。插件以當前 DSH 進程權限運行;安裝前請自行查看 源碼倉庫 與 MIT 許可證,確認是否符合你的環境與合規要求。
典型用法¶
- 按上文 target 安裝並重啓,在 profile 裏啓用
memory-tree。 - 打開目標會話,勾選「本會話使用記憶樹」。
- 繼續對話直至觸發壓縮;觀察統計行是否短暫顯示「記憶樹壓縮中 · …」,完成後出現記憶卡片。
- 需要覈對歷史時,在 UI 點卡片下鑽,或讓模型調用
explore_memory_tree(node_id)(根已在 checkpoint 中,無需空參數列根)。 - 調參時打開 設置 → 記憶樹;排查行爲可看
$DSH_HOME/memory-tree/plugin.log,或倉庫內node src/status.js/node src/status.js <session-id>。
本地改源碼開發時,注意 DSH 從 profile 的 node_modules 加載包,與 checkout 是兩套路徑;改完需 npm run sync 與 npm run verify,並以 activate 日誌裏 self= 指向 profile 內 index.js 爲準。
適用場景與注意¶
適合:單會話很長、需要保留「任務 / 決策 / 環境 / 經驗」等結構化字段,且偶爾要下鑽到原文的 DSH 用戶;願意按會話手動打開記憶樹開關,並接受開發中插件可能不穩定。
注意:
- README 標明開發中,配置、壓縮策略和行爲可能繼續變化;重要會話請保留原始會話日誌。
- 關閉記憶樹開關後,已壓內容不會自動還原到上下文;取消勾選僅影響之後的壓縮策略。
- 依賴
@deepseek-ai/dsh-compaction-basic等 peer,觸發仍與基礎 compaction 協同;樹壓縮失敗時會fallback到框架扁平摘要,原因見plugin.log的fallback行。 - 社區目錄 SkillHub 與 DeepSeek / 幻方無官方從屬關係;DSH 生態是「一切皆插件」,本插件爲社區貢獻,非官方內置能力。
結尾¶
dsh-memory-tree 把 DSH 的長上下文壓縮從「一段越壓越長的摘要」改成可合併、可下鑽的分層記憶樹,並在 UI 與 explore_memory_tree 兩側提供同一條查歷史的路徑。若你要在 Harness 裏試分層 compaction,可從目錄頁與倉庫 README 的「快速使用」對照安裝與 per-session 開關。
- 目錄頁:https://www.skillhub.cn/plugins/bgx666/dsh-memory-tree
- GitHub:https://github.com/bgx666/dsh-memory-tree