dsh-memory-tree: Hierarchical SQLite Long-Term Memory with AST Indexing

前言

在 DeepSeek Harness(DSH)里跑智能体,常见情况是:一轮任务结束,上下文被压缩或清空;换一个新 session 做同一项目,上次聊过的细节、你自己记下的要点,往往不会再出现在模型眼前。把笔记塞进 system prompt 或单独做向量检索,可以部分缓解,但 chunk 往往是匿名的,很难按「某条思路、某段结构」寻址,也缺少可审计的召回理由。

下面介绍社区插件 dsh-memory-tree(维护者 qinghuaju),它把对话与可结构化内容落成磁盘上的资产:SQLite 分层存储、AST 节点路径、embedding 与软相似边,并在每轮前注入有上限的 <memory-recall> 块。无需外部托管服务,目录可复制、备份或删除。

这是什么

dsh-memory-tree 是 DSH 的「记忆」类插件,一句话定位来自项目描述:AST soft-decision-tree long-term memory for DeepSeek Harness (DSH): SQLite + embeddings, project-scoped, cross-session recall.

与「只堆向量 chunk」的做法相比,项目 README 强调:节点有唯一 AST 路径、树上一跳激活、六项命名打分项与审计行、hot/warm/cold 轮转以限制活跃库体积,并在 SQLite 旁提供可人工查看的 Markdown 镜像。许可证 MIT,npm 包版本 0.4.2(以 package.json 为准);GitHub 仓库当前约 2 stars。目录页:skillhub.cn/plugins/qinghuaju/dsh-memory-tree;源码:github.com/qinghuaju/dsh-memory-tree。

核心功能

经 README 与配置说明,可核实的能力如下。

  1. 后台捕获:监听 session/event,在后台记录 user/assistant 交换(可配置 capture.enabled)。
  2. AST 索引:解析为可寻址节点(path、kind、title、content),写入 embedding(默认 1024 维)及相似度边(cos ≥ 0.72)。
  3. 自动召回:在 agent/pre-step 查询,向量与 FTS 候选混合打分后,注入 bounded 的 <memory-recall>(recall.autoInject、recall.maxNodes 默认 6,recall.timeoutMs 默认 1500 ms)。
  4. 分层存储:hot(memory.db,默认 <30 天)、warm(30–180 天)、cold(>180 天)轮转;定时 6 h、启动后及 mem_rotate 可触发。
  5. 工具面:暴露 mem_recall、mem_store、mem_stats、mem_dream、mem_rotate;mem_stats 含 compat: 行,反映 normal / degraded / off。

兼容方面:README 写明在 DSH 0.2.1-rc.3( bundled Node 24)及 Node 22/24 上测试;CLI 需 Node ≥22.5;engines.dsh 为 ^0.2.1-alpha.2。无 native 构建,embedding 可选用 pollinations、dashscope、openai、ollama、custom,或离线 deterministic fake embedder / Ollama。

安装与启用

插件以当前 DSH 进程权限读写 $DSH_HOME 下配置与数据库;安装前请自行审阅源码与 MIT 许可证。官方 Quick start 不依赖 git clone,步骤如下。

  1. 准备 embedding 凭据(不要放进仓库):
echo '{"apiKey":"sk-..."}' > "$DSH_HOME/memory-tree/credentials.json"
  1. 安装到 DSH 实际加载的 profile(桌面端多为 ~/.dsh/profiles/desktop,dsh web 多为 ~/.dsh/profiles/web),然后重启 DSH:
node scripts/install.mjs --profile "$DSH_HOME/profiles/desktop" --copy-to

说明:需在已取得插件源码或发布包的环境中执行 scripts/install.mjs;安装器幂等,会备份 cordis.patch.yml,且不修改你的 key。无 --profile 时会自动探测并在 desktop/web 并存时警告。多机、npm/tarball、离线模式见仓库 docs/DEPLOY.md。

  1. 在 DSH 内验证:让智能体调用 mem_stats。

DSH 0.2.1-rc.3 默认关闭插件市场且无 index URL;若走市场发现流程,需自行生成 market/index.json 并在 Settings → Plugins → Discover 配置 URL,详见 docs/MARKET.md(README 中的 market-index.mjs / check-market.mjs 为发布与校验用,非普通用户一键安装命令)。

可选配置片段(插入 profile 的 cordis patch,键名以文档为准):

- insert:
    - id: dsh-memory-tree
      name: 'dsh-memory-tree'
      config:
        embedding:
          preset: pollinations     # pollinations | dashscope | openai | ollama | custom
          dimensions: 1024
        capture:
          enabled: true
        recall:
          autoInject: true
          maxNodes: 6
          timeoutMs: 1500
        storage:
          tiered: true
          hotDays: 30
          warmDays: 180

完整默认值见 docs/PHASE1.md。设 storage.tiered: false 可退回单文件行为。

典型用法

经过上面的安装与重启,可按 README 建议做最小验证:

  1. 在同一项目里对话至少两轮。
  2. 开 新 session,再问第一轮里说过的事;若召回正常,应看到 <memory-recall> 相关内容。
  3. 需要手动查库或运维时,调用 mem_stats 看节点与兼容状态;需要整理分层库时调用 mem_rotate。

打分与管线细节(捕获 → AST → embedding → 查询 → 注入)见 README 流程图与 docs/PRINCIPLES.md;仓库提供 node scripts/bench.mjs 等离线基准脚本,数值随机器与 embedder 变化,此处不重复罗列。

适用场景与注意

适合谁:在同一 DSH 项目里长期迭代、希望跨 session 找回结构化对话与笔记、且愿意本地持有一份 SQLite + 可选 embedding 调用的开发者。

注意:

  • 插件与 DSH 同源插件生态一致:社区目录(如 SkillHub)独立于 DeepSeek / 幻方,并非官方应用商店。
  • Embedding 预设除离线方案外通常需要 API key;凭据仅应放在 $DSH_HOME/memory-tree/credentials.json。
  • DSH 侧 hook 变更会导致能力分级降级(例如 auto-recall 关闭而 capture / 工具仍可用),以 mem_stats 的 compat: 为准。
  • README 自述在 host 拒绝注入消息等情况下会关闭当轮 auto-recall 并写日志,行为以当前版本源码为准。

结尾

dsh-memory-tree 把长期记忆做成可检查、可轮转、可跨 session 召回的 AST + SQLite 方案,并绑定 DSH 生命周期钩子与一组 mem_* 工具。若要进一步了解设计取舍与部署变体,请读仓库 README(含 中文 README.zh.md)与 docs/。

  • 目录页:https://www.skillhub.cn/plugins/qinghuaju/dsh-memory-tree
  • GitHub:https://github.com/qinghuaju/dsh-memory-tree
羽毛球分组比赛记分
小程序二维码

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

Xiaoye