前言¶
跑 DSH 做智能体时,会话上下文往往只覆盖当前对话:上一轮说的偏好、约定好的事项,换几轮就没人再提了。把整段历史硬塞进 system prompt 会撑爆窗口,还会打乱前缀缓存。社区插件 dsh-brain-memory(维护者 Samanthara726)的思路是:记忆落在独立 SQLite 库里,由本地 Python 服务读写;插件只负责注入、落库和暴露工具,不改动 DSH 自带的人格与人格管线。分类上它归入「记忆」;简介为「Prevent your DSH from experiencing memory loss!」。当前仓库版本为 2.1.0(MIT)。
这是什么¶
dsh-brain-memory 给 DSH 接一套偏「模拟人脑」的长期记忆:FSRS-5 遗忘曲线、性格权重、中文 2-gram 检索,以及可选的本地向量(CPU,不占显存)。记忆与 DSH 自身的 session 存储分离;每轮对话可按策略把稳定事实写进上下文,回合结束自动把最后一问一答当流水落库。v2.1 起长期事实(带 why / factKey)常驻注入,对话流水只入库、不进提示;同一 factKey 更新会取代旧说法,但库内不物理删除。
在 DSH 里的三条贡献¶
插件通过 Cordis 挂三条线,README 里写得很清楚:
注入(system-prompt/assemble 瀑布):每轮拉一次当前有效的长期事实块(服务端 /facts,字数受 DSH_BRAIN_FACTS_CHARS 限制),只取带 factKey 或钉住的条目,避免每轮按话题换新段落打断前缀缓存。
落库(agent/settled):回合结束时把「最后一问 + 最后答」当流水写入,importance 压到 0.15,不带键、不钉住——可查、但不注入提示。
工具(brain_memory):write 记带 why / factKey 的事实;recall 翻旧账(deep=true 含被取代的旧说法);facts 看当前注入块;stats 看库状态。
三条底线:只加记忆、不动人格;召回超时 800ms 失败则视为无记忆;注入文本中的 {{ 会被拆开,避免搞砸 system-prompt 变量插值。
记忆服务与 v2.0 能力¶
| 维度 | 1.0 | 2.0+ |
|---|---|---|
| 遗忘 | 线性衰减 | FSRS-5(每条有牢固度 S、难度 D) |
| 召回 | 中文 2-gram | 2-gram + 可选本地向量,RRF 合并 |
| 人物档案 | 无 | 账本表(喜欢/不喜欢/事实/经历/约定等) |
| 观察 | /stats |
/graph + 只读 3D 星脑面板 |
老库启动会自动迁移;插件侧 lib/index.js 在 v2.0 说明中标注为接口向后兼容。
主要目录:lib/index.js(Cordis 插件)、server/memory_service.py(标准库、Python 3.10+)、可选 server/embed_service.py(torch + transformers)、scripts/memory-nebula.mjs(面板,Node 18+)。
安装插件¶
DSH 桌面版没有 dsh plugin add,需与现有社区插件相同的手工流程:
- 将整个插件目录放到
~/.dsh/plugins/dsh-brain-memory - 在所用 profile 的
package.json里增加依赖与 bundle:
"dependencies": { "dsh-brain-memory": "link:../../plugins/dsh-brain-memory" },
"dsh": { "profile": { "bundles": ["dsh-brain-memory"] } }
- 在
~/.dsh/profiles/<profile>/node_modules下建立同名 junction - 重启 DSH(或等待热加载),日志出现
dsh-brain-memory即表示加载成功
package.json 要求 Node >=20。
启动记忆服务¶
默认启动记忆服务监听 127.0.0.1:8790;接本插件时端口应设为 8793(插件默认连该地址):
MEM_PORT=8793 python server/memory_service.py
建议把库放到 DSH 专用目录,避免多实例混用,例如(Windows 示例来自 README):
MEM_DB=%USERPROFILE%\.dsh\brain-memory\memory.db
需要语义检索时再开向量服务(可选):
pip install torch transformers
huggingface-cli download BAAI/bge-base-zh-v1.5 --local-dir state/models/bge-base-zh-v1.5
python server/embed_service.py
向量服务默认端口 8794;挂了也不影响主流程,会退回纯 2-gram。
插件侧配置¶
| 变量 | 默认 | 说明 |
|---|---|---|
DSH_BRAIN_URL |
http://127.0.0.1:8793 |
记忆服务地址 |
DSH_BRAIN_DIR |
~/.dsh/brain-memory |
插件日志目录 |
DSH_BRAIN_RECALL_TIMEOUT |
800 |
召回超时(ms) |
DSH_BRAIN_WRITE_TIMEOUT |
2500 |
落库超时(ms) |
DSH_BRAIN_FACTS_CHARS |
1600 |
每轮注入事实块字数上限 |
服务端更多项见仓库 docs/参数与调优.md(MEM_DB、MEM_PORT、MEM_K 等)。
常用 HTTP 接口包括:GET /health、/stats、/facts;POST /write、/recall、/facts(生成注入块)、POST /delete(软删)等,完整列表见 README。
典型用法¶
通过工具写长期事实:模型调用 brain_memory 的 write,带上 why 与 factKey,后续每轮 /facts 会稳定注入;事实变更时用同一 factKey 再写一条即可取代旧条。
按话题翻旧账:用 recall,必要时 deep=true 查看被 supersede 的历史说法——这与「每轮自动按话题注入」刻意分开,避免上下文每轮抖动。
可选星脑面板(只读,写接口 403):
MEM_BASE=http://127.0.0.1:8793 node scripts/memory-nebula.mjs --open
自测(README 给出,避免污染真库):
python test/selftest-memory-factkey.py
MEM_PORT=8794 MEM_DB=./tmp/db.sqlite MEM_LOG=./tmp/svc.log python server/memory_service.py
DSH_BRAIN_URL=http://127.0.0.1:8794 node test/smoke.mjs
适用场景与注意¶
适合:希望 DSH 智能体跨多轮记住用户偏好、约定与可版本化事实,又不愿把整个聊天记录塞进 system prompt 的开发者。流水仍入库,便于事后 recall 或面板观察;稳定知识走 factKey 注入,和「聊天片段每轮变化」解耦。
务必注意:插件与记忆服务以你本机 DSH 进程的权限运行,安装前应通读源码与 MIT 许可证;可选向量依赖会拉取 Hugging Face 模型,需自行评估磁盘与网络。升级 v2.0 时 README 建议先备份 SQLite(WAL 模式下勿只拷 .db),换服务代码后老库可自动 FSRS 迁移;若启用向量,可按文档对老记忆 POST /reindex。
DSH 生态主张「一切皆插件」;SkillHub 目录页 是社区收录,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-brain-memory 把遗忘曲线、检索与事实键取代做成独立服务 + 薄插件:长期事实常驻注入,对话流水静默落库,需要时再靠工具翻账。进一步了解原理与排障可看仓库内 docs/说明书.md、docs/FAQ.md。
- 目录页:https://www.skillhub.cn/plugins/Samanthara726/DSH-Brain-Memory
- GitHub:https://github.com/Samanthara726/DSH-Brain-Memory