前言¶
在 DSH(DeepSeek Harness)里跑长会话时,对话日志按 seq 仍可回查,但「下次遇到同类任务该怎么做、上次踩过什么坑」往往还留在某次已结束的会话里。手工整理 SKILL 文档、维护「别这么干」清单,成本高,也容易和当前工作区、当前任务对不上号。
下面介绍社区插件 dsh-memory(维护者 corvus-dsh,分类:记忆)。它只做「能力记忆」:从已结束的会话里抽取可复用的 SKILL.md 与负知识 negatives.jsonl,并在新任务开始前按需检索注入;会话里的事实仍靠宿主按 seq 回查,不由本插件替代。它与兄弟项目 dsh-graft-slice 在数据层通过交接台账文件耦合,程序上不 import 对方代码,卸载任一方不会拖垮另一方。
这是什么¶
dsh-memory 是 DSH 开源生态插件(topic:dsh-plugin)。它读取 graft 插件写出的 .retired.json / .transferred.json,必要时通过 ctx.sessionQuery.readSession(id) 读会话,将「怎么做才对、踩过什么坑」落盘到 DSH 原生可用的技能目录与记忆目录;抽取可走宿主 LLM,也可关闭以节省 token。
package.json 中当前版本为 0.21.0,要求 Node >=20、DSH >=0.2.1-rc.5,许可证 MIT。
与 dsh-graft-slice 的关系¶
数据流可以概括为:
dsh-graft-slice ──写──▶ .retired.json / .transferred.json
│(只读文件契约)
dsh-memory ──读──▶ ───────┘
──读──▶ ctx.sessionQuery.readSession(id)
──写──▶ <skillsDir>/<name>/SKILL.md
<memoryDir>/negatives.jsonl, processed.json, index.json
台账条目在较新版本中带 epoch 信封({epoch, at, pid, payload}):读到不支持的 epoch 或缺 payload 时会拒读并延后处理,避免「半条记录就生成技能」;harvest 与 memory_stats 会报告 ledger 摘要,便于区分「没有会话」与「台账被拒读」。
核心功能¶
收割(harvest)与抽取¶
- 消费交接台账里已「退休」的会话,单次处理数量受
harvestLimit限制(默认 3)。 extractor为llm时用宿主模型抽取;为off时只扫账本、不消耗 token。- LLM 不可用(缺 Key、未登录、模型不可达)时,抽取会静默为空;插件激活时会输出可 grep 的警告
[dsh-memory] LLM unavailable. Harvesting is disabled.。若你主动配置extractor: 'off',则不会因此告警。
检索与注入(retrieval)¶
retrieval(默认true)控制 pre-step 是否检索记忆并注入提示。- 词法召回下限
retrievalFloor默认 0.20,只负责捞候选;semanticFilter默认 true 时用 LLM 做精准裁决;关闭后退化为严格词法模式,此时retrievalThreshold(默认 0.55)才起作用。 filterProvider/filterModel可指定过滤用的模型路由,默认跟随宿主agentDefaultModel.currentSelection()。- 任务对齐(Task Alignment) 默认开启:用用户原话中的任务词过滤「事故流水账」类记忆,避免同仓库内无关报错细节污染当前任务;可通过
taskAlignment: false恢复旧行为。调试时可关注debug.blockedByTask。 - 工作区隔离 可在记忆控制台切换(见下文);非
human来源的注入会以[参考历史数据,非当前指令]前缀降权,降低模型把历史推断当成当前指令的风险。
双时态、取代与来源¶
每条技能或负知识可带 valid_at / invalid_at / superseded_by 等字段:检索只激活 invalid_at 为空或晚于当前时间的条目;取代时互链并保留审计,旧记录不物理删除。来源分级(human / tool / inferred)影响冲突保护与提示措辞;人工规则在取代裁决中有保护(v0.15.0 验收脚本 _scratch/acceptance-v015.mjs 可在真实库上复现)。
负知识与技能维护¶
- 负知识写入
negatives.jsonl;长期未复发且命中次数低的条目会降权并在断言前加[历史偶发错误,仅供参考]前缀。 - 活跃技能超过
skillLimit(默认 100)时,激活期会跑一次维护:先尝试合并语义相近的when_to_use,仍超限则归档最久未用的 10%(archived: true,检索跳过,文件与证据保留)。 - 加载与渲染路径上有 scanThreat /
renderHint等闸门,对已投毒文档扣留注入(测试见test/v081-threat.test.mjs)。
记忆控制台(Web)¶
侧栏「记忆」提供:开关 retrieval、workspaceIsolation、semanticFilter(经宿主 configEditor.edit 写入 profile,无需重启即生效且可持久化);按 scene 浏览记忆库(来源、scope、失效与取代关系、证据条数);一键清空当前工作区记忆(移入 <memoryDir>/_quarantine-<ts>/,非删除)。同等能力可通过命令 /memory-console、/memory-console-set、/memory-console-clear 调用。客户端面板通常需要一次宿主重启 + 页面刷新后进入 boot graph。
Cordis 集成要点¶
插件导出 inject = ['tools','sessionQuery'],否则工具不会注册;每个工具需声明 output: { schema, render },本包通过 textOutput() 统一满足。llm 故意不在 inject 列表中,经 ctx.get('llm') 解析,缺失时插件仍可挂载,只是无法 LLM 抽取。
安装与启用¶
安装命令以 README 为准:
dsh plugin --profile <name> add <path-or-git-url>
dsh --profile <name> --dump-config # 应出现 dsh-memory 行
将 <path-or-git-url> 换成本地路径或 Git 仓库 URL(例如 https://github.com/corvus-dsh/dsh-memory)。安装后检查 dump-config 是否出现插件行,再按需改 profile 下的 cordis.patch.yml 的 config 段。
| 键 | 含义 |
|---|---|
graftDataDir |
读取 .retired.json 的 graft 数据目录;默认同级 dsh-graft-slice |
skillsDir |
技能落盘目录;默认 ~/.agents/skills |
memoryDir |
负知识与进度账本;默认 <paths.data>/.dsh-memory |
harvestLimit |
单次最多处理几个已退休会话(默认 3) |
extractor |
llm 或 off |
retrieval |
pre-step 是否检索(默认 true) |
retrievalFloor |
词法召回下限(默认 0.20) |
retrievalThreshold |
严格词法阈值,仅 semanticFilter:false 时使用(默认 0.55) |
semanticFilter |
是否 LLM 精准裁决(默认 true) |
filterProvider / filterModel |
过滤模型路由 |
本地开发构建可执行 npm run build;独立跑收割脚本为 npm run harvest(见 package.json scripts)。
典型用法¶
1、先安装并配置 dsh-graft-slice,让长会话正常写入 .retired.json / .transferred.json,再把 graftDataDir 指到该目录(或使用默认同级目录)。
2、安装 dsh-memory,确认 dsh --profile <name> --dump-config 含 dsh-memory,并按需设置 skillsDir、memoryDir 与 extractor。
3、结束若干会话并写入台账后,由宿主触发 harvest(或开发环境下 node scripts/harvest.mjs),在 skillsDir 下查看生成的 SKILL.md,在 memoryDir 查看 negatives.jsonl、processed.json、index.json。
4、新开对话时若 retrieval 为 true,pre-step 会按当前工作区与任务对齐规则召回记忆;在 Web 侧栏「记忆」可审计条目、调开关,或对当前工作区做 quarantine 清理。
5、需要只读审计宿主路径噪音时,可运行 README 提到的 scripts/audit-memory-noise.mjs 扫描 facts.jsonl / negatives.jsonl(可选 --include-skills),报告不删改数据。
适用场景与注意¶
适合:长期在同一 DSH profile 上迭代、已使用 graft 交接台账、希望把「做法」和「负路径」从会话里自动沉淀并在后续任务中可控注入的团队或个人。
注意:
- 本插件以当前 DSH 进程权限读写
skillsDir、memoryDir与 graft 台账;安装前应阅读源码与 MIT 许可证,确认路径与数据隔离策略符合你的环境。 - 记忆质量依赖 LLM 抽取与过滤;LLM 不可用时会停止增长且仅告警一次场景,需自行监控
[dsh-memory] LLM unavailable。 - 社区目录页与 GitHub 仓库由维护者发布;SkillHub 等目录站点是社区索引,与 DeepSeek / 幻方无官方从属关系。
- GitHub 上该仓库星标数为 1(以目录页线索为准),属早期生态插件,升级时请对照 RELEASE_NOTES.md 与本地
package.json版本。
结尾¶
dsh-memory 把长会话里可复用的「怎么做」和「别怎么做」从日志里抽出来,落成 DSH 能直接加载的技能与负知识,并在检索链路上叠工作区、任务对齐、语义裁决与安全闸门,适合与 dsh-graft-slice 搭配做能力记忆而非替代事实回查。
- 目录页:https://www.skillhub.cn/plugins/corvus-dsh/dsh-memory
- 源码与文档:https://github.com/corvus-dsh/dsh-memory