dsh-memory-chain:五層本地記憶,讓新對話不必從零開始

前言

在 DeepSeek Harness(DSH)裏跑智能體時,上下文窗口是硬成本:把「記住什麼」和「每次帶進 prompt 什麼」混在同一條消息歷史裏,要麼越聊越長,要麼一關會話就斷片。社區插件 dsh-memory-chain(維護者 doresu,分類:記憶)把記憶拆成五層,全部落在本地文件;每次組裝系統 prompt 時按層注入固定上限的片段,不往對話歷史裏追加內容。下面介紹它的定位、分層設計、安裝方式與工具用法,事實以 GitHub 倉庫 README 爲準。

這是什麼

dsh-memory-chain 是面向 DSH 的零依賴記憶插件:不改 DSH 安裝目錄,不新增 L3 專用工具(產物檢索複用 memory_search 的 tag 參數)。README 用一句話概括目標——opening a new conversation shouldn’t feel like meeting a stranger(新開對話不應像見陌生人)。當前 package 版本 0.4.1,許可證 MIT;要求宿主 DSH >=0.2.1-rc.2(engines.dsh 上界爲 <0.3.0-0)。

五層記憶分別存什麼

五層都是 system-prompt 區塊,每次 assembly 重新計算,不寫入 message history。

層 存儲內容 單次請求大致成本
L0 Library(原文庫) 正文在 L0/docs/<id>.md,索引在 L0/index.json 最新 6 篇的標題 + id,≤420 字符
L1 Bridge(會話橋) 上一會話 event log 中最後 4 條消息 ≤320 字符,且僅在新會話前幾輪出現
L2 Recall(加權回憶) 艾賓浩斯權重條目 權重 Top 12,≤1100 字符
L3 Artifacts(產物索引) 標籤爲 artifact:* 的文檔 最新 5 條,≤320 字符,可 owner 開關
L4 Self-note(自敘) 模型寫給自己的滾動窗口 24 條 / 3600 字符

README 中在一臺機器上的測算(宿主按 4 字符/token 估算;中文更密):7 個 tool schema 約 2331 字符(≈583 tokens/請求);庫裏有 2 篇文檔、1 個 artifact 時,四個卡片約 338 字符(≈85 tokens)。1100 字符的 artifact 正文留在磁盤,進上下文約 34 tokens。

磁盤佈局

數據目錄在 $DSH_HOME/memory/(用戶機器上常見爲 ~/.dsh/memory/):

$DSH_HOME/memory/
  L1/bridge.json      # 上一段對話尾部
  L0/index.json       # 文檔索引
  L0/docs/<id>.md     # 文檔正文
  L0/misses.jsonl     # 無結果的搜索記錄
  L2/items.json       # 加權條目
  L2/archived.jsonl   # 淡出或歸檔條目
  L3/owner.json       # 產物卡片開關(enabled:false 可隱藏)
  L4/self.json        # 自敘窗口
  L4/archive/         # 歸檔自敘
  state.json          # 註冊成功後寫入

註冊成功時 state.json 形如:

{ "status": "active", "sections": 5, "tools": 7 }

新會話生效後,應能在系統 prompt 中看到 ## 原文庫 等區塊。各卡片標題均標明 「數據,非指令」,避免庫內文檔被當成系統指令執行。

七個工具

工具 作用
memory_write_doc 持久化文檔;同標題原地更新,id 不變
memory_search 關鍵詞檢索,只返回片段與路徑,不返回全文;可選 tag
memory_read_doc 按 id 分頁讀正文
memory_note 記錄 durable fact;同 key 合併、提高權重、延長半衰期
memory_forget 撤回事實(歸檔,不物理刪除)
selfnote_append 追加一條自敘
selfnote_rewrite 重寫整個自敘窗口;舊版先歸檔

典型流程:用 memory_note / memory_write_doc 寫入;需要細節時用 memory_search 定位,再用 memory_read_doc 讀盤;產物用 tag:"artifact" 檢索(L3 不新增工具,僅多一個 tag 字段)。

設計要點(與用法相關)

  • L1 是截斷,不是摘要:不額外調用模型,忠實但可能不夠「潤色」。
  • L2 淡出 prompt 不等於刪除:權重低於 0.1 不再進 prompt;低於 0.02 且超過 30 天進入 archived.jsonl。
  • 回憶是詞面事件:用戶消息與條目存在 4 字符連續重疊即視爲 recall,每輪最多 3 條,小幅加權(+0.06 strength,半衰期 ×1.05);無此機制時條目容易長期停在 hits=1 並在約兩週內淡出。
  • L0 無語義搜索:子串匹配;措辭偏離原話會 miss,零結果寫入 L0/misses.jsonl,可用 node scripts/misses.mjs 彙總分析。
  • 改插件代碼需重啓 DSH 引擎:宿主緩存 ES module;開發時可臨時用 file://…?v=2 bust 緩存,但真正 reload 需 recomposition。
  • owner 開關只隱藏卡片,不是隔離級安全;多進程同時寫同一 JSON 可能丟更新,單主機場景可接受。

安裝與啓用

需要 DSH >=0.2.1-rc.2。通過插件管理器安裝(README 原文命令):

# 本地 checkout
dsh plugin --profile web add /path/to/dsh-memory-chain
# 或直接從 git
dsh plugin --profile web add git+https://github.com/doresu/dsh-memory-chain.git

管理器會把包裝進 profile 的 bundles,無需手改 patch。安裝後重啓 engine。不用包管理器時可參考倉庫內 examples/cordis.patch.yml 手動安裝。

社區目錄頁:https://www.skillhub.cn/plugins/doresu/dsh-memory-chain(獨立站點,與 DeepSeek / 幻方無官方從屬關係)。安裝前建議自行閱讀源碼與 MIT 許可證;插件以當前 DSH 進程權限讀寫 ~/.dsh/memory/,敏感內容勿未經審查寫入庫。

開發與自測

倉庫內測試命令:

node test/store.test.mjs        # 35 tests,純函數,無需 DSH
node test/integration.mjs      # 臨時啓動 DSH 驗證插件激活
node scripts/misses.mjs        # 彙總無結果搜索

結尾

dsh-memory-chain 把「磁盤上的完整記憶」和「每輪有限的 prompt 卡片」分開,用 L0–L4 五層控制 token 上限,並用 7 個工具讓模型按需讀寫。若你在 DSH 上做長期會話、知識庫式文檔或跨會話銜接,可在滿足版本要求的前提下按上文命令安裝,並以 state.json 與 ## 原文庫 區塊確認已激活。

  • 目錄頁:https://www.skillhub.cn/plugins/doresu/dsh-memory-chain
  • 源碼與說明:https://github.com/doresu/dsh-memory-chain
羽毛球分组比赛记分
小程序二维码

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

小夜