dsh-memory-atlas
Discovered把一本 Markdown 记忆档案连成一张会生长的星图:命令行版 + DeepSeek Harness 插件
yan-memory · 砚的记忆
给长期运行的 AI 助手一条用得上的记忆。
不是存更多,是在它最容易忘事的地方停一下。
问题
上下文一断,助手就失忆。下一次开新会话,它不记得上周答应过什么、踩过哪些坑、你为什么改变过主意。
主流的解法是"存更多、检索更准":向量库、记忆插件、自动摘要。这些都有用,但解决的是存的问题。
真正的痛点在用:记忆存得很好,需要它的那一刻却想不起来调用。
我们的答案:三层
- 档案(存)——用 Markdown 写,按天追加,不自动改写。记忆的所有权留在人这边。
- 线头(什么时候想起)——把教训压成一句句触发词,塞进每个会话都会加载的
AGENTS.md。不靠模型自觉,靠上下文必须经过它。 - 星图(线在哪)——把档案变成一个能点、能搜、能顺着关联线走的网络。相似、显式引用、同日,三种边。
缺一层都不成立:
- 只有档案:查得到,但不会在当下被想起;
- 只有线头:会停一下,但停完不知道去哪找;
- 只有星图:看得见,但看完就丢。
十分钟起步
- 建一个 Markdown 文件夹,比如
memory/,每天一个文件。 - 把
templates/lineheads.md里的内容粘进你项目根目录的AGENTS.md(或等价的常驻指令文件),按你踩过的坑改触发句。别把模板文件就叫 AGENTS.md——很多工具会把子目录里的AGENTS.md当成目录指令自动加载,模板正好会被误当成真指令。 - 每周一次:把你反复踩的坑,加一条线头。从没让你停过的,删掉。
三条迭代规则,比内容重要:
- 只在真踩过坑的时候加一条;
- 一条线头从没让你停过,就删(不留装饰);
- 验收只有一条:同一个坑第二次踩时,当场停住。
星图:把档案连成网
tools/ 里两个脚本,只用标准库,Python 3.8+ 就够:
python tools/build.py --src <你的记忆目录> # 拆节点、造边 → nodes.json / edges.json
python tools/gen.py --src <你的记忆目录> # 渲染 → index.html,浏览器直接打开
--src 指向任意一个装着 Markdown 的文件夹;不传就是当前目录。脚本自己找档案
(我的记忆档案.md / 记忆档案.md / memory.md / archive.md)和收件箱
(记忆收件箱 / 收件箱 / inbox),找不到就明说,不瞎猜。
想先看效果,拿 examples/demo 跑一遍,别拿自己的数据试。
三种边是它唯一的设计:
- 相似(sim)——两段话用词接近。每个节点只连最像的 8 个,不然几千条边什么都看不见。
- 点名(ref)——正文里写了「3月6日」这种日期,就连到那天。
- 同日(day)——同一天发生的事彼此相邻。
看懂的是网,不是清单:一个坑和三个月后同一个坑之间有线,顺着走,才看出自己一直在原地。
主题色来自一张可以换的表:<src>/themes.json 优先,没有就用 tools/themes.json。
默认那份是按我们自己的事配的,你多半得换掉。
装进 DeepSeek Harness(可选)
plugin/ 是同一张星图的插件版:不生成 HTML 文件,直接在侧栏里开一页。
解析规则和 tools/build.py 一模一样,只是换成了 JavaScript —— 不用装 Python。
它是一个空壳。 插件里不带任何记忆、不带任何人的数据,装上去是空的, 你得把自己的记忆文件夹指给它,它才有东西可画。
dsh plugin add link:<这个仓库的绝对路径>/plugin
装完重开,侧栏多一个星图图标。点开选目录:
- 拖拽旋转、滚轮缩放,点一颗星看它背后那段原话;
- 「换个目录」可以随时指向别的文件夹,会记住上次的选择;
- 中心那颗星默认叫「我」。想换成别的名字,在记忆目录里放一个
atlas.json:
{ "center": "你的名字", "title": "×× · 记忆星图" }
你的文件要长什么样
它能画出来的东西,全来自你自己的 Markdown。三种来源,认得哪一种就画哪一种:
- 档案——
我的记忆档案.md/记忆档案.md/memory.md/archive.md, 都没有就取目录下最大的那个.md。正文按##分节、段落之间空一行,每段算一个节点。 - 收件箱——目录里叫
记忆收件箱/收件箱/inbox的文件夹, 里面每篇按## [2026-03-05 21:14] [dsh] §3 / 一句话标题开头,一条算一个节点。 - 更新日志——档案里
## 14.那一节如果是| 日期 | 事件 |的表格,每行算一个节点。 没有这一节就跳过,不报错。
themes.json 决定颜色怎么分。查找顺序:<目录>/themes.json 优先,否则用插件自带的那份
(工作 / 技术 / 学习 / 生活 / 关系 / 健康 / 想法 / 其他)。自带那份是按通用场景配的,
你有自己的分类就在目录里放一个:
{ "default": "其他", "themes": [{ "name": "工作", "keywords": ["项目", "会议"] }] }
写错了也不要紧——keywords 匹配不到任何东西,全部落到 其他 里,图还是画得出来。
我们只验证过一个人
这套东西是一个人和一个助手,用十几天、上百次真实踩坑长出来的。
它可能不适合你。写在这里的是我们怎么做的,不是最佳实践。
如果你拿它当模板改,请保留这条局限——别把一个个人方案包装成通用解。
目录
docs/ 为什么这样做(含失败部分)
templates/ 可直接抄的片段:线头、状态文件、收件箱
tools/ 星图命令行版:build.py 拆节点造边,gen.py 渲染成 HTML
plugin/ 同一张星图的 DSH 插件版(侧栏一页,不用生成文件)
examples/ 假数据 demo,跑一遍就知道长什么样
醒来检查(每次会话开头确认档案还读得到)还没通用化,暂时只有星图这一半。
致谢
我们一直在用别人的开源。这个仓库是按自己的能力,还回去的一点东西。
MIT License
Comments
Loading…