前言¶
在 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 |
各層條數、待批准提案、數據目錄、當前配置 |
改核心人設必須走顯式協議,不能靠內隱層繞過:
- 用戶明確說「改核心人設」;
- 模型調用
layered_core(action="propose", file="persona", content="..."); - 模型把返回的 diff 給用戶看;
- 用戶明確授權後,模型才調用
layered_core(action="apply", proposal_id="corep_...", confirm="APPLY"); - 寫入前自動備份到
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)。
- 先備份(
$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)"
- 在
$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'。
-
重啓 DSH。首次啓動會自動創建
$DSH_HOME/layered-memory/。 -
編輯
$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。