dsh-memory-tree:把 DSH 上下文压缩改成分层记忆树

前言

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 许可证,确认是否符合你的环境与合规要求。

典型用法

  1. 按上文 target 安装并重启,在 profile 里启用 memory-tree。
  2. 打开目标会话,勾选「本会话使用记忆树」。
  3. 继续对话直至触发压缩;观察统计行是否短暂显示「记忆树压缩中 · …」,完成后出现记忆卡片。
  4. 需要核对历史时,在 UI 点卡片下钻,或让模型调用 explore_memory_tree(node_id)(根已在 checkpoint 中,无需空参数列根)。
  5. 调参时打开 设置 → 记忆树;排查行为可看 $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
羽毛球分组比赛记分
小程序二维码

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

小夜