前言¶
给智能体接一份项目规范、产品手册或者标准条文,最常见的做法是把文档塞进向量库,再靠语义检索往上下文里灌。这条路在问答场景里好用,但有一类需求它并不擅长:你要的不是“看起来相关”,而是能指出原文在哪一节、同一句话每次检索结果都一样,并且整份知识包可以离线带走、事后核对。
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会做标题推断(下划线标题、章节号、短行启发式)。.docx用fflate解 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。结果带 status:high_confidence、needs_verification 或 no_hits。查询词明显越出语料域(例如库里不存在的标准号,或绝大多数词都不在文档里)时,会给出 no_hits 和 oos_reason。
行号只给后续 kb_read 定位用。生成的 SKILL.md 明确要求模型回答时引用章节名(例如「第 D21.3 节」),不要把内部行号报给读者。
3、kb_read:按章节精读原文
必填是 pack 和 doc_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)。当前源码里的索引布局版本是 3(INDEX_VERSION),旧包在查询时可能带 warning,下次构建会按 build_state.index_version 触发一次全量重建。
kb_query / kb_read 读的是 kb.sqlite 加 references/。仓库说明 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-tools 和 cordis 由 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.sqlite 和 references/,不必重新构建。
生成的 skill 把默认流程写得很死:
- 用
kb_query拿 compact 摘要(doc_id、行号、匹配行、status)。 - 用
kb_read的around精读命中章节;定位困难时先sections: true看章节地图。 - 回答时引用章节名,不输出内部行号;没有证据就明确说未找到。
多跳问题不要把所有关键词一次塞进查询。SKILL.md 要求每轮只查 1–2 个环节,从命中行提取新实体再查下一跳。
这些都是工具参数,不是单独的 CLI 子命令。插件装好后,由当前会话里的模型按 skill 指令去调工具;不要指望在 shell 里直接敲 kb_query。
适用场景与注意事项¶
比较适合把规范、手册、接口说明、制度条文这类需要“对着原文说话”的材料交给智能体。检索是 BM25 加密度窗口,对标准号、章节号、型号这类标识符更友好;它不是语义向量记忆,也不从对话里自动抽取三元组。社区目录里同属「记忆」分类的 graph-memory、mnemon 走的是另一条路,和 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