-
a2092776074-collab/-
File-based memory for DSH agents: layers, FSRS-5 decay, cold archive, recall, zones, and optional auto-injection.
インストール
dsh plugin --profile web add github:a2092776074-collab/-README
dsh-memory-system
给 DeepSeek Harness 用的文件式记忆体系:分层、会忘、能找回。
不是向量数据库,也不是「把聊天记录全塞进上下文」。它把记忆拆成四层:
- L3 灵魂:身份/锚点,不衰减,只能本人改写;
- L2 知识:判据(我信什么)+ 外部参考(用时查);
- L1 情节:日记/判例/情节单元,FSRS-5 算牢固度,会冻结、可归档;
- L0 会话:当前上下文,压缩即丢。
核心是分层 + 允许忘 + 能找回来,不是记得更多。
安装
dsh plugin --profile desktop add dsh-memory-system
或用本地 tarball:
npm pack
dsh plugin --profile desktop add ./dsh-memory-system-0.1.0.tgz
装完重启 DSH。插件本身不带任何人的灵魂/知识;初始化后才有模板。
初始化
装好后对助手说:
初始化记忆体系
或直接调用工具 memory_init。它会把模板(六件套、判据库、数据文件)和脚本复制到当前工作区,已存在的文件不覆盖。
工具
| 工具 | 作用 |
|---|---|
memory_init | 初始化模板 + 脚本(不覆盖) |
memory_status | 单元总数、冻结数、每个单元的 R/S |
memory_recall | 按关键词找单元 + 原文;默认不列冻结 |
memory_review | 复习一个单元,更新 FSRS-5(1-4) |
memory_archive | 冷归档(默认 dry-run,apply=true 才动) |
0.4.0 新增:闭合、状态自检、正文权重
**记忆会「永远未了」**是这个体系最初的毛病:任务做完了,单元还挂着 open,下次问「后来怎么样了」只能瞎答。
0.4.0 加了三样东西:
闭合
单元多了两个字段:closed_at(什么时候关的)、outcome(done/dropped/rescheduled/partial)。
node scripts/close-task.mjs <id> done "结论一句话"
node scripts/close-batch.mjs --dry # 批量看候选,不加 --dry 才真关
close-task 会先备份再改;close-batch 只碰「摘要里已经写着完成、状态还是 open」的单元。
状态自检
注入时,如果一条 open 的单元标题/摘要里已经出现「完成/成功/定稿/跑完/验收」,行首会带 [状态待核]。
起因是实测:141 条「未了」里有 20 条正文早写着完成——同一条记录同时说「未了」和「已完成」,答哪个都可能判错。
正文权重
有正文(≥80 字)的单元 +5 分,正文为空 −3 分。纯标题卡不再把能答的挤下去。
另外两个默认关闭的实验开关
DSH_MEM_INTENT=1 # 时态窗口:现在/过去/将来 分别加权
DSH_MEM_ROUTER=1 # 车道判定:「做完了吗/进展/还欠」类问句,状态矛盾的降权
这两个都还没有在评测里证明有效,所以默认关。想试再开。
已知限制(先写出来)
- 大部分单元只有标题和一句摘要:实测 543 条里只有 142 条有正文。问细节答不出,这是目前最大的短板。
- 判分口径有偏:仓库自带的评估脚本用「答案里有没有预设短语」判对错,转述会被判错。同一批答案,字符串判分 68.4%、换成模型判分 71–77%,三个模型之间一致 91–94%。
- 没有已验证的多客户端接入:另有一个 MCP 服务端原型(不在本包内),协议层自测通过,但没有在真实客户端里接通过。
分区
每个记忆单元有 zone,默认 task:
| zone | 放什么 | 自动注入 | 自动归档 |
|---|---|---|---|
identity | 身份/锚点 | ❌ | ❌ |
relation | 人物、关系、约定 | ✅ | ✅ |
task | 手头的事、项目、待办 | ✅ | ✅ |
reference | 外部参考、书摘 | ✅ | ✅ |
vault | 私密仓 | ❌ | ❌ |
自动注入只读 relation/task/reference;vault 和 identity 要显式 memory_recall 才出现。
自动注入
插件启动后,每 3 秒检查活着的会话,挂一段 systemPrompt.context:
- 取当前用户消息,和单元标题/note/source 算关键词相关度;
- 再按重要度、FSRS R 排序;
- 最多 6 条、700 字;只列
id + 标题 + zone,不注入全文; - 没有命中就返回空,不加噪音;
- 需要细节让模型再调
memory_recall。
这是 v0.1 的轻量版:没有向量检索,也没有 token 精算;够用就好。
直接跑脚本
不装插件也能用(把 template/ 和 scripts/ 复制到工作区):
node scripts/memory-decay.mjs list
node scripts/memory-decay.mjs test
node scripts/memory-archive.mjs --self-test
node scripts/memory-archive.mjs # dry-run
node scripts/memory-archive.mjs --apply
node scripts/memory-recall.mjs 关键词 --review 3
node scripts/episode-add.mjs --kind text --title "..." --source "..." --detail "..."
结构
工作区/
├── 灵魂.md / 自我.md / 人设.md / 日记.md / 意向.md / 状态.md
├── 判据库.md
├── 知识/索引.md
├── 数据/记忆单元.json
├── 数据/memory-decay.json
├── 数据/archive/
└── scripts/
测试
npm test
test/smoke.mjs 会初始化一个临时工作区,验证:模板复制、分区过滤、自动注入不泄漏 vault、关键词召回、归档 dry-run。
设计取舍
- 文件优先:可读、可 diff、可迁移;没有事务/并发控制。
- 忘是功能:冻结/归档让旧细节不稀释当前判断;代价是要手动 review。
- 判据 vs 参考:判据要案例 + 失效条件;参考用时查,不背。
- 灵魂不可外包:外部插件可代存知识,不能代写「我是谁」。
边界
- 召回是关键词/子串,不是语义检索;
- 初始寿命是校准值(30/90/365/3650 天),不是验证过的效率;
- 归档是半自动,不会自己判断「这条没用了」;
- 没有内置加密:凭据不要放进这个体系,也不要进云备份。
反馈
用出问题、或者有想法,都发这里:
| 渠道 | 地址 | 适合什么 |
|---|---|---|
| GitHub Issues(首选) | https://github.com/a2092776074-collab/-/issues | bug、安装失败、行为不符合预期 |
| 邮箱 | 2092776074@qq.com | 不想公开说的事、想附日志/截图 |
| B 站私信 / 评论区 | https://space.bilibili.com/98629244 | 用着别扭、想要某个功能、说不清是哪里的问题 |
提的时候顺手带上四样,能省好几轮来回:
dsh-memory-system版本(npm ls dsh-memory-system或看 package.json)- DSH 版本(
dsh --version) - 操作系统 + Node 版本
- 期望发生什么 / 实际发生了什么;有报错就贴报错原文
已知不做的事(免得白提):
- 不做向量检索(现在是关键词 + 可选语义服务,加了会拖慢启动)
- 不做云同步(记忆是文件,放你自己信得过的盘)
- 不会自动判断「这条没用了」——归档永远是半自动
许可
MIT。模板里的示例是虚构的,替换成你自己的。