dsh-memory:给所有 DSH 会话共用的本地记忆池

前言

DSH 的理念是「一切皆插件」,但多轮对话之间默认没有共享记忆:换一个会话、换一个工作区,模型就忘了上一轮记下的偏好、项目约定和环境事实。于是常见做法是把重要信息反复粘贴回 prompt,既耗 token,也容易抄错或漏抄。octidote/dsh-memory 就是解决这件事的:一个放在本机、所有 DSH 对话共用的持久记忆池,相关话题被提及时自动召回。它不联网、不调用嵌入模型,记忆的存储与召回都在本地完成。

这是什么

  • 插件名:dsh-memory
  • 维护者:Octidote
  • 目录页分类:记忆
  • 版本:0.17.0
  • 许可证:MIT
  • 运行环境:Node >= 20

一句话定位:一个本地优先的共享记忆池,代替每次手动把背景塞回 prompt。区别在于它只保存结构化压缩后的摘要,命中时才注入少量相关内容,而不是把对话原文整段塞进上下文。README 的简介是「Shared local memory pool for DeepSeek Harness conversations」。

核心能力

本机共享池与零 token 压缩

所有会话、所有工作区共用 $DSH_HOME/storages/dsh-memory/memories.json。用户真正输入的 prompt 和助手最终回复只在本地做结构化抽取式压缩后入库:单条 ≤420 字,回合合并后 ≤760 字,保留开头结论、要点列表和结尾结论,不保存完整对话,也不调用模型。插件注入的 runtime context、技能目录、时间快照、工具调用中间步骤不会被误存。入库前会自动遮蔽私钥、API key、GitHub token、JWT、Bearer、密码等敏感片段,并把代码块、长链接替换为占位符。

加密落盘与单写者保护

记忆池用 AES-256-GCM 加密后写入 memories.json 快照,日常新增/删除/召回事件追加到 memories.json.journal.jsonl(每行一个独立加密事件),每 200 条或 512 KB 自动压实成新快照。密钥保存在同目录 key.bin(32 字节,仅当前用户可读),旧版明文数据在首次加载时自动迁移为密文。同一数据目录只允许一个写入者:锁文件记录写入者 PID 与实例标识,第二个进程自动进入只读模式,仍可查看和召回,但不会覆盖数据。模型调用 memory save/forget、面板反馈/分类/删除/清空等显式写操作会等待落盘确认;写入失败时不返回成功,事件留在队列按 5 秒起、最长 60 秒退避重试。启动时每 6 小时保留一份加密快照,迁移、清空、恢复前强制备份,保留最近 16 份。

需要手动备份或迁移时,必须同时保留 memories.json、memories.json.journal.jsonl 和 key.bin;丢失密钥后旧记忆无法恢复。

克制的自动召回

默认「经典模式」:本地 BM25 风格关键词匹配 + 同义词概念扩展 + 本地特征哈希向量余弦 + 分类上下文加权。同义改写(「暗色/深色」「会议/开会」)和轻微拼写差异(kubernetis / kubernetes)也能命中。只有相关度足够高才注入:最多 2 条、总长不超过 760 字符,只在该轮第一步出现一次,同一会话不会重复注入同一条记忆。

在面板「设置」→「召回」可切换到混合模式:用 RRF 融合 BM25、向量、标签/分类三路排序,并加入置信度间隔、MMR 多样性和意图偏置。默认仍是经典模式,切换结果写入 config.json,可随时切回。README 给出的 70 条标注查询结果:混合模式 Hit@1 91.7%、Hit@2 100%、MRR 0.958、误召回率 10%;经典模式为 86.7% / 98.3% / 0.929 / 10%。这些数字由 tools/eval-recall.mjs 复现。

回合记忆与可解释召回

助手回复在 15 分钟内会与同一会话的上一条用户消息合并成一条 episode,避免用户和助手各存一条;摘要保留「要点」列表与「结论」结构。在「设置」→「召回」输入查询即可看到每条候选的 score / bm25 / vector / coverage / reasons,不调用模型、不注入对话。展开列表行可置顶 ★、屏蔽 ⊘ 或反馈,被屏蔽的记忆不再自动召回。

核心记忆、项目上下文与注入防护

被 ★ 标为核心记忆的条目会在每个新会话的第一步自动带入(最多 2 条),即使当前问题没有关键词命中。自动记录的记忆会从会话工作目录提取 project,召回时同一项目的记忆获得轻微加权。拼接进模型提示的记忆文本会先移除伪系统标签、{{变量}} 和「忽略之前指令/进入开发者模式」等注入模式,数据库里保存的原文不变,只净化模型实际看到的那一份。

质量反馈与自动整理

