qmd

本地知识库的混合检索底座——BM25 + 向量检索 + 重排序,让 LLM 在 Markdown 文件系统中精准找到该看的内容

简介

qmd(全名 @tobilu/qmd)是一个面向本地 Markdown 文件知识库的混合检索引擎。它的定位不是全能知识管理系统,而是知识库的检索底座——不负责理解知识,不负责设计知识结构,只负责一件事:当知识库变大之后,帮 LLM 找到该看的东西。

与纯向量数据库(如 Chroma、Pinecone)不同,qmd 同时支持 BM25 词法检索和向量语义检索,并叠加重排序。这种混合策略特别适合技术文章、论文、笔记、代码说明这类材料——精确词(如 CLAUDE.mdraw_sha256、某个论文标题、某个命令名)用 BM25 匹配更可靠,模糊语义问题用向量检索更合适。

qmd 的核心概念是 Collection——一组被索引的文件。一个知识库应该按用途注册多个 Collection(如 sources、concepts、entities、raw),而非粗暴把整个文件夹注册成一个集合。每个 Collection 还需要 context description 来告诉重排序模型”这个集合里装的是什么”,这直接影响跨集合的检索排序质量。

关键信息

  • 类型:工具 / 检索引擎
  • 领域:知识管理 / 本地知识库 / LLM 辅助检索
  • 安装方式npm install -g @tobilu/qmd
  • 核心技术:BM25 词法检索 + 向量语义检索 + 重排序
  • 数据格式:Markdown 文件(.md)
  • 索引单位:Collection(一组被索引的文件,可按用途划分)
  • 相关概念RAG 知识库Embedding 嵌入上下文工程Claude Code

核心特性

混合检索:BM25 + 向量 + 重排序

只用向量检索会遇到”语义大概能找但精确词不稳”的问题。qmd 的混合策略让两类查询各取所长:

查询类型适合的检索方式示例
精确词/专有名词BM25 词法检索CLAUDE.mdraw_sha256、论文标题、命令名
模糊语义问题向量语义检索”Transformer 的位置编码怎么工作”
通用查询混合 + 重排序日常搜索,兼顾精确和语义

Collection 按用途划分

一个知识库不应该把所有文件注册成一个大集合。正确做法是按文件用途划分:

technical-sources → technical/wiki/sources/*.md      # 摘要页
technical-concepts → technical/wiki/concepts/*.md    # 概念页
technical-entities → technical/wiki/entities/*.md    # 实体页
technical-raw → technical/raw/**/*.md                # 原始文档

每个 Collection 加 context description(如”source 页面是一篇文档的摘要”、“raw 是不可修改的原始资料”),告诉重排序模型集合的语义定位。这决定了检索时”用户这个问题更应该去什么类型的页面里找”。

块级检索处理超长文档

对于几十页甚至两百页的长文档,qmd 支持块级检索(search-chunks)——不在全文中搜,而是在 raw 文档的块级索引中按主题找最相关的几个片段。LLM 每次只读几个块,配合 WIP(Work In Progress)文件记录处理进度,实现”处理完一个主题就落盘”的断点续传。

语义化 CLI 封装

qmd 的原始命令比较底层、参数组合多,直接让 LLM 调用容易出错。最佳实践是用 bin/wiki 封装成语义化命令:

命令用途说明
wiki search "关键词"日常查询默认搜当前域 wiki 页面
wiki search-lex "关键词"词法检索专有名词、命令名、文件名
wiki search-vec "问题"向量检索模糊语义问题
wiki search-cross "关键词"跨域搜索搜所有域和 shared 层
wiki find-related "主题"ingest 专用阈值更低、返回更多候选
wiki search-chunks "主题" -n 5块级检索长文档按主题找相关段落
wiki get "路径"文档取回读取单个页面
wiki bulk "类型"批量读取lint 时批量检查

不同素材中的观点

  • 2026-05-28-woshipm-llm-wiki-qmd-architecture(秋孝隱):qmd 的五条选择理由——Markdown 文件系统天然适配、混合检索解决精确+语义双需求、CLI 封装让 LLM 稳定调用、块级检索处理超长文档、本地轻量可迁移。定位为”检索底座”而非全能引擎,只负责帮 LLM 找到该看的东西,不负责理解知识和设计结构。配套的四层架构(用户→LLM→CLI→系统)和 Collection 按用途注册的实践方案

实用信息

  • 快速上手npm install -g @tobilu/qmd → 建目录(raw + wiki)→ 写 bin/wiki CLI 封装核心命令 → 注册 Collection(按用途分开)→ 写 context description → reindex 建索引
  • 关键配置:Collection 的 context description 直接影响检索质量——告诉重排序模型每个集合的语义定位
  • 适用场景:本地 Markdown 知识库、LLM 辅助知识管理、技术文档/论文/笔记检索、需要精确词+语义混合检索的场景
  • 不适用场景:非 Markdown 格式为主的知识库、需要实时多人协作的知识库、纯语义问答(RAG 更合适)、文档量极小(<50 篇)不需要专门检索引擎

相关页面