dsh-plugin-verified-search
f0909172434
Verified current-source search workflow for DeepSeek Harness
PROJECT TOPICS
PROJECT README
一个深度的知识库系统,作为 DeepSeek Harness(DSH)的独立、可开源 bundle 插件。提供知识库(含分组)与文档管理、文本分块、向量化(OpenAI 兼容 / Ollama / 本地模型 / 关键词降级)、检索,以及模型可见工具与浏览器管理面板。
/embeddings 端点(OpenAI、DeepSeek、SiliconFlow、本地网关…)、Ollama,或 进程内本地模型(transformers.js,默认 onnx-community/Qwen3-Embedding-0.6B-ONNX,无需联网服务);混合检索(BM25 + 向量 + Reciprocal Rank Fusion)、重排模型(rerank,Jina/SiliconFlow/Cohere v2 风格 API)、MMR 结果去重、检索模式(auto/hybrid/vector/lexical)与相似度阈值;未配置时自动退化关键词(CJK 二元组 + 拉丁词 BM25),零配置即可用;召回测试显示命中来源、相关度、双分数、耗时,并保留检索历史可一键重放。knowledge_search、knowledge_list_bases、knowledge_create_base、knowledge_delete_base、knowledge_add_document、knowledge_list_documents、knowledge_delete_document、knowledge_import_url、knowledge_stats、knowledge_get_document、knowledge_read_document(按字符区间分段阅读 / 正则定位)、knowledge_reindex_base。settings.section 插槽),卡片:模型名称/说明、就绪徽标、下载 / 重试 / 删除 按钮、实时下载进度条;下载后即可在知识库设置里选用「本地模型」作为向量化方式。storageDomain seam 落盘(json 后端,默认随 web profile 提供);分块数据存于独立 SQLite 文件(<DSH_HOME>/storages/knowledge-chunks.sqlite,可用 chunkStorePath 配置)——每分块一行、每次写入/删除为单条语句,不随数据量恶化;词法检索走 FTS5 三元组全文索引、向量检索查询时扫描存储的向量,启动不再全量载入内存。升级后首次启动自动完成旧数据迁移(幂等、去重);无存储后端时自动降级为内存模式。一个 bundle 含三个插件行:
| 插件 | 平台 | 职责 |
|---|---|---|
knowledge(ctx.knowledge) |
host | 核心引擎:存储域、分块、embedding、检索、/knowledge/* HTTP 服务 |
tool-knowledge |
host | 12 个模型工具,消费 ctx.knowledge |
ui-knowledge |
client | 侧边栏底部入口(sidebar.footer.action)+ 工作区整页浮层(shell.overlay),Cherry Studio 式布局 |
数据模型(storageDomain 声明领域 knowledge,version 0):
bases 表:知识库元数据documents 表:文档元数据chunks 表:分块(含可选 embedding 向量)本包已发布到 npm(声明 dsh.bundle.patch),dsh plugin add 会自动登记并插入插件行:
# 从 npm(推荐,无需构建)
dsh plugin --profile <name> add dsh-knowledge
# 从发布 tarball(GitHub Releases 或 npm pack 产物)
dsh plugin --profile <name> add ./dsh-knowledge-0.1.0.tgz
# 从本地源码目录(需先构建,见下方「开发」)
dsh plugin --profile <name> add file:/path/to/dsh-knowledge
pnpm 10+ 构建脚本白名单:进程内本地嵌入运行时依赖
onnxruntime-node、sharp、protobufjs,pnpm 默认拒绝运行它们的 postinstall,dsh plugin add会因此以非零退出、并在登记 bundle 前中断。请在安装前于 profile 的pnpm-workspace.yaml中加入以下内容,再重新执行 add:allowBuilds: onnxruntime-node: true sharp: true protobufjs: true(Windows 嵌入路径其实不依赖这些脚本——onnxruntime 的 Windows 二进制已内置,
sharp/protobufjs也未使用——但 pnpm 会把拒绝视为错误,授权是最干净的做法。)
重启 web 服务使 host 侧生效,刷新页面加载 client 面板。
插件安装在 profile 层(
dsh plugin会在 profile 目录里跑 pnpm),因此无论 DSH 是 npm 安装还是全新源码 clone,上面的安装命令完全一样——不涉及插件源码、checkout 链接或 DSH 构建。
47f943859b(2026-08,npm 插件生态时代)上开发并验证。peer 依赖按 DSH 惯例声明为 *,更新的 DSH 源码也能无解析错误安装;若新版 DSH 出现兼容问题,请带上你运行的 DSH 提交号提 issue。^22.19.0 || >=24.0.0(与 DSH 自身要求一致——分块存储使用 Node 内置 node:sqlite,DSH 自己的会话存储也在用)。.doc / .ppt / .xls 解析依赖 @firecrawl/anydoc(各平台原生二进制);其余全为纯 JS。embeddingProvider: local 后首次使用会从 Hugging Face 下载模型权重(缓存于 localModelCacheDir);需要时可设 HF_ENDPOINT 指向镜像。部署默认值写在 cordis.patch.yml 的 knowledge 行(可用上层 patch 按 id 覆盖);面板里的「设置」可运行时覆盖,覆盖值持久化在存储域中:
| 字段 | 默认 | 说明 |
|---|---|---|
embeddingProvider |
none |
openai / ollama / local(进程内 transformers.js)/ none |
embeddingBaseUrl |
'' |
端点基址,如 https://api.openai.com/v1 或 http://127.0.0.1:11434(local 不需要) |
embeddingModel |
'' |
如 text-embedding-3-small;local 时为 Hugging Face 仓库 id(默认 onnx-community/Qwen3-Embedding-0.6B-ONNX) |
embeddingApiKey |
'' |
可选;也可用环境变量 KNOWLEDGE_API_KEY |
rerankModel / rerankBaseUrl / rerankApiKey |
'' |
重排模型(留空=不启用),Jina / SiliconFlow / Cohere v2 风格接口 |
smartChunk |
true |
智能分段(标题/段落感知);关闭后仅按 chunkSeparator 切分 |
chunkSeparator |
\n\n |
智能分段关闭时的段落边界(可写 \n) |
chunkSize |
800 |
分块字符数 |
chunkOverlap |
100 |
相邻分块重叠字符数 |
topK |
6 |
检索返回条数(1–50) |
searchMode |
auto |
auto / hybrid / vector / lexical |
similarityThreshold |
0 |
相似度阈值(0–1),低于该分数的结果被过滤 |
mmrDiversity |
0 |
MMR 结果多样性(0–1,0=关闭) |
embeddingBatchSize |
32 |
每次 embedding 请求的文本条数 |
localModelCacheDir |
'' |
本地模型缓存根目录;留空 = <DSH_HOME>/cache/dsh-knowledge/local-models(DSH_HOME 未设则为 ~/.dsh) |
chunkStorePath |
'' |
分块 SQLite 文件;留空 = <DSH_HOME>/storages/knowledge-chunks.sqlite |
分块数据不放在存储域 KV 里,而是独立 SQLite 文件:web profile 的 JSON 后端每次写记录都会重写整个单元文件,数据增长后删除/导入会变慢到秒级甚至分钟级;SQLite 让每次写入/删除都是单条语句,并提供 FTS5 三元组全文检索(BM25)与查询时向量扫描、有界读取——常驻内存不随语料增长。升级后首次启动会自动把旧 JSON 单元里的分块迁入 SQLite(幂等,中断产生的重复行自动去重)。
以上所有字段均可在每个知识库的设置面板中单独覆盖(留空继承全局);API Key 以明文保存在本地存储。
选择 embeddingProvider: local 时,插件在 host 进程内用 @huggingface/transformers(+ onnxruntime)跑 embedding,无需任何外部服务。默认模型 onnx-community/Qwen3-Embedding-0.6B-ONNX(1024 维),embeddingModel 可换成任意 Hugging Face 上的 ONNX embedding 仓库 id。首次使用会从 Hugging Face Hub 下载模型权重(默认缓存到 $DSH_HOME/cache/dsh-knowledge/local-models);下载完成后后续导入与检索全程本地。在设置 →「本地模型」页面可提前下载 / 取消 / 删除 / 重试,并实时查看下载进度;知识库设置面板也会显示模型下载进度(下载中 % / 就绪 / 失败);可用环境变量 HF_ENDPOINT 指向镜像加速下载。
scripts/ 内置一套可复现的评测基准:以真实数学建模问题为评测集(覆盖库内文档主题),按 Hit@k / Recall@k / MRR 计分:
| 题型 | 纯词法 | 混合 | 纯向量 |
|---|---|---|---|
| 直答型(问题含主题词,14 题) | 0.929 | 0.857 | — |
| 换说法型(问题不含主题词,10 题) | 0.600 | 0.900(MRR 0.575) | 0.900(MRR 0.628) |
直答型问题纯词法已足够;本地模型向量的真实价值体现在换说法型问题——向量检索把 Hit@5 从 0.600 提升到 0.900。可对任意知识库复跑:
node scripts/eval-retrieval.mjs --file scripts/eval-rephrase.json --base <baseId> --mode hybrid
knowledge_search 等 12 个工具。依赖公开的 DeepSeek Harness monorepo 作为 sibling checkout(package.json 的 devDependencies 用 link:../dsh/... 指向它,peer 依赖由该 checkout 提供):
# 建立 sibling 链接(Windows 可用 junction)
# mklink /J ..\dsh "D:\Program Files\deepseek harness"
pnpm install --config.auto-install-peers=false
pnpm run check # typecheck + test + build
pnpm run build # esbuild → lib/(含 client bundle)
pnpm test:分块、检索、配置、存储、服务级单测。pnpm run typecheck:tsc --noEmit。pnpm run build:host ESM 条目 + 浏览器 factory-form client bundle + 类型声明。ctx.llm 只暴露对话模型(listModels 无 embedding 维度标记,且本插件的 embedding 端点/模型是独立配置)。设置面板因此用「内置精选建议 + 可输入自定义 id」的原生 datalist 组合框(嵌入 / 本地 / 重排三组建议)。MIT。特别感谢 Cherry Studio:本项目界面与功能设计以其为灵感(AGPL-3.0),代码为独立实现,未包含其源码。另参考并致谢社区项目:dsh-interconnect、dsh-deeptutor、awesome-dsh-plugin。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。