前言¶
在 DeepSeek Harness(DSH)裏做多輪對話或輕量編程時,上下文窗口會隨會話結束而清空;換窗口、換工作區後,模型也拿不到上一段對話里約定好的偏好和事實。常見做法是手寫 system prompt 或在外部筆記裏維護狀態,但那樣要麼每次手動粘貼,要麼和 Harness 的會話生命週期脫節。
下面介紹社區插件 dsh-memory(GitHub:2424830124/dsh-memory,npm:@huai_xin/dsh-memory)。它把長期記憶做成磁盤上的 YAML「筆記本」,按標題樹組織,並在組裝提示詞時整份注入;模型通過插件提供的工具讀寫記憶,多會話之間共享同一份文件,並在別處改動後向當前會話推送合併後的、不喚醒的變更通知。另帶按日期的日誌(短期記憶)和可替換 Harness 開場身份的 Markdown 預設。
這是什麼¶
dsh-memory 是分類爲「記憶」的 DSH 插件,維護者 GitHub 用戶 2424830124。一句話定位:給 DeepSeek Harness 用的跨會話長期記憶,結構由用戶自己在 YAML 裏定義,而不是插件寫死的字段表。
它在設計上有兩個明確取捨(README 原文表述):不做自動召回——每次把可見記憶文件整份放進提示詞,不檢索、不算相關性;原因是召回錯誤容易把模型帶偏,且當前記憶體量通常能塞進上下文。真正強調的能力是可自定義結構:file_name、desc、format、標題樹、inject_ignore 都寫在文件自身,改結構不必改插件代碼或全局配置。
記憶在 Global(~/.dsh/dsh-memory/.memory)與 Workspace(<workspace>/.memory)兩個作用域之間劃分;路徑不可在配置裏改位置,只能通過 DSH_HOME 整體遷移,避免寫錯路徑 silently 讀到別處。
核心功能¶
記憶注入與多會話同步¶
- 記憶文件爲 YAML,插件注入到提示詞前綴;模型可用 memory_read / memory_edit / memory_manage(README 中統稱「三個工具」)讀寫,寫前須先讀,並帶版本校驗,避免覆蓋其他會話的併發修改。
- 其他會話修改記憶後,本會話只收到「哪些標題變了」類通知;需要細節時再讀文件。空閒會話在下一條消息時檢查累積變更;正在運行的會話約每 5 秒檢查一次(最多每 5 秒一條提醒)。
- 按會話凍結注入:會話開啓期間,注入文本與
memory_edit的工具描述凍結,文件在外部再怎麼變,本會話拼出的提示詞前綴不變,以便供應商前綴緩存持續命中;變更走通知。閒過保留窗口(默認 60 分鐘,由snapshotTtlMinutes等配置參與,默認快照保留 10080 分鐘即 7 天)後重新生成。
日誌與預設¶
- 日誌:
log/下一天一個 YAML,二級標題爲「時分 + 摘要」,用於記「今天發生了什麼」;可通過injectLog、logInjectGlobalDays等配置控制最近幾天、每天條數是否注入。 - 預設:
preset/*.md純文本,選中後整體替換提示詞最開頭的 harness identity(默認那句You are an AI agent powered by DeepSeek Harness.)。人設、行爲準則等開場文本放預設,不必擠進記憶文件;預設不受inject_ignore與三個記憶工具約束。
面板¶
對話區頂部「記憶」標籤頁含 預設 / 全局 / 工作區 / 設置。全局與工作區側以卡片編輯 YAML 內容樹、預覽「注入效果」、拖動調整同層標題順序與注入順序(fileOrder);設置頁寫入 ~/.dsh/dsh-memory/config.yaml,保存後當場生效(手改該文件需重啓 Harness)。
常見搭法(來自 README 表格)¶
| 想記什麼 | 大概長什麼 |
|---|---|
| 長短期記憶 | 一份「長期記憶」存穩定事實;當天先寫日誌,隔幾天再摘要進長期 |
| 行爲準則 | 一份「行爲準則」,一級標題分場景 |
| 角色設定 | 一份「角色」或每角色一文件,format 裏寫清邊界 |
| 學習感悟 | 一份「感悟」,二級標題一條,keyword 打標籤 |
| 備忘錄 | 一份「待辦」,inject_ignore 跳過 update_at、keyword |
經驗:一個文件一種用途,把必須每輪看到的準則單獨放前面,偶爾翻的備忘錄另起文件,便於 fileOrder 與 inject_ignore 按文件生效。
安裝與啓用¶
插件以 npm 包形式安裝,並在 profile 裏掛載 bundle 補丁。官方 README 給出的步驟如下。
先安裝包:
npm install @huai_xin/dsh-memory
在 profile 配置中加載 cordis.patch.yml(只掛載插件,不在此寫業務配置值):
# cordis.patch.yml —— 只掛載插件,不寫配置值
- insert:
- id: memory
name: '@huai_xin/dsh-memory'
運行時依賴 yaml 與 @deepseek-ai/schemastery。若跟源碼開發,可將 node_modules 內包換成本地鏈接(如 npm install ../dsh-memory 或 link: 依賴),無需每次發版。
當前 package.json 中版本爲 0.3.7,許可證 MIT。插件在 DSH 進程權限下讀寫上述目錄,安裝前請自行查閱倉庫源碼與許可證。
配置與數據目錄¶
配置優先級:~/.dsh/dsh-memory/config.yaml > profile 裏插件配置 > 內置默認。
主要路徑:
~/.dsh/dsh-memory/config.yaml # 配置
~/.dsh/dsh-memory/.memory/*.yaml # Global 記憶
~/.dsh/dsh-memory/preset/*.md # 預設
~/.dsh/dsh-memory/state/sessions/ # 會話快照
<workspace>/.memory/*.yaml # Workspace 記憶
部分配置鍵(默認值見 README 表格):
| 鍵 | 默認 | 說明 |
|---|---|---|
snapshotTtlMinutes |
10080 |
會話快照保留分鐘數;0 關閉清理 |
logSummaryMaxChars |
60 |
日誌摘要字數上限 |
injectLog |
true |
是否把最近日誌注入提示詞 |
logInjectEntries |
0 |
每天最多注入條數;0 不限 |
logInjectGlobalDays |
3 |
全局日誌帶最近幾天 |
defaultPreset |
'' |
新建會話默認預設名;空爲不使用 |
fileOrder 在面板左側拖動文件順序維護,不在設置頁手寫。
典型用法:記憶文件骨架¶
新建 Global 或 Workspace 記憶時,YAML 形狀如下(字段含義以 README 爲準):
meta_data:
file_name: 我的記憶
desc: 記錄我和用戶之間的一些回憶,以及我想要記住的事
format: |
寫這個文件放什麼、什麼時候該更新、更新成什麼樣。
這段只出現在 memory_edit 的工具描述裏,不進提示詞。
scope: Global
inject_ignore:
- update_at
- keyword
data:
我們經歷過的一些事:
update_at: 2026-10-27T03:18:36+08:00
desc: 一級標題的正文
keyword: [回憶]
我們之間的互動:
desc: 二級標題的正文
注意:正文行不得以 # 開頭,否則會被誤解析爲標題;建標題應通過工具的 heading_path(如 # 標題 > ## 子標題)操作。標題最多 4 級,同級不可重名。
日誌文件由插件按日生成,一級標題固定爲當天日期;模型寫日誌時須使用 # yyyy-mm-dd > ## hh:mm 摘要 這一路徑形狀。
預設示例:在 ~/.dsh/dsh-memory/preset/ 放置 角色.md,在面板或新建會話下拉框選用;切換預設可能破壞前綴緩存,面板會對進行中的會話給出確認提示。
適用場景與注意¶
適合:聊天、角色扮演、需要在多窗口/多工作區之間共享穩定事實與偏好的輕量編程;願意自己設計 YAML 標題樹而不是依賴向量召回的場景。
不適合或需知:不做語義檢索,記憶變大後主要靠整份注入(README 提到未來可能加關鍵詞輕量召回,但主路徑仍是整份注入)。插件不自帶預設內容,裝好後 preset/ 爲空。Community 目錄頁(SkillHub)與 GitHub 倉庫由維護者發佈,與 DeepSeek / 幻方無官方從屬關係;DSH 生態理念是「一切皆插件」,本文安裝與行爲均以倉庫 README 與 0.3.7 包描述爲準。
結尾¶
dsh-memory 把跨會話記憶落在可讀寫的 YAML 與可選預設上,用整份注入和多會話通知換結構自由度與實現簡單性。若要查看簡介與分類,可打開社區目錄頁;細節、Issue 與源碼在 GitHub 倉庫。
- 目錄頁:https://www.skillhub.cn/plugins/2424830124/dsh-memory
- GitHub:https://github.com/2424830124/dsh-memory