Skip to content

Releases: Elio896/dsh-familiar-memory

dsh-familiar-memory v0.2.0

Choose a tag to compare

@Elio896 Elio896 released this 29 Oct 11:55
95a936c

给 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

  1. 权重改为指数衰减 base × 0.5^(天/半衰期),sinkBelow 1.0 → 0.5。所有分数尺度变了。
  2. noFallback 默认 true:零命中返回空,不再拿 top() 充数。
  3. /tidy /prune /replay 从 GET 改 POST —— 旧面板会收到 405,需同步升级 client.js。
  4. 工具默认只暴露 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

Choose a tag to compare

@Elio896 Elio896 released this 29 Oct 11:35
ebfddef

dsh-familiar-memory · 记性

给 AI伙伴用的本地记忆层。她记得你说过的小事和那天的情绪,想不起来就说想不起来,不会编造共同的经历。
数据是电脑上的一个 .db 文件,不联网,你能打开删改。

DeepSeek Harness 插件 · MIT · 零依赖(Node ≥22.5 内置 SQLite)


她会做的事

三天前你说「被领导骂了,想吃火锅」。
今天你说「想吃点好的」,她问:补上那顿火锅?

  • 记小事,不记百科:一句话记时间和情绪;感受和约定排在档案前面
  • 记得住你们的一天:想起一件事可以顺手带出同一天前后各一条
  • 遵循人类遗忘曲线,但有旧记忆查询机制:淡了沉底但是不会删除,你精确问起还能捞回来
  • 记不清就承认:没提到的事不会胡编乱造

记错了能改

UPDATE nodes SET text = '她喜欢猫,不是过敏才不养' WHERE id = 42;

一行 SQL,下一轮她就改口。这是它和向量记忆最本质的区别:你能看见它记了什么,也能进行修改。
(手机 App 里会是「这条别再提了」按钮,0.4.0)

三十秒测它有没有用:

  1. 说一件小事 → 隔一天问「你还记得吗」
  2. 问一件根本没发生的事 → 她应该回「你没跟我说过」,虚构演绎没发生的事
  3. 改一条错记忆 → 看她下一句有没有改口

第 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.yml
  • POST /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 隔离。