dsh-familiar-memory (dsh-neuron-memory): DSH Local Memory Layer

前言

在 DeepSeek Harness(DSH)里做长期对话,常见做法是外挂 RAG 或第三方记忆库:检索准,但开场往往像「新会话」,称呼、上次聊到哪、工作里哪条决定算数,都要靠模型自己猜或靠你反复粘贴上下文。Elio896 维护的 dsh-familiar-memory(仓库内 npm 包名 dsh-neuron-memory,当前 v0.2.0)走另一条路:数据落在本机一个 SQLite 文件里,不联网、不上传;用字面命中(FTS5 + 2-gram)、情绪桶、同日窗口和指数衰减做召回,并用 neuron_opening / neuron_handoff 把「换会话之后还是同一个人」写进工具层。下面介绍它是什么、能做什么、怎么装、怎么用。

这是什么

一句话:给 DSH(cordis 插件)用的本地记忆抽屉——按相关度 × 权重排序注入,可审计、可改库;没有向量,图扩散在 v0.2.0 默认关闭(hops=0)。

作者简介里提到:经测试,相比单纯 RAG 和外部记忆库,本地这套在对话里更自然——这与 README 强调的「认人、交接、工作决定用 supersedes 表示最新」一致,具体效果需在你自己的数据上验证。

核心机制(v0.2.0 实际在跑的)

坦白说 README 的定位是:bm25 种子(IDF 加权)+ 情绪桶 + 同日窗口 + 指数衰减。图记忆(激活扩散)已否决:作者实测 1 跳噪音 33% → 64%,增量 0%,见仓库 FINDINGS.md。

召回与排序

  1. 种子:FTS5 倒排(unicode61 + 预切 2-gram)捞候选;相关度 rel = Σidf(命中)/Σidf(全部),整词命中视为 1;rel ≥ minRel(0.30) 才计入。
  2. 排序:score = rel × 权重/3 × 温度系数;权重 = 基础分 × 0.5^(天/半衰期),恒正、永不归零(v0.2.0 从线性衰减改为指数衰减,属于 breaking change)。
  3. 温度桶:感受 / 原话 / 偏好 / 回味 3.0,教训 2.5,事件 1.6,档案 1.3 等,聊天时感受优先。
  4. 同日上下文:想起一条时,可带出当天前后各一条(只给最前两条)。
  5. 复习只回血一半:被想起时把「已流逝天数」折半,不是重置到现在。
  6. 沉底不删:低于 sinkBelow(默认 0.5)进归档,普通召回不参与;精确问起(命中 ≥2 词)仍可翻出。
  7. 场景隔离:scope 默认 private;work 不衰减、不沉底;群聊召回不到私聊。

零命中时默认返回空(noFallback: true),不再用 top() 充数——排序语义也从「重要度」改为「相关度 × 权重」。

换会话:她还是同一个人

插件用两个工具把「会话」挡在外面,只负责存和交:

会话开始  → neuron_opening()            返回一段 ≤250 字,直接塞进 system prompt
会话结束  → neuron_handoff({topic, phase, nextAsk, mood, name})   只写三行 + 一个情绪数

neuron_opening() 示例输出形态(README 原文):

你正在和周舟说话。
今天还见过面(有点闷)。
你们正聊到:换工作,卡在钱不够。
你上次想问她:面试结果出来没。
你记得:她说周三要交材料;她讨厌豆包腔。
开场先认出她——用对的称呼、接上上次的话题。不要重新自我介绍,不确定的事就问,不要编。

工作会话可传 includeWork: true,追加「项目状态(按拍板时间)」;与私人开场块互斥,不叠加。

工作状态:要「最新」,不要「最像」

工作记忆用 decided_at 和 supersedes 区分「现在有效的决定」:

neuron_learn("走方案 B,A 的迁移成本太高", "fact", "work", { supersedes: 12 })
// → 12 号那条自动 status='sunk',不再被当成「现在的」

跨 scope 或 id 不存在时只警告,不静默沉底。

默认暴露的工具(7 个)

