dsh-memory-layers:分层长期记忆,控制注入体量

前言

在 DeepSeek Harness 里做带记忆的智能体,常见做法是把所有笔记堆进一个 Markdown 文件:要么每次会话全量塞进上下文,要么时间一长模型再也想不起细节。上下文窗口有限,「全量注入」和「长期可召回」往往只能二选一。

下面介绍社区插件 dsh-memory-layers(维护者 mllun,分类:记忆)。它把记忆拆成热层、冷层和日/周/月摘要三层:会话开头只读约 600 字的热层,细节按月归档在冷层,需要时用关键词或日期、标签只读查询;摘要由抽取生成,不调用模型,也不新增原文没有的句子。数据落在本机 $DSH_HOME/dsh-memory-layers/ 下的 UTF-8 Markdown,可读、可手改、可备份。

这是什么

dsh-memory-layers 是纯 Host 插件:无前端资源、无网络请求、无第三方运行时依赖。通过 ctx.get('tools') 注册九个工具(如 mem_hot_get、mem_write、mem_recall 等)。

插件不会自动把热层注入系统提示;模型需在会话开始时主动调用 mem_hot_get,或在 agent preset / 指令里约定「每次会话先读热层」。这是为避免与其他记忆插件冲突,并贯彻「由调用方控制体量」的设计。

三层分别做什么

层 体量 何时读 何时写
热层 hot.md 约 600 字(可配置 hotLimit) 每次会话开始 精简后全量覆盖
冷层 cold/YYYY-MM/YYYY-MM-DD.md 不限(单条 ≤ 4000 字) 需要细节时查询 随手追加
摘要 summaries/day\|week\|month/ 日 1500 / 周 1000 / 月 700 字预算 回顾某段时间 按天/周/月生成

热层放身份、长期约定、正在推进的事;细节写冷层;想不起细节时按关键词或索引定位月份再取数;回顾一段时间看摘要。热层不会因为冷层变长而变长。

v1.1 起,冷层支持按最近 N 天、标签、日期区间只读查询;热层增加不占正文字数的主题索引(主题|年月),用于先定位月份再 mem_by_date。

数据布局与条目格式

DSH_HOME 未设置时数据目录为 ~/.dsh。典型结构如下:

$DSH_HOME/dsh-memory-layers/
  hot.md
  cold/2026-10/2026-10-21.md
  summaries/day/2026-10-21.md
  summaries/week/2026-W43.md
  summaries/month/2026-10.md

条目共用行格式(时间为 UTC 的 ISO-8601,文件按本地日期分区):

- [2026-10-21T03:10:00.000Z] [tag] 正文

tag 缺省为 -。热层内另有候选区与主题索引区,用 HTML 注释块包裹,不计入正文的 600 字上限。

核心工具(概览)

九个工具均经 Host 注册。其中 mem_recall、mem_recent、mem_by_tag、mem_by_date 为只读,不修改冷层原文。

  1. mem_hot_get() — 读热层正文、字数上限、是否超限、候选与主题索引。
  2. mem_hot_set(content) — 全量覆盖热层正文(非追加);可自带候选/主题块替换对应区。
  3. mem_write(text, tag?, important?) — 向当天冷层追加一条;important: true 时同时进入热层候选区。
  4. mem_recall(keyword, limit?, mode?) — 跨全部月份子串召回;多词默认 and,可 or。
  5. mem_recent(days?, limit?) — 最近 N 天(含今天)冷层条目,默认 3 天。
  6. mem_by_tag(tag, limit?) — 标签精确匹配(大小写不敏感)。
  7. mem_by_date(from, to, limit?) — 本地日期闭区间 YYYY-MM-DD。
  8. mem_summarize(period?, date?, force?) — 生成或返回日/周/月抽取式摘要。
  9. mem_stats() — 各层体量统计,便于判断是否要精简热层或补摘要。

想不起某件事时,README 建议的检索顺序:mem_recent(3) → 热层主题索引 → mem_by_date → 最后 mem_recall。

安装与启用

环境:Node.js ≥ 20,DSH 0.2.x。

通过插件管理器(推荐)

先把仓库克隆到本地任意目录:

git clone https://github.com/mllun/dsh-memory-layers.git

在 DSH 中让插件管理器安装该包目录(将 <本仓库的绝对路径> 换成实际路径):

plugin_manager({ action: "install_bundle", target: "<本仓库的绝对路径>" })

安装会链接进当前 profile,并尝试激活。看到 application: applied 后,工具列表应出现 mem_hot_get 等九个工具。

手动注册

在 profile 的 cordis.patch.yml 中增加:

- insert:
    - id: dsh-memory-layers
      name: '@local/dsh-memory-layers'
      config:
        hotLimit: 600

前提是该包能被 Node 解析(例如在 profile 的 node_modules 下,或通过 file: / link: 指向仓库路径)。修改后需重启 DSH。

hotLimit 为热层正文字数上限,范围 100–20000,缺省 600;配置非法时回退 600 并打 warn,不会导致插件激活失败。

卸载:在插件管理器移除 bundle,或从 cordis.patch.yml / package.json 的 bundles 列表删除。卸载不会删除 $DSH_HOME/dsh-memory-layers/ 下的记忆数据。

典型用法

按 README 的使用建议,可形成固定节奏:

  1. 会话开始:调用 mem_hot_get();若 overLimit,用 mem_hot_set() 精简正文。
  2. 值得长期记住的细节:mem_write(text, tag);确属重要再 important: true 进入候选区。
  3. 新主题写入冷层后,在热层主题索引中补 主题|YYYY-MM(通过 mem_hot_set 携带 topics 块)。
  4. 回忆细节:mem_recent(3) → 主题索引 → mem_by_date → mem_recall。
  5. 按标签回顾:mem_by_tag("某标签")。
  6. 收尾:mem_summarize("day")、mem_summarize("week");按月 mem_summarize("month")。
  7. 体量不确定:mem_stats()。

摘要由下层条目复制并截断生成,不调用模型;冷层新增后,已有摘要不会自动更新,需 mem_summarize(..., force: true) 重新生成。

适用场景与注意事项

适合谁:需要在 DSH 里长期积累会话外事实、又希望每次注入上下文保持很小的开发者;愿意在 preset 里约定「会话先读热层」;接受数据明文存放在本机。

运行与安全:插件以当前 DSH 进程权限读写 $DSH_HOME;安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。数据不加密;敏感内容需自行权衡是否写入。

其他限制(摘自官方说明):

  • 无删除/归档工具;清理或归档请直接操作文件。
  • 多 DSH 实例同时写同一数据目录无文件锁,可能互相覆盖;建议单实例写入或为实例配置不同 DSH_HOME。
  • 主题索引需人工维护,mem_write 不会自动补索引行。
  • 时间戳为 UTC,日期查询按运行机器的本地日历。

社区插件目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本插件是其中的记忆类 Host 扩展之一。

链接

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

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

小夜