DSH-Brain-Memory:用独立记忆服务让 DSH 长期记住事实与对话

前言

跑 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,需与现有社区插件相同的手工流程:

  1. 将整个插件目录放到 ~/.dsh/plugins/dsh-brain-memory
  2. 在所用 profile 的 package.json 里增加依赖与 bundle:
"dependencies": { "dsh-brain-memory": "link:../../plugins/dsh-brain-memory" },
"dsh": { "profile": { "bundles": ["dsh-brain-memory"] } }
  1. 在 ~/.dsh/profiles/<profile>/node_modules 下建立同名 junction
  2. 重启 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye