前言¶
跑 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