Skip to main content
A

-

a2092776074-collab/-

File-based memory for DSH agents: layers, FSRS-5 decay, cold archive, recall, zones, and optional auto-injection.

Install

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/-/issuesbug、安装失败、行为不符合预期
邮箱2092776074@qq.com不想公开说的事、想附日志/截图
B 站私信 / 评论区https://space.bilibili.com/98629244用着别扭、想要某个功能、说不清是哪里的问题

提的时候顺手带上四样,能省好几轮来回:

  1. dsh-memory-system 版本(npm ls dsh-memory-system 或看 package.json)
  2. DSH 版本(dsh --version)
  3. 操作系统 + Node 版本
  4. 期望发生什么 / 实际发生了什么;有报错就贴报错原文

已知不做的事(免得白提):

  • 不做向量检索(现在是关键词 + 可选语义服务,加了会拖慢启动)
  • 不做云同步(记忆是文件,放你自己信得过的盘)
  • 不会自动判断「这条没用了」——归档永远是半自动

许可

MIT。模板里的示例是虚构的,替换成你自己的。

Related plugins