工具 作用
neuron_opening(scope?, includeWork?) 会话开场:认人 + 上次聊到哪 + 下次问什么(≤250 字)
neuron_handoff(topic, phase, nextAsk, mood, name?) 会话交接:只写三行 + 情绪数
neuron_recall(query, limit?, mode?, scope?) 相关性召回;mode=lite 只回文本
neuron_learn(text, kind?, scope?, supersedes?) 学一条;supersedes 会沉掉被覆盖的旧决定
neuron_stats() 节点 / 连接 / 待沉 / 已沉 / 最老沉底日期
neuron_story(day?) 按天串叙事线
neuron_tidy() 沉掉最淡的几条(沉 ≠ 删)

config.advanced: true 时额外放出:neuron_sync、neuron_raw、neuron_consume、neuron_replay、neuron_prune。

自动录入(可选)

插件每 10 分钟扫一次 DSH 会话记录(~/.dsh/sessions/ 下最近 2 天的 zstd 帧),把用户消息写入本地 raw_log——只抓,不判断、不写记忆;值得记哪句仍由模型通过 neuron_learn 等决定。可用 config.autoSync: false 关闭;周期用 config.autoSyncMinutes(默认 10)。它会读本机会话文件,这是功能代价;数据仍在 neuron.db,不上传。

安装与启用

环境:Node ≥ 22.15(node:sqlite + zstd);README 写 DSH ≥ 0.1.7,package.json 的 engines.dsh 为 >=0.2.0,以你实际 DSH 版本为准。

在克隆或下载后的插件目录内执行(命令来自 README,勿凭仓库名拼接 github: 安装):

node install.mjs                 # 复制进 profile、登记 bundle、跑自检
dsh plugin add link:<本目录>     # 或者走官方命令
node test-all.mjs                # 四层测试

装完重启一次 DSH,工具和设置页会出现;首次运行自动建空库。首次启动若存在旧库,会复制为 neuron.db.bak-v<旧版本> 并按 user_version 迁移(当前 schema v4)。

接已有记忆库时,在 profile 的 cordis.patch.yml 中配置(节选):

- id: dsh-neuron-memory
  name: dsh-neuron-memory
  config:
    db: /path/to/neuron.db
    source_db: /path/to/memory.db   # 可选:原文库(memories(id,text) 表)
    halfLifeDays: 10
    sinkBelow: 0.5
    sinkLimit: 3
    hops: 0                   # 默认 0 = 图未启用
    minRel: 0.30
    noFallback: true
    advanced: false           # true 才放出 sync/raw/consume/replay/prune
    autoSync: true

v0.2.0 另有一项迁移注意:HTTP 写操作(/tidy /prune /replay /handoff)从 GET 改为 POST,旧 Web 面板需同步升级 client.js。

典型用法

  1. 新会话:在 system prompt 中注入 neuron_opening() 的返回值;工作场景需要项目状态时传 includeWork: true。
  2. 对话中:用 neuron_recall(query) 按问题拉相关记忆;用 neuron_learn(text, kind?, scope?, supersedes?) 写入;工作决定变更时带上 supersedes。
  3. 结束会话:调用 neuron_handoff 写 topic / phase / nextAsk / mood(及可选 name),供下次 opening 接续。
  4. 维护:neuron_stats() 看库状态;neuron_tidy() 沉底最淡条目;需要扫会话原文并提炼时开 advanced 后用 neuron_sync / neuron_raw / neuron_consume。

适用场景与注意

更适合:希望记忆完全本地、可打开 SQLite 审计;重视称呼与话题 continuity、工作决定「最新一条」而非语义最像;能接受字面检索而非向量语义。

务必注意:

  • 插件以当前 DSH 进程权限运行;安装前应阅读源码与 MIT 许可证,自行判断是否信任。
  • 不要用它存他人隐私;群聊应使用 scope 隔离。
  • 自动录入会读取 ~/.dsh/sessions/;不需要则关闭 autoSync。
  • 社区目录 skillhub 与 DeepSeek / 幻方无官方从属关系,DSH 生态是「一切皆插件」的独立社区分发,不是官方应用商店。

结尾

dsh-familiar-memory(dsh-neuron-memory)把 DSH 的长期对话记忆收进本机 SQLite:相关度加权召回、情绪与同日上下文、指数衰减与沉底归档,再用 opening/handoff 和 work 的 supersedes 解决「新会话像陌生人」和「旧方案仍被召回」两类问题。细节见仓库 FEATURES.md、ARCHITECTURE.md、FINDINGS.md。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye