dsh-kb: Consolidating Session Knowledge into Local Immutable Fact Cards

前言

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

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

Xiaoye