dsh-kb:把會話知識沉澱成本地不可變事實卡

前言

在 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

兩套界面共用同一份數據:

  1. DSH 側邊欄 「記憶」 面板:樹 / 搜索 / 圖譜三視圖。
  2. 靜態 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 強調兩點:

  1. 文件是多幀 zstd;Node 的 zstdDecompressSync 一次只解第一幀,插件需按 magic 掃幀邊界逐幀解。
  2. 事件流中用於抽取的主要是:session header、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
羽毛球分组比赛记分
小程序二维码

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

小夜