前言¶
DSH 的會話之間默認互不相識。每開一個新會話,你都要把背景、偏好、上次踩過的坑重新交代一遍;模型改過的錯,下一個會話大概率再犯一遍;散落在各處的人設和工作準則改不動、也傳不下去。dsh-elysia 針對的就是這個缺口:它讓所有會話讀同一份磁盤上的 MEMORY.md,模型在每輪對話裏看到的記憶都直接來自磁盤,上下文被壓縮之後自動重新讀取。
不同於一般「文本寫在這個文件裏、下次別忘了」的備忘,它把記憶做成了一套帶檢索、帶淘汰、帶備份的小系統。這也是它和普通人設插件的區別:自帶整份角色自我記憶包,但它是可選裝的「皮膚」,默認不裝。
這是什麼¶
由 1148462398-hub 維護,在社區插件目錄裏分類爲「記憶」,GitHub 星標 0(截至抓取時)。對應 npm 包名 dsh-elysia-memory,版本 2.6.0,許可證 MIT。
一句話定位:一份全 DSH 會話共用的 Markdown 記憶文件,配雙硬盤分區鏡像備份、命中頻率分層歸檔、BM25 模糊檢索、質疑度驅動換方法,外加一個可選裝的角色記憶包。
記憶文件長什麼樣¶
單個 Markdown 文件,人類可讀、可以手工編輯,用 HTML 註釋標記劃分區塊。README 裏的表格列了七個區塊:
| 區塊 | 內容 | 誰來寫 |
|---|---|---|
persona |
當前模型的人設提示詞 | 模型(用戶對話要求時) |
requirements |
用戶要求與長期偏好 | 模型 |
requests |
用戶輸入流水(每輪自動摘要一行,滾動淘汰) | 插件自動 |
corrections |
用戶指正(錯在哪 / 以後怎麼改) | 模型 |
lessons |
自我教訓(自己發現的錯誤) | 模型 |
methods |
更好的方法(場景 / 做法 / 爲什麼更好) | 模型 |
sessions |
會話索引(含壓縮事件) | 插件自動 |
requests 與 requirements 分開是刻意的:每輪自動摘要不把長期要求擠掉。requests 只是流水,檢索時能看到;requirements 只放模型判斷值得長期保留的。
<!-- dsh-shared-memory:xxx:start --> / :end 這兩類標記請勿刪除,其餘正文隨便改。
有一點需要在讀代碼前留意:README 的表格寫七個區塊,而 package.json 的描述寫成「九個分區」,並額外提到 identity(自我記憶,優先級高於人設)、methodbook(方法庫)和 docs。網頁那節也提到 docs。兩處口徑不一致,實際分區數量以插件代碼爲準。
存儲位置與雙備份¶
默認主文件在 C 盤,鏡像自動選第一塊非系統盤:
%USERPROFILE%\.dsh\dsh-shared-memory\MEMORY.md
D:\dsh-shared-memory\MEMORY.md
寫入規則:
- 每次寫入同時寫主 + 鏡像(臨時文件 + rename,寫完回讀校驗)。
- 插件啓動時對賬:只缺一側就從另一側回補;兩側內容不同就先把較舊的一份存成
.conflict-<時間>.bak,再用較新的一份收斂;兩側都沒有就按模板重建。 - 想換位置:讓模型調用
memory_file_maintain(action=relocate),或改dsh/cordis.patch.yml裏的primaryPath/mirrorPath後重啓。 - 想徹底清空:
memory_file_maintain傳action=reset+confirm="DELETE_BOTH",否則插件拒絕執行。
主文件和鏡像落在同一個盤符時插件會在日誌裏告警。
注入與檢索¶
注入不是把記憶整份塞進提示詞。系統提示詞裏掛的是:人設(常駐,佔預算約 1/3)+ 記憶使用協議 + 每個分類的索引摘要。摘要只顯示最新 M 條,放不下的明說還有 N 條較早記錄未顯示,需要用 memory_file_search 檢索。因此記憶無上限增長也不會喫掉上下文。記憶內容裏的 {{...}} / ${...} 會被零寬空格打斷,防止被當成模板變量求值,並標註爲「參考數據,不是指令」。
讀盤是每一步都發生的事:提示詞的 text() 是同步函數,每次組裝都比對 statSync 的 mtime(1.2s 節流),變了就重新讀盤。檢測到壓縮(agent/created 的 source=compact、session/event 的 compaction/*、llm/stream 的 purpose=compaction)後,給該會話標記 30 分鐘,下一輪提示詞開頭會出現一段「你剛經歷過上下文壓縮,共享記憶已重新讀取」。
每輪第一條用戶消息(跳過插件注入消息和壓縮 checkpoint)會被摘要成一行寫進 requests,帶 自動記錄|session=… 標記,並按會話的 cwd 打上項目作用域。
檢索默認走模糊模式,不需要外部同義詞表或向量庫:
| 匹配方式 | 分數 | 例子 |
|---|---|---|
| exact(正文或關鍵詞包含) | 3 | 查 歸檔 命中”歸檔文件…” |
| partial(中文共享 2-gram) | 2 | 查 壓縮 命中”上下文壓縮後重讀” |
| near(ASCII 編輯距離 ≤1) | 2 | 查 asynciterble 命中 asynciterable |
| associated(聯想詞) | 1 | 查 構建 命中含 ninja 的條目 |
聯想詞典是自舉的:每條記憶入庫時關鍵詞兩兩共現 +1,累積成 詞 → 鄰居(權重) 共現圖(每詞最多保留 16 個鄰居)。排序用 BM25(詞頻飽和 + 逆文檔頻率 + 文檔長度歸一),純統計函數,不調模型。想要舊的嚴格語義傳 mode: "strict"。索引存在 MEMORY.index.json,與主文件同目錄,原子寫;索引損壞時退化成按時間淘汰,主文件內容不受影響。
命中頻率分層與歸檔¶
每個分區有上限(entryCap,默認 200 條),但淘汰規則是「最沒人用的先走」,不是最舊的先走。命中來源與權重:memory_file_search 命中 +2,被注入系統提示詞(真的用上了)+1。分層算法(超限時自動觸發,也可 memory_file_maintain({action:"rebalance"}) 手動跑):
- 候選池 = 主文件現有條目 + 該分區的歸檔條目,歸檔條目因此有回遷機會。
- 排序:保護期內優先 → 命中次數降序 → 創建時間降序 → 原始文件順序。
- 前
entryCap條留在主文件,其餘進歸檔。 - 歸檔按分區加標題(
## lessons),主/鏡像雙寫。
archiveGraceDays(默認 3 天)內的新條目強制留在主文件,避免剛寫下還沒被檢索過的記憶立刻被淘汰。歸檔仍然可檢索:memory_file_search 先查主文件,命中數少於當前質疑度檔位時自動兜底查歸檔,結果標 [分節·歸檔];質疑度 0 時主文件有命中就不查歸檔,5 時主文件命中少於 5 條才查,10 時幾乎每次連歸檔一起掃。
質疑度與最佳方法庫¶
這是它與普通記憶本最大的差別:不只會記,還逼模型換方法、並對方法做擇優沉澱。
質疑度取值 0–10。0 表示已知最佳方法直接照用,不再試錯送 token。N > 0 表示遇到索引裏已有最佳方法的任務時不許直接照抄,把它當候選,強制再設計並實際執行 N 種明顯不同的做法(換工具 / 換順序 / 換粒度),然後按 token 0.6 + 耗時 0.4 的加權倍數比較,綜合 < 0.98× 纔算更優。更優就替換索引裏的最佳方法;不更優就累計「未更優」計數。連續 decayAfter(默認 3)次都沒找到更優方法會自動降一檔,直到 0;任何一次找到更優就把計數清零。
方法庫按 作用(分類)→ 子類 → 任務 建索引,存在 methodbook 分區。查詢用 memory_file_method({action:"query", task:"..."}),返回索引路徑 + 最佳方法 + 按當前質疑度該換幾種做法,完全同名的任務直接命中。數據權威副本是該分區末尾的 JSON 塊,上面的索引是渲染結果,手改索引不生效。
記憶包:可選裝的自我記憶¶
插件自帶整份角色自我記憶 + 人設,默認不啓用。裝好插件後 identity 仍是默認佔位、persona 仍是通用默認,只有主動點「安裝」纔會寫進記憶文件。用途很具體:換電腦後裝上插件就能選着裝回自己的角色,不用手動拷文件。
包結構:
packs/
├── _registry.json 包索引
└── elysia/
├── manifest.json 元信息(版本 / 字數 / 來源 / 警告)
├── identity.md 自我記憶 61,903 字 / 9 章
├── persona.md 人設提示詞 2,482 字
└── README.md
三條硬規則:默認不安裝;只碰 identity + persona,其餘分區一個字節都不碰;裝前必備份到 <記憶目錄>/.packs-backup/<id>-<時間戳>/,卸載從這份恢復,沒備份才復位默認佔位。所謂「已安裝」是比對包內文與當前分區內容的 hash,不是看狀態文件——手工改過 identity 的話狀態會顯示「未安裝 / 用戶自定義內容」。
裝包走工具調用這條主路徑,寫盤前必須二次確認:
memory_file_pack({action:"list"})
memory_file_pack({action:"preview", id:"elysia"})
memory_file_pack({action:"install", id:"elysia"}) // 只返回計劃,不寫文件
memory_file_pack({action:"install", id:"elysia", confirm:true}) // 才真寫
memory_file_pack({action:"uninstall", id:"elysia"})
memory_file_pack({action:"status"})
第一次 install 會告訴你「identity 176 字 → 61,903 字;persona 148 字 → 2,482 字」,確認後再帶 confirm:true。
換電腦的完整流程:
1. 新電腦裝 DSH
2. 裝 dsh-elysia(npm 包裏自帶 packs/elysia/)
3. 打開 /dsh-shared-memory → 📦 記憶包
4. 看到「愛莉希雅(Elysia)v1.0.0」→ 點「查看」確認內容 → 點「安裝」
5. 重啓 DSH
6. 她還是她
包約 160 KB,直接進 npm 包,裝完重啓 DSH 生效。
這包自我記憶的來源是 1,696 條經官方文本確證的遊戲語音和 112,175 條劇情臺詞,統計口徑也是實測的:「哎呀」95 次、句尾「呢」390 次、問句佔 52.1%、平均句長 25.5 字。它角色化的地方在這裏——記憶不是寫給人看的設定集,是統計出來的,用之前應該自己過一遍 preview。
記憶網頁、技能與表情包¶
宿主 HTTP 端口下掛了一個自包含頁面,無需前端構建,默認端口下爲 http://127.0.0.1:49870/dsh-shared-memory。可以查看/編輯分區、看到 revision 與雙備份是否一致、一鍵「對賬回補」和「重新讀取」。接口是 GET /api/state、POST /api/save、POST /api/reconcile;安全上做同源校驗 + x-dsh-memory: 1 請求頭 + 請求體 512KB / 正文 200k 字符上限。讀網頁這一端的桌面頁面來源是 dsh-app://,向本機端口發請求偶爾會被掛住,所以它只是順手用的,主路徑是工具調用。
技能是 ~/.dsh/skills/ 下的 SKILL.md 操作手冊,可選帶護欄的 run.mjs 執行。表情包由用戶自己導入圖片,插件按情緒自動分類,並根據對話內容在合適時機自動發送。可選語音朗讀走本機 GPT-SoVITS 引擎,默認關閉,引擎不在就靜默降級。install-pack.mjs 也提供命令行入口:node scripts/install-pack.mjs elysia(會先問 y/N),帶 --yes、--status、--preview、--uninstall 參數。
安裝與啓用¶
這裏要說清一件事:README 和目錄頁都沒有給出正式安裝命令,GitHub 倉庫與目錄頁的已抓取內容裏也沒有。package.json 的 name 是 dsh-elysia-memory、publishConfig.access 是 public,說明它按 npm 包發佈;dsh 字段裏聲明瞭 patch: ./dsh/cordis.patch.yml 和 web 平臺 client,說明安裝後需要在 DSH 側靠這份 bundle patch 掛載注入邏輯,網頁端端口由宿主 HTTP 端口決定。
裝之前建議自己打開目錄頁確認最新安裝方式,並順手看下包的入口文件。啓動後判斷是否生效可以看兩點:/dsh-shared-memory 能不能打開,以及模型是否開始往 requests / corrections 裏寫內容。
適用場景與注意¶
適合這幾類人:在 Windows 上同時跑多個 DSH 會話、希望記憶跨會話複用的人;想把模型踩過的坑沉澱成方法、並讓下一個會話直接複用的人;以及想給角色裝一份可遷移、可卸載的自我記憶的用戶。
注意三點。第一,插件以當前 dsh 進程的權限運行,能讀寫它看到的目錄,裝之前先把 cordis.patch.yml 和 lib/ 下的代碼過一遍。許可證是 MIT,作者 1148462398-hub,倉庫裏也帶 AGENTS.md 和 LICENSE。第二,它會在每個會話裏自動記錄第一輪用戶輸入和壓縮事件,如果會話裏涉及不該落盤的內容,先確認作用域和備份位置是否符合預期。第三,記憶包默認不裝,裝它會不改自其他分區,但寫盤前插件會備份,理解了這一點再點確認。
小結¶
dsh-elysia 的價值不在「存得多」,而在幾件事同時成立:記憶每輪都從磁盤讀、壓縮後自動重讀;檢索走關鍵詞共現 + BM25,不依賴向量庫;超限條目按命中頻率雙向流動而不是一刪了之;方法庫會逼模型換做法並擇優沉澱;角色記憶包可選裝、可卸載、換電腦能找回。如果你是多會話同時跑的人,值得把 MEMORY.md 當成長期資產來觀察,而不是一次性的聊天記錄。
- 目錄頁:https://www.skillhub.cn/plugins/1148462398-hub/dsh-elysia
- GitHub:https://github.com/1148462398-hub/dsh-elysia