前言¶
在 DeepSeek Harness(DSH)里做智能体或长期项目时,上下文窗口和「压缩上下文」只能保证当前对话塞得进窗口;被压掉的内容不会以可读形式留在会话外。若希望几个月前的决定、偏好和实体关系还能被找回,且数据落在自己可控的目录里,而不是依赖向量库或二进制存储,就需要一层与压缩策略并存的长期记忆。dsh-memory-graph(npm 包名 @ilaomianyang/dsh-memory-graph)由社区维护者 ilaomianyang 发布,分类为「记忆」;它不自动注入上下文、不做 embedding、不用二进制库,而是在 Harness 之外维护一份可 grep、可备份、可版本化的纯文本记忆库。
这是什么¶
一句话:给 DeepSeek Harness 的长期联想记忆——原始对话事件、带类型的记忆卡片、实体索引页,都放在你指定的本地 vault 里。
与「压缩上下文」的关系在 README 里写得很清楚:压缩是工作记忆策略,本插件是长期记忆;两者并存,不是替代。原始层只追加不改写;语义层用 markdown 卡片承载检索;冲突通过 superseded 链保留「怎么变成现在这样」,而不是删掉旧结论。
三层结构与卡片形态¶
记忆库默认在 ~/dsh-memory(可在 profile 里改 vaultDir),目录大致如下:
~/dsh-memory/
├── vault.json
├── projects.json
├── README.md
├── graph.html
├── episodes/2026-11-02.jsonl
├── cards/2026-11/
├── entities/
└── audit/
三层分工:
- episodes/:原始层,每轮追加一行 JSON,不蒸馏、不删除,作为对账依据。
- cards/:语义层,从原始层蒸馏出的带类型记忆卡片(markdown),是模型检索的主要对象。
- entities/:索引层,每个实体一页,带提及时间线,用于跨项目联想。
模型检索走 cards + entities;episodes 供蒸馏原料与事后核对。卡片 front matter 含 kind、status(active / superseded / retracted)、supersedes 等字段;被推翻的记忆不会物理删除,而是标记为 superseded 并指向新卡片。
在 Harness 里怎么用¶
装完并重启后,看记忆有三个入口(README 原文):
- 会话页签里的 「记忆」:展示该会话记住了什么。
- 记忆库根目录的 graph.html:整库关系图,可双击在浏览器打开。
- 左侧栏 「记忆图谱」:同一张整库图嵌在应用内。
配置在 设置 → 记忆图谱,一页四组(采集 / 隐私 / 抽取器 / 检索),保存后即时生效,无需重载。总开关 enabled、库路径 vaultDir、默认项目 defaultProject、跨项目连接 crossProject 等键在启动时读取,需改 cordis.patch.yml 并重载插件;YAML 与设置页以 profile 为最终事实。
抽取器默认 extractor.enabled 为 false:只采集原始事件、不调用模型蒸馏;开启后可选 transport: harness(借用设置里选中的模型)或 http(自填 OpenAI 兼容端点)。自动蒸馏由 auto.* 控制,含追平 catchUp 与每日批次数上限 maxBatchesPerDay。
隐私组可对邮箱、路径做替换,并用 denyPatterns 追加正则;拦截记录落在 audit/,只记规则不记内容。
安装与启用¶
从 npm 安装(资料原文命令,勿自行拼接 dsh plugin add):
plugin_manager action=install_bundle target="@ilaomianyang/dsh-memory-graph"
pnpm 会一并安装依赖 @deepseek-ai/schemastery(设置页 schema 投影用;未装时插件仍可运行,但侧栏不会出现「记忆图谱」设置页)。国内 registry 可加:
plugin_manager action=install_bundle target="@ilaomianyang/dsh-memory-graph" registry="https://registry.npmmirror.com/"
装完后必须重启一次 Harness(关窗口重开):Web 侧插件清单在启动时扫描 loader 与 package.json 的 dsh.client,进程内缓存,不重启侧栏可能没有「记忆图谱」且无报错提示。
重启后打开 设置 → 记忆图谱(位于「模型」与「内置插件」之间)。卸载:
plugin_manager action=remove_bundle target="@ilaomianyang/dsh-memory-graph"
记忆库仍在 ~/dsh-memory,独立于插件。从 npm 安装的版本可在设置页「版本与更新」检查/立即更新;link: 本地目录安装会拒绝覆盖式更新。
当前 package.json 标注版本为 0.13.0;星标以目录页为准为 0,不构成功能说明。
典型配置示例¶
下列片段来自 README,展示 profile 中与页面项可并存的写法:
- id: memory-graph
config:
vaultDir: '~/dsh-memory'
capture:
enabled: true
userChars: 1500
assistantChars: 1500
privacy:
redactEmails: true
redactPaths: true
denyPatterns: ['我的内部域名\\.corp']
extractor:
enabled: true
transport: 'harness'
maxEpisodesPerRun: 40
retrieval:
limit: 8
hops: 1
auto:
enabled: true
catchUp: true
maxBatchesPerDay: 6
update:
enabled: true
autoInstall: false
采集侧默认每条用户/助手消息最多保留 1500 字;短于 capture.minChars(默认 12)的轮次不入库。检索默认 limit: 8、hops: 1。不想插件联网查 npm 版本时,将 update.enabled 设为 false。
适用场景与注意¶
适合:需要在 DSH 外持久保存决策、偏好与实体关系,且希望用纯文本 + 图谱浏览、而非 embedding 或自动塞回上下文的开发者。
注意:
- 插件以当前 DSH 进程权限读写
vaultDir;安装前应在 GitHub 阅读源码与 LICENSE,确认隐私规则是否符合你的环境。 - 开启抽取器会产生模型调用;自动蒸馏受
auto.maxBatchesPerDay等约束,但仍需自己评估成本。 - DSH 生态是「一切皆插件」;社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,本文事实以仓库 README 为准。
结尾¶
dsh-memory-graph 把长期记忆做成你拥有的 plain-text vault:事件只追加、卡片可检索、实体可联想,与上下文压缩互补。进一步了解可访问 GitHub 仓库 与 SkillHub 目录页。