dsh-memory:把長會話沉澱成可複用技能與負知識

前言

在 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
羽毛球分组比赛记分
小程序二维码

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

小夜