前言¶
在 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 等)。
- 目录页:skillhub.cn/plugins/mllun/dsh-memory-layers
- 源码与文档:github.com/mllun/dsh-memory-layers
- 当前包版本(package.json):1.1.0,许可证 MIT
- 要求:Node.js ≥ 20,DeepSeek Harness 0.2.x
插件不会自动把热层注入系统提示;模型需在会话开始时主动调用 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 为只读,不修改冷层原文。
mem_hot_get()— 读热层正文、字数上限、是否超限、候选与主题索引。mem_hot_set(content)— 全量覆盖热层正文(非追加);可自带候选/主题块替换对应区。mem_write(text, tag?, important?)— 向当天冷层追加一条;important: true时同时进入热层候选区。mem_recall(keyword, limit?, mode?)— 跨全部月份子串召回;多词默认and,可or。mem_recent(days?, limit?)— 最近 N 天(含今天)冷层条目,默认 3 天。mem_by_tag(tag, limit?)— 标签精确匹配(大小写不敏感)。mem_by_date(from, to, limit?)— 本地日期闭区间YYYY-MM-DD。mem_summarize(period?, date?, force?)— 生成或返回日/周/月抽取式摘要。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 的使用建议,可形成固定节奏:
- 会话开始:调用
mem_hot_get();若overLimit,用mem_hot_set()精简正文。 - 值得长期记住的细节:
mem_write(text, tag);确属重要再important: true进入候选区。 - 新主题写入冷层后,在热层主题索引中补
主题|YYYY-MM(通过mem_hot_set携带topics块)。 - 回忆细节:
mem_recent(3)→ 主题索引 →mem_by_date→mem_recall。 - 按标签回顾:
mem_by_tag("某标签")。 - 收尾:
mem_summarize("day")、mem_summarize("week");按月mem_summarize("month")。 - 体量不确定:
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