dsh-local-memory v2
DeepSeek Harness 的纯本地长期记忆 —— 跨对话、跨项目。数据只存你本机,不联网也能用。
v2 是彻底重写:存储换成 SQLite(JSON 兜底)、中文检索改用二元组、新增记忆关系图、 矛盾粗筛、可选的语义检索。v1 已停更,旧版见 dsh-memory-plugin。
它解决什么问题
AI 每开新对话都从零开始:不记得你的偏好,不记得上次定下的约定,也不记得踩过的坑。
这个插件让"值得长期保留的结论"落盘,下次自动带回来。
两种用法,任选
| 形态 | 怎么用 | 适合 |
|---|---|---|
| DSH 插件 | dsh plugin --profile desktop add <包名或路径> |
装了 DeepSeek Harness 的人:对话时自动回忆/自动存 |
| 独立软件(压缩包) | 解压后双击 start.cmd(或双击安装时创建的桌面快捷方式) |
任何人:不需要 DSH,浏览器里管理记忆、看关系图 |
两者共用同一份数据格式,也可以同时用。
怎么打开界面
| 形态 | 打开方式 |
|---|---|
| DSH 插件 | DSH 网页端 → 设置 → 左侧分区 「本地记忆」(settings.section,order 28)。里面只有两件轻事:记忆列表 / 补标,外加一个 「打开完整记忆界面」 按钮 |
| 独立软件 | 双击仓库里的 启动记忆软件.cmd(压缩包版本里叫 start.cmd);或 node app/server.mjs --open。端口由系统分配,实际地址写在 ~/.dsh/local-memory/instance.json |
一套界面,两个入口
关系图、卡片视图、右键看全文、联想、直觉页、设置页——只维护一份,都在独立软件里。
插件不再重复实现这些:点「打开完整记忆界面」时,宿主的 /dsh-local-memory/open 会
- 看独立软件是否在跑(读状态文件 + 探端口)
- 没在跑就用 DSH 自带的 Node(
ELECTRON_RUN_AS_NODE=1,用户不需要装 Node)把它拉起来 - 再 302 跳过去
好处很直接:
| 以前 | 现在 | |
|---|---|---|
| 界面实现 | 两套,插件那套永远落后 | 一套 |
| 双击快捷方式 / 插件拉起 | 可能起两个进程写同一个库 | 单实例锁,第二个自动复用 |
| DSH 退出后 | 服务一直挂着 | 闲置 10 分钟自动关闭 |
数据只有一份:
~/.dsh/dsh-local-memory.db,插件和独立软件共用。 上游进程(DSH)消失后,服务会在闲置 10 分钟后自己收掉;期间有请求(比如页面开着轮询)就不收。
核心机制
检索:中文也能搜得准
SQLite FTS5 默认分词器对中文几乎不可用(整句当一个词)。v2 在写入时额外生成二元组切分列
(我喜欢吃牛肉面 → 我喜 喜欢 欢吃 吃牛 牛肉 肉面),于是"北京""插件""记忆"这类两字词都能命中,
而"北京市"不会乱命中"北京"。
排序公式(每个因子都能单独调):
score = relevance × importanceFactor × decay × usageBoost
decay按类别给不同半衰期:工作 365 天 / 偏好 730 天 / 情感 60 天usageBoost用对数压制,防止一条高频记忆永久霸榜- 陈旧记忆仍可搜到,只是往后排(精确命中时不会被丢弃,并标记时效警告)
类别自动推断
写入时按内容粗分 工作 / 偏好 / 情感(纯本地词表规则,证据不足就留"未分类")。 类别不是装饰——它决定上面那个半衰期。误判可以在补标页改。
记忆关系图(不需要任何 API key)
五种确定性关系自动连线:
| 关系 | 怎么来的 | 可信度 |
|---|---|---|
| 共现 | 两条记忆在同一次检索里同时命中 | 最强(使用痕迹) |
| 共享标签 | 标签交集,按 idf 加权 | 强 |
| 语义相近 | 向量余弦 ≥ 阈值,每点最多留 3 条 | 中(需配 embedding) |
| 同项目 | 同一个 project 字段 | 弱 |
| 时间相邻 | 创建时间接近(主要给布局用) | 最弱 |
看得出来的东西:扎堆(力导向聚簇)、孤立(红圈:写了但没人用过)、 疑似冲突(黄圈:说同一件事但关键值不同)。
直觉页
- 该想起的:重要、搁了很久、几乎没被用过的那几条
- 疑似冲突:只给候选 + 说清理由,绝不自动改数据
安装
作为 DSH 插件
# 从本地目录
dsh plugin --profile desktop add <本仓库绝对路径>
# 或从 tarball
dsh plugin --profile desktop add ./dsh-local-memory-2.0.0.tgz
装完必须重启 DeepSeek Harness——插件是在宿主启动时装配的,运行中的实例不会热加载新装的包。重启后打开 设置 → 本地记忆。
作为独立软件
node app/server.mjs --open # 或双击 启动记忆软件.cmd(压缩包里是 start.cmd)
首次启动会自动建库;如果你以前用 v1,可以用迁移脚本导入:
node scripts/migrate-v1.mjs --from ~/.dsh/dsh-local-memory.json
数据在哪、隐私如何
| 项 | 位置 |
|---|---|
| 插件记忆库 | ~/.dsh/ 下的 sqlite 库 |
| 插件配置 | ~/.dsh/ 下的 dsh-local-memory.v2-config.json |
| 独立软件数据 | ~/.dsh/dsh-local-memory.db —— 和插件共用同一个库(不是 app/data 了,那个是旧位置) |
默认完全不联网:不调大模型、不需要 API key、不用起服务。
唯一的外网依赖是可选的语义检索(embedding):关掉时一切照常,只是没有"换个说法也能搜到"。 开启后发送的内容只有记忆正文和查询词,配的是你自己填的 OpenAI 兼容端点。
可选:语义检索
设置页填 OpenAI 兼容端点即可(硅基流动、智谱、Jina、OpenAI、千问百炼都兼容):
| 项 | 例 |
|---|---|
| 端点 | https://api.siliconflow.cn/v1 |
| 模型 | BAAI/bge-m3 |
⚠️ DeepSeek 官方没有
/embeddings接口,它的 key 用在这里无效。
配好后点「给历史记忆补向量」。失败会自动降级回关键词检索,不影响使用。
与 v1 的差别
| v1 | v2 | |
|---|---|---|
| 存储 | 单个 JSON 文件 | SQLite(JSON 兜底) |
| 中文检索 | 子串匹配 | 二元组 + FTS5 |
| 时间感知 | 一刀切 | 按类别差异化半衰期 |
| 关系图 | 无 | 五种关系 + 双视图 + 冲突标记 |
| 独立软件 | 无 | 有 |
| 语义检索 | 无 | 可选 |
v1 的导入导出(Markdown / Kun / Hermes)v2 暂时没有,需要的话先用 v1 导出,再用迁移脚本导入。
开发
node --test test/ # 全部测试(Windows 上请显式列文件,见 docs)
npm pack --dry-run # 发布前必跑:确认不含数据/密钥
目录:
src/core/ 零宿主依赖的内核(存储/检索/时间/关系图/分类)
src/host/ 插件宿主层(工具、路由、系统提示词、配置)
src/client/ DSH 设置页前端
app/ 独立软件(服务器 + 纯前端,无构建步骤)
docs/ 设计文档、发布手册、独立软件说明
内核不许 import 宿主 API —— 有测试守着这条,将来独立软件化不用重写。
许可
MIT
No comments yet. Be the first to write one.