dsh-km:工作区本地 Markdown 知识库与 BM25 检索

前言

在 DeepSeek Harness(DSH)里做长线任务时,结论往往散落在对话里:隔几周再问「当时检索方案怎么定的」,只能靠翻聊天记录,或者自己另存笔记文件,和 Agent 用的上下文并不贯通。常见做法包括手工维护 Obsidian / 纯 Markdown 目录、让模型每次从头总结会话,或接入向量库——前者和 Harness 工具面脱节,后者要网络和模型调用,部署也更重。

下面介绍社区插件 dsh-km(GitHub:calmzealA/dsh-km,分类:记忆):把知识落在工作区 .dsh-km/ 下的普通 Markdown 上,由四个 km_* 工具读写,侧边栏提供 Web 面板做审阅;检索用本地 BM25(含 CJK bigram),无嵌入、无额外依赖、无出站网络。

这是什么

dsh-km 是面向 DeepSeek Harness 的 local-first 知识库插件。维护者为 calmzealA(npm 包名 dsh-km,当前版本 0.1.0,许可证 MIT)。它解决的是:在同一工作区内,让人和 Agent 共用一套可 diff、可提交、可审阅的笔记,并按「何时该想起来」和关键词检索,而不是只堆对话历史。

要点如下:

  • Markdown 为唯一事实来源;内存索引在启动和写入后重建。
  • 每条笔记有单行 when 字段,用于「情境匹配」,不仅靠关键词。
  • sources(session、URL、file、manual)与审阅状态 draft / verified / stale / archived 是一等公民;模型写入默认为 draft。
  • 删除进入 .trash/,工具不会直接 unlink 笔记文件。

核心功能

四个 km_* 工具

工具 主要参数 返回
km_search query(空则列最近)、tags?、status?、topK?、workspace? id、标题、状态、when、片段、来源、得分
km_read id、maxChars?、workspace? Frontmatter、正文、来源、链接、反向链接
km_write title、body、tags?、when?、status?、sources?、id? 稳定 id、路径、状态、时间戳
km_link from、to 两笔记双向链接

笔记 id 形如 km-xxxxxxxx;工具不接受文件路径。新笔记默认 draft;/km add 与面板保存默认 verified。

目录与笔记格式

默认库路径为 <workspace>/.dsh-km/:

<workspace>/.dsh-km/
├── .gitignore
├── notes/
│   └── 检索方案选型-km-8060879c.md
└── .trash/

笔记为带 YAML frontmatter 的 Markdown,例如:

---
id: km-8060879c
title: 检索方案选型
tags: [检索, 架构]
when: 当需要决定检索方案时
links: [km-9f8e7d6c]
status: verified
created: 2026-11-11T09:00:00.000Z
updated: 2026-11-11T09:30:00.000Z
sources:
  - {type: session, ref: sess_ab12, locator: "seq:41-47", capturedAt: "2026-11-11T09:00:00.000Z"}
  - {type: url, ref: https://example.com/spec}
---
正文 Markdown……

手写在磁盘上的笔记会在下次 reload 时被索引;格式错误的单条会在面板中报错,不阻塞其余库。

检索

  • 中文按字符 bigram,拉丁文与数字按小写词切分;混合查询可用。
  • 加权 BM25:title(3)、when(2)、tags(2)、body(1),k1=1.2,b=0.75。
  • verified 优先于 draft;stale 降权;默认排除 archived(可按需指定)。
  • 结果受 maxResultChars 预算约束,片段约 180 字符,命中项带 sources。

Web 面板与命令面

知识库面板在侧边栏底部,紧邻 Settings;界面支持英文与简体中文,随 DSH 当前 locale。Host 侧变更需重启 DSH;仅面板相关变更刷新页面即可。

对话中也可用命令:

/km                     status, counts, recent notes
/km add <text>          save a human-authored note (verified)
/km search <text>       compact hits
/km open                status + hint to open the panel

面板通过同源前缀 /dsh-km/api 与 Host 通信(列举工作区、搜笔记、读写、进回收站、重建索引、设置与统计等);vault 须为已注册工作区路径,id 须匹配 ^km-[0-9a-f]{8}$。

安装与启用

插件面向 DSH >=0.2.2-rc.1 <0.3.0 与 Node.js 20+,无运行时 npm 依赖。

推荐从 npm 安装(需 web profile):

dsh plugin --profile web add dsh-km

本地目录安装:

dsh plugin --profile web add ./dsh-km

在 DSH Desktop 中:打开 Plugins → Install third-party plugin,粘贴插件包的绝对路径;启用 bundle 后刷新页面一次以加载 Web 面板。

可在 Plugins → Discover → Add index source 添加市场索引(示例 URL,与 README 一致):

https://cdn.jsdelivr.net/npm/dsh-km@0.1.0/market/index.json

可选配置

cordis.patch.yml 中插件行支持:

Key 默认 含义
vaultDir '' 空为 <workspace>/.dsh-km
maxNoteBytes 1048576 单条正文最大字节
searchTopK 8 默认命中条数
maxResultChars 6000 工具结果字符预算
autoCreate true 首次写入时创建库
watch true 磁盘变更时重载索引

优先级:cordis.patch.yml 高于 Settings 页;Settings 写入 $DSH_HOME/dsh-km/settings.json,高于内置默认。面板不修改 profile patch。

典型用法

对话里让 Agent 写入与引用

在会话中:

> 把这次关于检索方案的结论存进知识库,标注一下来源

Agent 调用 km_write,返回稳定 id(如 km-8060879c)。之后:

> 之前关于检索方案是怎么定的?用 [km-id] 标注引用

Agent 依次 km_search、km_read,并在回答里标注 id。

人工快速录入

/km add 本次选型:工作区检索先用 BM25,verified 状态由人工确认

可与 Git 对工作区 .dsh-km/notes/ 做版本管理,与插件的审阅状态互补。

适用场景与注意

适合谁:需要在 DSH 工作区内沉淀架构决策、调研结论、可复现约定,并希望 Agent 能按 id 检索、带来源与 when 字段的团队或个人;不打算为笔记单独跑向量服务或外网 API 的环境。

运行与安全(安装前请自行核对):

  • 插件以当前 dsh 进程权限读写工作区;所有文件操作限制在该工作区的 vault 内,id 不含路径分隔符,并在 path.resolve 后做包含性检查。
  • 写入按 vault 串行化,临时文件加 rename;删除仅进 .trash/。插件本身不发网络请求、不调用模型。
  • 安装第三方插件前,建议阅读 GitHub 源码 与 MIT 许可证,确认与自身合规要求一致。

当前里程碑未包含(README 路线图):会话事件自动采集与审阅队列、相关度注入、km_check 引文校验、嵌入、PDF/Office 摄取、长文分块与图谱画布等;数据模型已为 sources 与 status 预留扩展。

DSH 生态理念是「一切皆插件」;SkillHub 目录页 等社区站点独立运营,与 DeepSeek / 幻方无官方从属关系,本文介绍的是社区维护的 dsh-km,非官方应用商店内置能力。

结尾

dsh-km 把工作区里的 Markdown 变成 Agent 可读写的知识库:本地 BM25、来源与审阅状态、四个 km_* 工具与侧边审阅面板,适合想在 Harness 内闭环「记结论—再召回」的开发者。进一步细节见目录页与仓库 README。

  • 目录页:https://www.skillhub.cn/plugins/calmzealA/dsh-km
  • GitHub:https://github.com/calmzealA/dsh-km
羽毛球分组比赛记分
小程序二维码

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

小夜