用 dsh-kb-sieve 给 DeepSeek Harness 做可审计的本地知识库

前言

给智能体接一份项目规范、产品手册或者标准条文,最常见的做法是把文档塞进向量库,再靠语义检索往上下文里灌。这条路在问答场景里好用,但有一类需求它并不擅长:你要的不是“看起来相关”,而是能指出原文在哪一节、同一句话每次检索结果都一样,并且整份知识包可以离线带走、事后核对。

DeepSeek Harness(dsh)把模型、工具、技能、会话都做成插件,社区里也因此出现了不少记忆类扩展。其中一部分走图谱或会话沉淀,另一部分则更接近传统全文检索。dsh-kb-sieve 属于后者:它不把文档交给外部向量服务,而是在本地抽出原文、建成 SQLite FTS5 索引,再让模型按“先检索、后精读、再引用章节”的流程作答。

本文依据插件目录页、GitHub 仓库 README 与源码交叉核对后整理,介绍它解决什么问题、三个工具怎么配合,以及安装时需要注意的边界。文中提到的社区插件目录是独立站点,与 DeepSeek / 幻方没有官方从属关系,不宜把它理解成官方应用商店。

这是什么

dsh-kb-sieve 是一款面向 DeepSeek Harness 的记忆插件,由 omdsh-dev 维护,npm 包名为 @dsh-external/dsh-kb-sieve。仓库当前版本为 0.1.0,主要语言是 TypeScript,许可证为 Apache-2.0。目录页与 GitHub 均显示 2 颗星。

它做的事情可以收成一句话:把 .md / .txt / .docx / .pdf 做成可审计的知识包——一边留下 references/ 里的原文,一边用 SQLite FTS5 做本地检索。构建过程不调用大模型,同样的输入会得到同样的产物。

仓库把自己定位成“DSH 版 kb-sieve”。原版生成的 skill 会附带 Python kbtool 脚本、包装器,以及可选的 PyInstaller 二进制;本插件把检索和精读搬进 TypeScript 工具,生成出来的 skill 只剩数据:SKILL.md 指令、references/ 原文和 kb.sqlite,不再依赖 Python 运行时。

三个工具分别干什么

插件只注册三个工具,不改 agent 循环、TUI 或系统提示词。源码里的 inject 只有 tools,也就是等工具注册服务就绪后挂上能力。

1、kb_build:文档变成知识包

必填参数是知识库名 name(小写字母、数字、连字符)和输入路径数组 inputs。可选参数包括输出父目录 out、显示标题 title、是否全量重建 force,以及抽取并发 workers(默认 4,范围 1–8)。

默认输出位置不是用户主目录下的全局 skill 目录,而是当前项目根(向上找到最近的 .git,找不到就用当前工作目录)里的 .dsh/skills/<name>/。这正是 DSH 会监听的 skill 根目录:构建完成后,下一轮对话里模型就能在 skill 目录中看到这份知识库。

force 缺省为 false。仓库 README 后半部分和 src/index.ts 都写明:已有 build_state.json 时按源文件字节指纹和抽取文本指纹做增量,文档会落入 unchanged / changed / new / removed 四种状态。需要整包重做时再把 force 设为 true。README 里有一张“与原版差异”对照表仍写着 v1 不做增量,这和同一份 README 的增量说明、以及当前源码不一致;以源码和更具体的增量段落为准。

抽取侧有几条实现细节值得单独记下:

  • .md 按原文读入;.txt 会做标题推断(下划线标题、章节号、短行启发式)。
  • .docxfflate 解 OOXML,读取 w:p / w:t,并识别 Heading1–6 或“标题 N”样式。
  • .pdf 不内置解析器,而是调用系统里的 pdftotext -layout(poppler-utils)。PATH 上没有这个命令时,构建会失败,需要先安装 poppler,或把 PDF 转成 TXT/MD 再导入。

构建按文档流水线进行:抽完一份就落库释放。README 给出的量级是:32MB 文档构建峰值大约 0.6–2GB;内存紧张时把 workers 调小。SQLite 写入按 5 万行分批提交。

2、kb_query:确定性检索

必填参数是知识包路径 pack 和查询词 query。可选 limit(默认 10,最大 100)和 doc_ids(逗号分隔,用来限定文档范围)。

检索链路是词法的,没有向量、也没有随机性:FTS5 BM25(标题权重 10、正文权重 1)→ 标准号 / 章节号 / 型号一类精确标识符匹配 → 文档类型加权 → 窗口密度重排 → 返回 doc_id、行号、匹配行、score。结果带 statushigh_confidenceneeds_verificationno_hits。查询词明显越出语料域(例如库里不存在的标准号,或绝大多数词都不在文档里)时,会给出 no_hitsoos_reason

行号只给后续 kb_read 定位用。生成的 SKILL.md 明确要求模型回答时引用章节名(例如「第 D21.3 节」),不要把内部行号报给读者。

3、kb_read:按章节精读原文

必填是 packdoc_id。常见模式包括:

  • around:读某行所在的完整章节,可用 expand 扩到相邻章节;
  • sections:输出文档地图(标题 + 行号区间);
  • find / after:从指定行向后搜关键词;
  • jump:跳读多段,例如 "210-230,450-460"
  • start / count:按范围读取。

tokens 用来在输出里标记命中词。kb_read 会拒绝路径穿越;kb_build 的输入、输出路径都相对当前工作目录解析。

