前言¶
在 DeepSeek Harness(DSH)裏做多輪開發,常見問題是:上一輪已經想清楚的結論,下一輪要從零複述;或者助手「記得」某件事,但經過摘要壓縮後細節跑偏,甚至把已被推翻的舊方案當成現行做法。社區插件目錄裏歸類爲「記憶」的 dsh-kb(維護者 MyRemme,倉庫 MyRemme/dsh-kb)針對的是後兩類失敗——失真與腐爛——而不只是「忘了就再搜一次」。下面介紹它的設計取捨、安裝方式與典型用法。
這是什麼¶
dsh-kb 是 DSH 的本地長期記憶庫:把每次會話裏「想明白的事」寫成不可變事實卡,用骨架樹做分類、關係圖做脈絡、FTS5 中文 bigram 做檢索。數據落在單個 SQLite 文件裏,只依賴 Node 內置的 node:sqlite 和 node:zlib,無額外原生服務。npm 包名爲 @myremme/dsh-kb(CLI 命令 dsh-kb),當前資料中版本爲 0.8.0,許可證 MIT,要求 Node >= 22.19.0,DSH 引擎 >= 0.2.0-rc.1。
設計上的核心分工是:fact 表是唯一真相;樹、圖、全文索引都是可重建的投影。作者 README 中明確:這套設計權重是 失真和腐爛 > 召回率——召回差一點可以換詞再查,記錯了會按錯誤結論去幹活。
核心功能¶
事實卡與三種投影¶
一行 fact 對應一條不可變事實卡。在此基礎上插件維護:
- node 骨架樹:多歸屬、摘要作緩存;
- edge 關係圖:一跳擴展、演化鏈(含 supersedes 等);
- FTS 索引:bigram + 覆蓋率精排,中文雙字詞可檢(README 說明 FTS5 的 trigram 分詞對 ≥3 字符才建索引,故需 bigram 預分詞)。
長期記憶的三種失敗方式及對應機制(資料原文表格):
| 失敗 | 表現 | 防它的機制 |
|---|---|---|
| 遺忘 | 問「上次那個怎麼弄的」,答不上 | 索引 + 檢索 |
| 失真 | 記得但記錯;摘要偏離原意 | 卡不可變 + 回指原文 + 摘要可重算 |
| 腐爛 | 舊結論仍被當成現行方案 | status + supersedes 邊 + 時間衰減 |
給模型用的工具¶
插件向 DSH 註冊以下工具(並在系統提示中注入記憶紀律,規定何時必須查、何時必須寫):
| 工具 | 作用 |
|---|---|
kb_search |
檢索;用戶說「之前/上次/我們說過/繼續」時優先調用 |
kb_add |
寫一條卡;一個可獨立陳述的結論 = 一條卡 |
kb_tree |
查看骨架樹:每枝卡數、最近更新、代表卡 |
kb_stats |
健康度:卡數、類型分佈、路徑分佈、邊數 |
kb_ingest |
增量吸收本機會話(冪等,可反覆跑) |
界面與 CLI¶
兩套界面共用同一份數據:
- DSH 側邊欄 「記憶」 面板:樹 / 搜索 / 圖譜三視圖。
- 靜態 HTML:
npx dsh-kb export產出單文件,不依賴服務,適合快照或面板異常時覈對數據。
給人和腳本用的是 dsh-kb CLI(見下文典型用法)。資料中還提到十個原生工具、十九個 /api/dsh-kb/* 端點,以及可投影成可 git 的 Markdown 目錄樹(package.json 描述),細節以倉庫文檔爲準。
從會話 ingest 的規則¶
kb_ingest 讀取 $DSH_HOME/sessions/<cwd-tag>/<session-id>/session.v*.jsonl.zstd。README 強調兩點:
- 文件是多幀 zstd;Node 的
zstdDecompressSync一次只解第一幀,插件需按 magic 掃幀邊界逐幀解。 - 事件流中用於抽取的主要是:
sessionheader、session/title、compaction/summary、user/message;過程類事件(如tool/call)不作爲知識來源。
抽取只做「已經寫在會話裏的事實」;「爲什麼」必須由模型當場用 kb_add 寫下,否則容易變成幻覺。README 給出的實測數據:219 個會話 / 225 MB 壓縮 / 6.9 秒 / 676 張卡 / 零錯誤(來源:項目 README,非第三方評測)。
檢索打分(純算,不用 LLM):召回走 FTS5(bigram) AND → 不足退 OR → 子串 LIKE → 圖 1 跳擴展;精排爲詞覆蓋率、標題命中、路徑對齊、新穎度等加權,並乘以 status、confidence、kind_bonus。
安裝與啓用¶
在 DSH profile 目錄安裝(資料原文命令):
cd ~/.dsh/profiles/desktop
pnpm add dsh-kb
裝完後插件自帶 cordis.patch.yml,重啓 dsh 即生效。也可手動插入配置:
- insert:
- id: dsh-kb
name: dsh-kb
config:
enabled: true
dbPath: "" # 留空 → $DSH_HOME/kb/kb.db
maxResults: 6
promptSection: true
環境變量:DSH_HOME(默認 ~/.dsh)、DSH_KB_HOME(默認 $DSH_HOME/kb)。
典型用法¶
初始化與從會話吸收¶
npx dsh-kb init
npx dsh-kb ingest [--limit N] [--rescan] # 掃 ~/.dsh/sessions/*.jsonl.zstd
在 DSH 會話裏,模型可在適當時機調用 kb_ingest 做增量吸收,或依賴上述 CLI 批量處理。
檢索與寫入¶
npx dsh-kb search "中文分詞 方案" -k 6
npx dsh-kb search "zstd" --path topic/dsh --json
npx dsh-kb add --title "結論" --body "正文" --path topic/dsh --kind decision
模型側與用戶說「繼續上次話題」時,應對齊 README 建議:先 kb_search,再按需 kb_add 沉澱新結論。
瀏覽與維護¶
npx dsh-kb tree topic --summary
npx dsh-kb stats
npx dsh-kb show f_0d06e6d4155a92
npx dsh-kb forget f_0d06e6d4155a92 # 標記失效,不刪
npx dsh-kb reindex
維護紀律(README):一條卡是否合格,取決於「下次會話在不知道上下文的情況下讀到它,能不能直接照做」;庫是否健康,則看能否回答「是什麼」「爲什麼」「何時放棄、換成什麼」「繼續上次能否找回原話(source_ref)」。
適用場景與注意¶
適合誰:長期在 DSH 上做同一倉庫或同一主題迭代、希望結論可審計、可遷移(SQLite 文件備份即可)、且不願引入向量庫或外部記憶服務的開發者。
生態背景:DSH 的理念是「一切皆插件」;社區目錄頁 skillhub.cn/plugins/MyRemme/dsh-kb 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
安全與權限:插件以當前 dsh 進程權限運行,會讀寫 $DSH_HOME 下的會話與知識庫路徑。安裝前請自行查看 GitHub 源碼 與 MIT 許可證,確認符合你的環境策略。
不是萬能記憶:純樹或純向量方案的侷限,README 已有討論;本插件刻意不指望 ingest 推斷「爲什麼」,需要你在對話裏顯式寫入 decision 類事實卡。
結尾¶
dsh-kb 把「誰做真相、誰做索引」講清楚:fact 賬本不可變,樹和圖隨時可重建,檢索針對中文 bigram 做了落地實現,並與 DSH 會話 jsonl.zstd 格式對齊。若你要在 Harness 裏建立可回溯、可失效標記的本地記憶,可從 profile 裏 pnpm add dsh-kb 起步,用側邊欄或 CLI 驗證數據是否符合你的維護紀律。
- 目錄頁:https://www.skillhub.cn/plugins/MyRemme/dsh-kb
- GitHub:https://github.com/MyRemme/dsh-kb