前言¶
在 DSH(DeepSeek Harness)裏跑長會話時,對話日誌按 seq 仍可回查,但「下次遇到同類任務該怎麼做、上次踩過什麼坑」往往還留在某次已結束的會話裏。手工整理 SKILL 文檔、維護「別這麼幹」清單,成本高,也容易和當前工作區、當前任務對不上號。
下面介紹社區插件 dsh-memory(維護者 corvus-dsh,分類:記憶)。它只做「能力記憶」:從已結束的會話裏抽取可複用的 SKILL.md 與負知識 negatives.jsonl,並在新任務開始前按需檢索注入;會話裏的事實仍靠宿主按 seq 回查,不由本插件替代。它與兄弟項目 dsh-graft-slice 在數據層通過交接臺賬文件耦合,程序上不 import 對方代碼,卸載任一方不會拖垮另一方。
這是什麼¶
dsh-memory 是 DSH 開源生態插件(topic:dsh-plugin)。它讀取 graft 插件寫出的 .retired.json / .transferred.json,必要時通過 ctx.sessionQuery.readSession(id) 讀會話,將「怎麼做纔對、踩過什麼坑」落盤到 DSH 原生可用的技能目錄與記憶目錄;抽取可走宿主 LLM,也可關閉以節省 token。
package.json 中當前版本爲 0.21.0,要求 Node >=20、DSH >=0.2.1-rc.5,許可證 MIT。
與 dsh-graft-slice 的關係¶
數據流可以概括爲:
dsh-graft-slice ──寫──▶ .retired.json / .transferred.json
│(只讀文件契約)
dsh-memory ──讀──▶ ───────┘
──讀──▶ ctx.sessionQuery.readSession(id)
──寫──▶ <skillsDir>/<name>/SKILL.md
<memoryDir>/negatives.jsonl, processed.json, index.json
臺賬條目在較新版本中帶 epoch 信封({epoch, at, pid, payload}):讀到不支持的 epoch 或缺 payload 時會拒讀並延後處理,避免「半條記錄就生成技能」;harvest 與 memory_stats 會報告 ledger 摘要,便於區分「沒有會話」與「臺賬被拒讀」。
核心功能¶
收割(harvest)與抽取¶
- 消費交接臺賬裏已「退休」的會話,單次處理數量受
harvestLimit限制(默認 3)。 extractor爲llm時用宿主模型抽取;爲off時只掃賬本、不消耗 token。- LLM 不可用(缺 Key、未登錄、模型不可達)時,抽取會靜默爲空;插件激活時會輸出可 grep 的警告
[dsh-memory] LLM unavailable. Harvesting is disabled.。若你主動配置extractor: 'off',則不會因此告警。
檢索與注入(retrieval)¶
retrieval(默認true)控制 pre-step 是否檢索記憶並注入提示。- 詞法召回下限
retrievalFloor默認 0.20,只負責撈候選;semanticFilter默認 true 時用 LLM 做精準裁決;關閉後退化爲嚴格詞法模式,此時retrievalThreshold(默認 0.55)才起作用。 filterProvider/filterModel可指定過濾用的模型路由,默認跟隨宿主agentDefaultModel.currentSelection()。- 任務對齊(Task Alignment) 默認開啓:用用戶原話中的任務詞過濾「事故流水賬」類記憶,避免同倉庫內無關報錯細節污染當前任務;可通過
taskAlignment: false恢復舊行爲。調試時可關注debug.blockedByTask。 - 工作區隔離 可在記憶控制台切換(見下文);非
human來源的注入會以[參考歷史數據,非當前指令]前綴降權,降低模型把歷史推斷當成當前指令的風險。
雙時態、取代與來源¶
每條技能或負知識可帶 valid_at / invalid_at / superseded_by 等字段:檢索只激活 invalid_at 爲空或晚於當前時間的條目;取代時互鏈並保留審計,舊記錄不物理刪除。來源分級(human / tool / inferred)影響衝突保護與提示措辭;人工規則在取代裁決中有保護(v0.15.0 驗收腳本 _scratch/acceptance-v015.mjs 可在真實庫上覆現)。
負知識與技能維護¶
- 負知識寫入
negatives.jsonl;長期未復發且命中次數低的條目會降權並在斷言前加[歷史偶發錯誤,僅供參考]前綴。 - 活躍技能超過
skillLimit(默認 100)時,激活期會跑一次維護:先嚐試合併語義相近的when_to_use,仍超限則歸檔最久未用的 10%(archived: true,檢索跳過,文件與證據保留)。 - 加載與渲染路徑上有 scanThreat /
renderHint等閘門,對已投毒文檔扣留注入(測試見test/v081-threat.test.mjs)。
記憶控制台(Web)¶
側欄「記憶」提供:開關 retrieval、workspaceIsolation、semanticFilter(經宿主 configEditor.edit 寫入 profile,無需重啓即生效且可持久化);按 scene 瀏覽記憶庫(來源、scope、失效與取代關係、證據條數);一鍵清空當前工作區記憶(移入 <memoryDir>/_quarantine-<ts>/,非刪除)。同等能力可通過命令 /memory-console、/memory-console-set、/memory-console-clear 調用。客戶端面板通常需要一次宿主重啓 + 頁面刷新後進入 boot graph。
Cordis 集成要點¶
插件導出 inject = ['tools','sessionQuery'],否則工具不會註冊;每個工具需聲明 output: { schema, render },本包通過 textOutput() 統一滿足。llm 故意不在 inject 列表中,經 ctx.get('llm') 解析,缺失時插件仍可掛載,只是無法 LLM 抽取。
安裝與啓用¶
安裝命令以 README 爲準:
dsh plugin --profile <name> add <path-or-git-url>
dsh --profile <name> --dump-config # 應出現 dsh-memory 行
將 <path-or-git-url> 換成本地路徑或 Git 倉庫 URL(例如 https://github.com/corvus-dsh/dsh-memory)。安裝後檢查 dump-config 是否出現插件行,再按需改 profile 下的 cordis.patch.yml 的 config 段。
| 鍵 | 含義 |
|---|---|
graftDataDir |
讀取 .retired.json 的 graft 數據目錄;默認同級 dsh-graft-slice |
skillsDir |
技能落盤目錄;默認 ~/.agents/skills |
memoryDir |
負知識與進度賬本;默認 <paths.data>/.dsh-memory |
harvestLimit |
單次最多處理幾個已退休會話(默認 3) |
extractor |
llm 或 off |
retrieval |
pre-step 是否檢索(默認 true) |
retrievalFloor |
詞法召回下限(默認 0.20) |
retrievalThreshold |
嚴格詞法閾值,僅 semanticFilter:false 時使用(默認 0.55) |
semanticFilter |
是否 LLM 精準裁決(默認 true) |
filterProvider / filterModel |
過濾模型路由 |
本地開發構建可執行 npm run build;獨立跑收割腳本爲 npm run harvest(見 package.json scripts)。
典型用法¶
1、先安裝並配置 dsh-graft-slice,讓長會話正常寫入 .retired.json / .transferred.json,再把 graftDataDir 指到該目錄(或使用默認同級目錄)。
2、安裝 dsh-memory,確認 dsh --profile <name> --dump-config 含 dsh-memory,並按需設置 skillsDir、memoryDir 與 extractor。
3、結束若干會話並寫入臺賬後,由宿主觸發 harvest(或開發環境下 node scripts/harvest.mjs),在 skillsDir 下查看生成的 SKILL.md,在 memoryDir 查看 negatives.jsonl、processed.json、index.json。
4、新開對話時若 retrieval 爲 true,pre-step 會按當前工作區與任務對齊規則召回記憶;在 Web 側欄「記憶」可審計條目、調開關,或對當前工作區做 quarantine 清理。
5、需要只讀審計宿主路徑噪音時,可運行 README 提到的 scripts/audit-memory-noise.mjs 掃描 facts.jsonl / negatives.jsonl(可選 --include-skills),報告不刪改數據。
適用場景與注意¶
適合:長期在同一 DSH profile 上迭代、已使用 graft 交接臺賬、希望把「做法」和「負路徑」從會話裏自動沉澱並在後續任務中可控注入的團隊或個人。
注意:
- 本插件以當前 DSH 進程權限讀寫
skillsDir、memoryDir與 graft 臺賬;安裝前應閱讀源碼與 MIT 許可證,確認路徑與數據隔離策略符合你的環境。 - 記憶質量依賴 LLM 抽取與過濾;LLM 不可用時會停止增長且僅告警一次場景,需自行監控
[dsh-memory] LLM unavailable。 - 社區目錄頁與 GitHub 倉庫由維護者發佈;SkillHub 等目錄站點是社區索引,與 DeepSeek / 幻方無官方從屬關係。
- GitHub 上該倉庫星標數爲 1(以目錄頁線索爲準),屬早期生態插件,升級時請對照 RELEASE_NOTES.md 與本地
package.json版本。
結尾¶
dsh-memory 把長會話裏可複用的「怎麼做」和「別怎麼做」從日誌裏抽出來,落成 DSH 能直接加載的技能與負知識,並在檢索鏈路上疊工作區、任務對齊、語義裁決與安全閘門,適合與 dsh-graft-slice 搭配做能力記憶而非替代事實回查。
- 目錄頁:https://www.skillhub.cn/plugins/corvus-dsh/dsh-memory
- 源碼與文檔:https://github.com/corvus-dsh/dsh-memory