@max-null/dsh-memory:DeepSeek Harness 的跨會話明文記憶插件

前言

用 DSH 這類 harness 做智能體開發,常見困擾是會話之間什麼都沒留下:上一輪你告訴模型「本項目統一用 Vue3 <script setup>」,新開會話它就忘了。常見的補救是把記憶塞進向量庫、靠相似度檢索——代價是記憶本體變成一串不可讀的數字,過期信息藏在庫裏,觀測不到也修不了。

@max-null/dsh-memory 走的是另一條路:記憶全部是明文,檢索用確定性的 BM25,寫入要過人工確認閘門。下面介紹它的設計與用法。

這是什麼

@max-null/dsh-memory 是一個面向 DeepSeek Harness 的跨會話明文記憶插件,由 Max-Null 維護,MIT 許可證,當前版本 0.6.0。它屬於 @max-null/* 插件系列,與 SSID(思靈 · Seek Soul in Darkness)桌面體驗整合。

它遵循 DSH「一切皆插件」的理念:不修改 DSH 源碼,聲明 name / inject / apply,由 Loader 從 cordis.yml 加載。

核心設計:人是所有者

插件的設計原則可以概括爲三條:

  1. 人是所有者:模型只能寫入 suggested 狀態的記憶,永遠不能自我提升;只有人工確認(setStatus)才能讓記憶生效。
  2. 可觀測先於精準:每條記憶是明文,memory_list 隨時可見,memory_forget 隨時刪除,不存在「靜默暗礁」。
  3. 確定性且緩存安全:BM25 關鍵詞檢索是存儲的純函數,無 LLM 調用。

注意 approvedinjected 是兩個獨立狀態:確認生效是一回事,是否每輪常駐注入是另一回事,由獨立開關決定。

提供的服務、工具與注入

  • 服務 ctx.memoryremember / list / search / forget / setStatus
  • 工具memory_savememory_listmemory_searchmemory_confirmmemory_forgetmemory_update
  • 注入tool:memory 指引 section + memory:recall 召回 context
  • 檢索:BM25 關鍵詞檢索,CJK 單字 + 2-gram 切分,contentkeywords 字段分離加權

memory:recall 注入的是 global 與當前會話工作區裏 approved + injected 的記憶,逐條帶 [memory:<id>:<namespace>] 來源標記,以單行摘要進入 system prompt,並按注入預算截斷;超預算時按最近使用優先截斷,省略數在面板可見。memory_search 命中會更新 lastUsedAt 做冷熱追蹤。

兩層存儲

記憶按 namespace 分兩層物理存儲,各自落在獨立的明文 JSON:

namespace 默認位置 用途
global $DSH_HOME/storages/memory.json 跨項目的個人偏好
project <cwd>/.dsh/storages/memory_project_<hash>.json 跟隨倉庫的項目共識,隨 git 分享

幾個細節:

  • 兩個根都可用 config 覆蓋(globalRoot / projectRoot)。
  • memory_list / memory_search 不帶 namespace 過濾時同時查兩層。
  • 舊版雙重前綴文件名在打開時自動遷移爲規範名。

明文 + 落在項目文件夾內,意味着 project 層記憶能隨 git 提交分享給所有協作者,團隊共識可以沉澱進倉庫。

安裝與啓用

1、安裝:

npm install @max-null/dsh-memory

2、在 cordis.yml 加一條。記憶的存儲後端由插件自己註冊,storage / system-prompt / tools 等由宿主以 peerDependencies 提供:

- id: memory
  name: '@max-null/dsh-memory'

可選配置

cordis.ymlconfig 裏傳給插件,以下均可省略:

- id: memory
  name: '@max-null/dsh-memory'
  config:
    injectionBudget: 1500        # 常駐注入預算(字符;null = 不限制)
    summaryChars: 80             # 單條注入摘要截斷上限(字符)
    semanticTopK: 5              # 語義側參與融合的 topK(僅配置 embeddings 時生效)
    # embeddings: { embed(texts): Promise<number[][]>, similarity? }

缺省即純 BM25。語義融合是 0.5.2 引入的可插拔選項:配置 embeddings 後,memory_search 以 BM25 + 語義 RRF 融合,向量增量生成並持久化,嵌入調用失敗自動降級爲純 BM25。記憶本體仍是明文,向量只作爲檢索輔助字段(vector,明文可讀)。

典型使用流程

模型 memory_save     →  status: suggested(只是建議,未生效)
人 memory_confirm    →  status: approved(已審覈;是否常駐注入由獨立開關 injected 決定)
人(面板/開關)       →  injected: true(每輪注入,摘要化 + 預算截斷)
memory_search        →  關鍵詞/語義召回任意狀態記憶(命中標記 lastUsedAt)
memory_forget        →  隨時刪除

兩點說明:memory_search 不限狀態,任何狀態的記憶都能被召回,但只有 approved + injected 的記憶才進常駐注入;模型側從頭到尾只有「提議權」,生效與否始終由人決定。

提示詞模板庫(0.6.0)

0.6.0 新增提示詞模板庫,由四個工具管理:prompt_search / prompt_get / prompt_list / prompt_add

md 文件是唯一事實源:

  • global:~/.dsh/prompt-library/*.md
  • 隨工作區分享:<workspace>/.dsh/prompt-library/

模板存在即生效,source: agent 角標標識模型新增的模板;前端(記憶面板「模板」tab)與模型工具檢索的是同一份索引。提示詞模板永不注入 system prompt。

開發與驗證

如果你要參與開發或自行構建:

npm install
npm run typecheck   # tsc 嚴格類型檢查
npm test            # vitest 單測
npm run build       # 產出 dist/
node scripts/verify-loader.mjs   # 用 Loader 端到端驗證插件可加載

適用場景與注意

適合:

  • 希望智能體跨會話記住個人偏好與項目共識的 DSH 用戶
  • 團隊想把項目層共識隨 git 倉庫分享
  • 在意記憶可審計、召回可解釋,不放心向量黑盒的場景

注意:

  • 插件以當前 dsh 進程權限運行,可讀寫其存儲目錄。安裝任何第三方插件前,建議先檢查源碼與許可證(本插件爲 MIT)。
  • 語義檢索需要在 config 中提供 embeddings 實現,缺省爲純 BM25。
  • 社區插件目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-memory 把「記憶」從黑盒拉回明文:模型提議、人確認、BM25 確定性召回、每條可查可刪。如果你在用 DSH 且苦於會話間失憶,可以按上面的步驟接入試試。

  • 目錄頁:https://www.skillhub.cn/plugins/Max-Null/dsh-memory
  • GitHub:https://github.com/Max-Null/dsh-memory
羽毛球分组比赛记分
小程序二维码

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

小夜