Repository navigation
Releases: Elio896/dsh-familiar-memory
Release list
dsh-familiar-memory v0.2.0
给 DeepSeek Harness 的本地记忆层,相比v0.1.0:修好了原先没有解决的bug、把文档变得更真实可查、修补了安装bug。
实验版:可以跑通所有功能,但还没有大量真实用户使用。
修
- 针对
grams()用\W会吞掉所有中文的问题以及共享词建边从上线起就没工作过。改用[^\p{L}\p{N}],补了回归测试。 POST /mode空 body 会静默切模式 , 现在非法值返回 400,不用改状态。- HTTP 写操作原本是 GET ——
/tidy/prune/replay任意网页都能触发。改成了 POST + Origin 校验 + body 上限 + 405。
承认
- 排序以前其实是按重要度,不是按相关度。
hops=0时score = 权重/3,查询根本没参与排序。现在rel(IDF 加权覆盖率)进了 score,相关性也成了门限(minRel: 0.30)。 - 文档里三条功能之前并不存在:
+0.5 合并、digest、原文回查。上一版 CHANGELOG 写成「补了 +0.5 合并」是错的,这里更正——一条都没补,0.3.0 再做。
加
neuron_opening:换会话不是重新认识。返回 ≤250 字(称呼 / 上次心情 / 聊到哪 / 下次问什么),直接塞进 system prompt。neuron_handoff:会话结束只会写三行:话题 / 卡在哪 / 下次问什么,加一个情绪数。- 工作状态:
decided_at+supersedes。新决定写入时,被覆盖的旧那条自动沉底:向量检索分不清「哪个是现在的」,状态表必须分清。 - 场景隔离:
scope默认private,群聊召回不到私聊;work不衰减、不沉底。 - 自动录入:每 10 分钟扫
~/.dsh/sessions,只抓用户消息进raw_log,不判断、不写记忆。sha1 去重,带scope分池。autoSync: false可关。注意: 它会读你本地所有会话文件,这是这个功能的代价,但是此插件不连网,不上传。
Breaking
- 权重改为指数衰减
base × 0.5^(天/半衰期),sinkBelow1.0 → 0.5。所有分数尺度变了。 noFallback默认true:零命中返回空,不再拿top()充数。/tidy/prune/replay从 GET 改 POST —— 旧面板会收到 405,需同步升级client.js。- 工具默认只暴露 7 个,
sync / raw / consume / replay / prune收进config.advanced: true。
迁移
首次启动自动把旧库复制成 neuron.db.bak-v<旧版本>,再按 user_version 逐级迁移到 schema v4。迁移幂等。
要求:Node ≥ 22.15(node:sqlite + zstd)、DSH ≥ 0.1.7。
验证
node test-all.mjs # 核心 / 契约 / 安装自检 三层全部绿灯
node eval/traps.mjs # 诱捕测试:20 题问"没发生过的事"dsh-familiar-memory v0.1.0
dsh-familiar-memory · 记性
给 AI伙伴用的本地记忆层。她记得你说过的小事和那天的情绪,想不起来就说想不起来,不会编造共同的经历。
数据是电脑上的一个 .db 文件,不联网,你能打开删改。
DeepSeek Harness 插件 · MIT · 零依赖(Node ≥22.5 内置 SQLite)
她会做的事
三天前你说「被领导骂了,想吃火锅」。
今天你说「想吃点好的」,她问:补上那顿火锅?
- 记小事,不记百科:一句话记时间和情绪;感受和约定排在档案前面
- 记得住你们的一天:想起一件事可以顺手带出同一天前后各一条
- 遵循人类遗忘曲线,但有旧记忆查询机制:淡了沉底但是不会删除,你精确问起还能捞回来
- 记不清就承认:没提到的事不会胡编乱造
记错了能改
UPDATE nodes SET text = '她喜欢猫,不是过敏才不养' WHERE id = 42;一行 SQL,下一轮她就改口。这是它和向量记忆最本质的区别:你能看见它记了什么,也能进行修改。
(手机 App 里会是「这条别再提了」按钮,0.4.0)
三十秒测它有没有用:
- 说一件小事 → 隔一天问「你还记得吗」
- 问一件根本没发生的事 → 她应该回「你没跟我说过」,虚构演绎没发生的事
- 改一条错记忆 → 看她下一句有没有改口
第 2 条是最重要的。它可以验证鱼是真的记得你还是在扮演聊天记录里的样子。
它不做什么
- 不做语义检索:只认字面,同义不同字会漏。会有点笨笨的,收益是它不会把语义上类似当成事实上发生过
- 不会自动冒出来:DSH 没有消息入站钩子,得接自动注入才有存在感(0.3.0 做主动开口)
- 不做图记忆:我们试过「神经元网络 + 激活扩散」,实测 1 跳让噪音率 33% → 64%、增量精确率 0%,已从主路径移除。方法和数字都在 FINDINGS.md
- 不联网、不上云、不做常驻监听
装
要求:Node ≥ 22.5(内置 node:sqlite)、DSH ≥ 0.1.7
git clone https://github.com/<you>/dsh-familiar-memory
cd dsh-familiar-memory
node install.mjs # 复制进 profile、登记 bundle、跑自检
dsh plugin add link:$(pwd)
node test-all.mjs # 四层测试重启一次 DSH,工具和设置页面板就出现。首次运行自动建空库。
想接已有记忆库,在 profile 的 cordis.patch.yml 里配:
- id: dsh-familiar-memory
name: dsh-familiar-memory
config:
db: /path/to/familiar.db
source_db: /path/to/memory.db # 可选:原文库(一张 memories(id,text) 表即可)数据在哪
$DSH_HOME/familiar-memory/familiar.db
- 备份 = 复制这个文件
- 删一条 =
DELETE FROM nodes WHERE id = ? - 看它记了什么 = 任何 SQLite 工具打开
适合 / 不适合
✅ 陪伴、角色扮演、长期个人助理——需要「记得你」,而且你不想把它放云上
❌ 文档问答、需要引用出处、团队共享知识库——那些该用 RAG,不是它
已知问题
- 默认
hops=0,所以replay/prune是空操作(这是有意的,见 FINDINGS) config.json里的hops/halfLifeDays等参数不生效,要写在cordis.patch.ymlPOST /mode空 body 会静默切到闲聊(0.2.0 修)
它现在到底在跑什么
坦白说:bm25 种子 + 情绪桶 + 同日窗口 + 指数衰减。没有向量,也没有图。
附一份小规模评测(18 题,作者自拟,只能看方向):
| 方案 | 命中 | 噪音率 | 每千字符命中 |
|---|---|---|---|
| 本插件 | 100% | 33% | 2.93 |
| 扁平 bm25(同 2-gram + IDF) | 94% | 26% | 3.10 |
| 纯权重(不检索) | 22% | 96% | 0.91 |
那 6 个点没有一个来自图——唯一差距是空查询时走了兜底。所以图退场了。
方法、归因和复现方式在 FINDINGS.md。
路线图
- 0.1.0 图记忆 + 激活扩散(已否决,见 FINDINGS)
- 0.2.0 修
grams()吞中文、scope隔离、置信门限、不截断文本、schema v2 迁移 - 0.3.0 主动开口:承诺到期 / 三天前低落跟进
- 0.4.0 手机 App:她有了身体(悬浮窗 + 语音)
许可与声明
MIT,详见 LICENSE。
本项目是第三方插件,与深度求索(DeepSeek)官方无关,未获其背书。
「DeepSeek Harness」仅用于说明兼容的宿主环境。
请不要用它储存别人的隐私;群聊场景必须开启 scope 隔离。