列表里每条记忆都可以点 👍 / 👎,反馈会调整重要度和召回排序;连续 3 次「没用」且没有「有用」反馈的记忆停止自动召回,再点一次 👍 即可恢复。新记忆入库时会自动合并高度相似的近重复项(同类型、同分类、Jaccard ≥ 0.78)。每条记忆按标签和本地关键词给所有分类打分,保留主分类、置信度、候选次分类和打分明细,低置信度进入「未分类」,不强行分桶;展开列表行后分类胶囊变成下拉框,可手动改成任意分类(手动结果优先,置信度记为 100%),不调用模型,也不额外消耗 token。上限 2500 条,超出时按重要度、时效、类型和反馈质量淘汰;pinned 记忆受保护。

面板与 3D 图谱

侧边栏底部「记忆」按钮打开面板,只有「列表 / 图谱」两个主视图:搜索、分类筛选和记忆正文默认可见,反馈、置顶、屏蔽、改分类、删除等操作收进展开行;召回模式、召回测试、数据安全、备份和清空统一收进右上角「设置」。图谱是独立的 3D 画布:节点代表一条记忆或一个回合,边的粗细与亮度由关系强度决定,节点体积随召回次数、合并次数和置顶情况增大,布局按分类星团组织,支持旋转、平移、缩放、自动旋转、分类筛选、搜索高亮和详情。标签会做屏幕空间碰撞检测,拥挤时自动隐藏次要标签。图谱右上角「独立窗口」可打开无侧栏的完整视图,窗口可自由拉伸。对话内容默认自动进入池子,不需要手动添加。

模型可主动维护

memory 工具支持 search / save / forget / feedback,适合保存稳定的偏好、环境事实和长期项目约定。直接对模型说「记住……」,模型会调用该工具保存。

安装与启用

插件采用克隆仓库后运行安装脚本的方式,不要用 link: 或目录联接安装:DSH 的 ESM 拦截只对 profile 内的真实路径生效,符号链接会导致启动时报 ERR_MODULE_NOT_FOUND: @deepseek-ai/dsh-llm。

git clone https://github.com/Octidote/dsh-memory.git
cd dsh-memory
node scripts/install.mjs desktop

安装脚本会把插件复制为 <DSH_HOME>/profiles/desktop/node_modules/dsh-memory 真实目录,并把 dsh-memory 追加到该 profile 的 dsh.profile.bundles;完成后重启 DeepSeek Harness 即可。

典型用法

1、侧边栏底部点击「记忆」打开面板。顶部下拉框按 偏好 / 项目 / 环境 / 事实 / 计划 / 人物 / 对话 / 未分类 筛选,搜索框同时匹配正文、标签和分类名。
2、「列表」查看、搜索、展开和删除记忆。每行显示分类、时间和摘要,点开可见分类纠正(+N 表示候选次分类)、标签、召回次数、置顶 ★、屏蔽 ⊘、👍 / 👎 和删除。列表分批加载,每批 120 条,最多 1000 条。
3、「图谱」视图:左键拖拽旋转,右键拖拽平移,滚轮缩放,双击重置;点击节点看详情,点击右侧分类图例筛选,搜索框高亮匹配节点。
4、右上角「⚙」进入设置。「记录」可暂停/恢复自动记录;「召回」可查看/切换经典与混合模式,输入查询看本地候选及分数;「数据安全」显示单写者/只读状态与备份数量,可立即备份、校验、导出/导入或恢复;「维护」显示质量统计和清空入口。这些操作都不调用模型,也不注入当前对话。
5、直接对模型说「记住……」,模型会调用 memory 工具保存;清空全部在「设置」→「维护」,清空和恢复前都会先写入加密备份。

适用场景与注意

适合需要在多个 DSH 会话、多个工作区之间复用偏好、项目约定和环境事实的开发者,以及希望记忆内容可控、可解释、可纠正、且不离开本机的数据的处理方式。

需要注意几点:

1、插件以当前 dsh 进程权限运行,记忆文件的读写范围取决于该进程的权限,安装前应先检查源码与许可证(MIT)。
2、仓库当前星标为 0,属于早期项目;功能与召回效果以 README 和本地评测为准,不要只在生产环境依赖单一默认配置。
3、备份三件套(memories.json、memories.json.journal.jsonl、key.bin)必须一起保留,否则密文无法解开。
4、召回是启发式的本地匹配,不调用模型;如需更精确的注入行为,可在面板切换模式并观察候选分数。
5、仓库自带 npm test(锁 / 持久化确认 / JSONL 与压实 / 加密 / 召回 / 图谱)和 npm run eval(70 条标注查询)可作为安装后的自检手段。

结尾

dsh-memory 的价值在于把「每个会话各自记背景」换成「本机一个共享、加密、可解释的记忆池」,命中时只注入少量相关内容,日常操作绕开了手动整理 prompt 的负担。需要进一步了解可看目录页与仓库:

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

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

小夜