知识包里有什么

一次成功的构建会得到大致如下的目录:

<pack>/
├── SKILL.md
├── manifest.json
├── kb.sqlite
└── references/<doc_id>/
    ├── doc.md
    ├── metadata.md
    └── structure_report.json

SKILL.md 是给模型看的说明书:先 kb_query,再拿 doc_id 和行号去 kb_read,结论必须落到 references/ 原文的章节标题上;连续两轮 no_hits 就应停止,不要编造。manifest.json 列出全部文档的 doc_id、标题、路径和哈希。kb.sqlite 里是文档表、external-content FTS5,以及行级二级索引(line_text / line_rowmap / line_fts)。当前源码里的索引布局版本是 3INDEX_VERSION),旧包在查询时可能带 warning,下次构建会按 build_state.index_version 触发一次全量重建。

kb_query / kb_read 读的是 kb.sqlitereferences/。仓库说明 schema 与原版 Python kb-sieve 产物一致,因此原版已经构建好的知识包可以直接拿来查,不必先用本插件重做一遍。没有行级索引的旧包会回退到全文扫描路径。

安装与启用

目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:

dsh plugin add github:omdsh-dev/dsh-kb-sieve

需要可复现安装时,按目录页的写法固定 commit 哈希:

dsh plugin add github:omdsh-dev/dsh-kb-sieve#<commit>

<commit> 换成仓库里的具体提交。dsh CLI 会从 GitHub 解析插件并装进当前配置。

仓库 README 还补充了按 profile 安装的方式:把插件装进 tui / headless / web 或自建 profile,然后用对应 profile 重启,使 kb_build / kb_query / kb_read 注入生效。卸载时使用包名 @dsh-external/dsh-kb-sieve。需要本机 dsh 版本已经提供 dsh plugin 子命令。package.json 声明的 Node 引擎是 ^22.19.0 || >=24.0.0;peer 依赖 @deepseek-ai/dsh-toolscordis 由 dsh 组合提供,运行时额外依赖 fflate(用于 docx 抽取),会随插件安装流程一起装上。

目录页和 README 里的 git 来源写法并不完全相同。目录页使用 github:omdsh-dev/dsh-kb-sieve,与当前公开仓库一致;README 示例里曾出现 git+https://github.com/dsh-external/dsh-kb-sieve.git。安装时以目录页这条命令为准,不要按包名里的 @dsh-external 去猜另一个 GitHub 组织。

典型用法

仓库推荐的用法是构建加动态加载。对模型直接说人话,例如「把这些文档做成知识库」,并给出文档路径。kb_build 默认写到项目下的 .dsh/skills/,DSH 会动态发现新 skill;模型加载后按 SKILL.md 调用 kb_query / kb_read。skill 内容按需读取,没有额外的缓存失效步骤。

也可以把 out 指到任意父目录,之后查询时显式传入 pack 路径。第三种情况是只查旧包:只要目录里有兼容的 kb.sqlitereferences/,不必重新构建。

生成的 skill 把默认流程写得很死:

  1. kb_query 拿 compact 摘要(doc_id、行号、匹配行、status)。
  2. kb_readaround 精读命中章节;定位困难时先 sections: true 看章节地图。
  3. 回答时引用章节名,不输出内部行号;没有证据就明确说未找到。

多跳问题不要把所有关键词一次塞进查询。SKILL.md 要求每轮只查 1–2 个环节,从命中行提取新实体再查下一跳。

这些都是工具参数,不是单独的 CLI 子命令。插件装好后,由当前会话里的模型按 skill 指令去调工具;不要指望在 shell 里直接敲 kb_query

适用场景与注意事项

比较适合把规范、手册、接口说明、制度条文这类需要“对着原文说话”的材料交给智能体。检索是 BM25 加密度窗口,对标准号、章节号、型号这类标识符更友好;它不是语义向量记忆,也不从对话里自动抽取三元组。社区目录里同属「记忆」分类的 graph-memorymnemon 走的是另一条路,和 dsh-kb-sieve 不是替代关系。

使用前建议先看这几条边界:

  • 输入格式目前只有 md / txt / docx / pdf。PDF 依赖系统 pdftotext,容器或精简环境里经常缺这一步。
  • 别名、图边、LLM 查询变体、TSV 索引等原版能力,仓库对照表仍标为 v1 未做。
  • 行号是 doc.md 的物理行,给工具定位用,不是印刷页码。
  • 大文档会占内存。README 写 32MB 文档构建峰值约 0.6–2GB,内存紧张时减小 workers
  • 知识包落在项目内的 .dsh/skills/,随项目走,不默认写到 ~/.dsh/skills

插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前应检查源代码仓库和许可证;生产或共享环境里建议固定 commit。DeepSeek Harness 本身仍处于 developer preview,官方仓库也提醒会有破坏性变更,插件 API 同样可能跟着动。

小结

dsh-kb-sieve 把“可引用的原文”和“可重复的本地检索”捆成一个知识包:构建不经过 LLM,查询走 SQLite FTS5,精读回到 references/ 章节。它解决的不是把记忆做得更像人,而是让智能体在规范、手册这类材料上少凭印象说话。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-kb-sieve/

GitHub:https://github.com/omdsh-dev/dsh-kb-sieve

羽毛球分组比赛记分
小程序二维码

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

小夜