dsh-layered-memory:DSH 四層記憶與本地遺忘調度

前言

在 DeepSeek Harness(DSH)裏給智能體加「記憶」,常見做法是整段對話塞進上下文,或用一個扁平庫檢索後注入。人設、偏好、長期事實和最近幾輪話混在同一層時,要麼 token 膨脹,要麼該硬的邊界被軟偏好覆蓋。下面介紹社區插件 dsh-layered-memory(維護者 yinling2024,分類:記憶):把記憶拆成四層,並配上審計與遺忘調度;反射、檢索、遺忘均爲本地確定性邏輯,不額外調用模型、也不要求額外 API key。

這是什麼

dsh-layered-memory 是給 DSH 的分層記憶插件。核心層默認只讀;內隱層記錄可塑偏好與策略;外顯長期層可檢索重要事件與事實;短期層自動寫入並在 TTL 後遺忘。插件版本 0.1.0(MIT),倉庫 yinling2024/dsh-layered-memory,目錄頁 skillhub.cn。實測兼容目標爲 DSH 0.2.1-rc.3(與 @deepseek-ai/dsh-tools / dsh-system-prompt 同版本)。

四層分別存什麼、怎麼用

層 存什麼 怎麼寫 怎麼用
核心層 身份、根本人設、安全邊界、授權規則 默認只讀;只能走 layered_core 提案 + 用戶授權 作爲系統硬約束注入,不參與普通檢索
內隱層 穩定偏好、表達風格、行爲策略、技能傾向 主模型用 layered_store(layer=implicit) 觀察;證據夠了才由本地反射晉升 作爲風格先驗注入,不陳述爲事實
外顯長期 重要事件、事實、約定 layered_store(layer=explicit) 或短期顯著片段晉升 每輪按相關度召回摘要;layered_search 查細節
短期 最近對話、任務中間狀態 自動寫入,TTL 過期 只注入顯著片段;過期前可晉升爲候選

橫切能力包括:審計(audit.jsonl)和遺忘調度(TTL、衰減、歸檔、回收站、刪除傳播)。只有主模型主動調用工具時纔會產生正常的工具調用開銷。

工具與核心層變更

插件註冊的工具如下。

工具 作用
layered_store 寫外顯長期或內隱傾向;外顯支持 factKey,同鍵只保留最新,舊條目標 superseded 但保留可審計
layered_search 按相關度、新近、重要度、置信度檢索外顯記憶;空 query 時用當前用戶消息
layered_forget 刪除一條外顯記憶;默認進回收站 30 天,hard=true 徹底刪除
layered_core list / propose / apply / rollback;apply 和 rollback 必須 confirm: "APPLY"
layered_status 各層條數、待批准提案、數據目錄、當前配置

改核心人設必須走顯式協議,不能靠內隱層繞過:

  1. 用戶明確說「改核心人設」;
  2. 模型調用 layered_core(action="propose", file="persona", content="...");
  3. 模型把返回的 diff 給用戶看;
  4. 用戶明確授權後,模型才調用 layered_core(action="apply", proposal_id="corep_...", confirm="APPLY");
  5. 寫入前自動備份到 core/versions/,可用 rollback 回滾。

提案默認有 30 秒冷卻(config.json 的 core.applyCooldownSeconds,設爲 0 會取消時間門,不建議)。

安裝與啓用

DSH 生態理念是「一切皆插件」;skillhub.cn 爲社區目錄,與 DeepSeek / 幻方無官方從屬關係。安裝前建議在 GitHub 閱讀源碼與 LICENSE,插件以當前 DSH 進程權限讀寫 $DSH_HOME/layered-memory/。

桌面版(推薦:profile patch)

桌面版沒有 dsh CLI 時,可在 profile 的 cordis.patch.yml 裏用絕對路徑加載(DSH 會轉成 file:// URL)。

  1. 先備份($DSH_HOME 換成你的 DSH home,桌面版常見 D:/dsh-data):
cp "$DSH_HOME/profiles/desktop/cordis.patch.yml" "$DSH_HOME/profiles/desktop/cordis.patch.yml.bak-$(date +%Y%m%d-%H%M%S)"
  1. 在 $DSH_HOME/profiles/desktop/cordis.patch.yml 末尾追加(路徑改爲你本機插件目錄下的 lib/index.js):
# === 分層記憶(dsh-layered-memory)===
- insert:
    - id: layered-memory
      name: '/absolute/path/to/dsh-layered-memory/lib/index.js'

Windows 可用正斜槓,例如 'D:/tools/dsh-layered-memory/lib/index.js'。

  1. 重啓 DSH。首次啓動會自動創建 $DSH_HOME/layered-memory/。

  2. 編輯 $DSH_HOME/layered-memory/core/persona.md、boundaries.md、authorization.md,填入核心人設與邊界;插件只讀這些文件,不會自動改寫。

可用環境變量 LAYERED_MEMORY_HOME 單獨指定數據目錄。

用 GitHub 安裝(可選)

dsh plugin --profile desktop add github:yinling2024/dsh-layered-memory

裝完重啓 DSH。也可在拿到插件目錄後,仍按上面 patch 方式加載。

Linux / 服務器

插件零外部依賴:將整個目錄放到服務器,在對應 profile 的 cordis.patch.yml 里加同樣的 insert(絕對路徑),重啓 DSH 即可。要求 Node >= 20。

數據目錄與配置要點

默認數據在 <DSH_HOME>/layered-memory/,含 config.json、audit.jsonl、core/、explicit/、implicit/、short-term/ 等。外顯正文在 explicit/entries/ 的 markdown,索引在 manifest.json;手工改正文或元數據後建議重啓 DSH(檢索索引有內存緩存)。

首次啓動自動生成 config.json。與 token 和行爲相關的常用項包括:

鍵 默認 說明
enabled true 總開關
prompt.recallMaxChars 900 每輪長期召回上限
recall.topK 5 每輪最多召回幾條
recall.alwaysFacts 2 每輪固定帶幾條高重要度語義事實(0 關閉,對成本影響大)
shortTerm.ttlMinutes 30 短期 TTL
implicit.minEvidence 3 內隱晉升所需證據數
explicit.trashDays 30 回收站保留天數
core.applyCooldownSeconds 30 核心提案 apply 冷卻

調低 prompt.recallMaxChars、recall.topK、recall.alwaysFacts 可省 token。

設計邊界與共存注意

  • 內隱記憶不能改核心;與核心衝突的寫入會拒絕。
  • 外顯寫入靠工具或顯著短期片段,不是每句對話都落庫。
  • 遺忘分階段:短期 TTL;外顯降權、歸檔、回收站,最後硬刪除;用戶說「忘掉」時用 layered_forget。
  • 同一 profile 若已有 dsh-fish-memory、dsh-memory 等注入式記憶插件,建議只留一套常駐注入,避免重複塞上下文。

自測

倉庫內可用 Node 內置測試:

cd dsh-layered-memory
node --test test/*.test.js

覆蓋外顯寫入/檢索、回收站、內隱反射、核心提案與冷卻、短期 TTL 等。

結尾

dsh-layered-memory 把 DSH 記憶拆成核心、內隱、外顯長期與短期四層,並用本地工具與配置控制寫入、召回與遺忘,適合需要可審計、可邊界的人設與長期事實分離的場景。詳情見目錄頁 https://www.skillhub.cn/plugins/yinling2024/dsh-layered-memory 與 GitHub https://github.com/yinling2024/dsh-layered-memory。

羽毛球分组比赛记分
小程序二维码

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

小夜