QMD 项目概览

项目背景和设计目标

QMD (Query Markup Documents) 是一个本地混合搜索引擎,专为 Markdown 文档设计。它解决了个人知识管理中的一个核心问题:如何在大量笔记、文档和会议记录中快速找到相关信息。

设计目标

  1. 完全本地运行 - 所有数据和模型都在本地,保护隐私
  2. 混合搜索 - 结合关键词搜索(BM25)和语义搜索(向量)的优势
  3. LLM 增强 - 使用本地 LLM 进行查询扩展和结果重排序
  4. Agent 友好 - 提供结构化输出(JSON/XML/CSV),便于 AI Agent 集成
  5. MCP 支持 - 原生支持 Model Context Protocol,与 Claude 等工具深度集成

核心功能和技术特点

核心功能

功能描述
Collection 管理将不同目录组织为命名集合,支持 glob 模式匹配
Context 系统为集合或路径添加描述性上下文,帮助搜索理解内容
三种搜索模式search (BM25), vsearch (向量), query (混合+重排序)
智能分块900 tokens/chunk,15% 重叠,优先在 Markdown 标题处切割
虚拟路径qmd://collection/path 格式,统一访问所有文档
MCP 服务器提供 HTTP 和 stdio 两种传输方式

技术特点

  • BM25 + 向量融合:使用 Reciprocal Rank Fusion (RRF) 算法融合两种搜索结果
  • 查询扩展:使用 fine-tuned Qwen3 模型生成查询变体
  • 位置感知混合:Top 1-3 结果 75% 依赖 RRF,Top 11+ 60% 依赖重排序器
  • 智能缓存:LLM 响应缓存,避免重复计算

架构图

┌─────────────────────────────────────────────────────────────────────────────┐
│                         QMD Hybrid Search Pipeline                          │
└─────────────────────────────────────────────────────────────────────────────┘

                               ┌─────────────────┐
                               │   User Query    │
                               └────────┬────────┘
                                        │
                         ┌──────────────┴──────────────┐
                         ▼                             ▼
                ┌────────────────┐            ┌────────────────┐
                │ Query Expansion│            │  Original Query│
                │  (fine-tuned)  │            │   (×2 weight)  │
                └───────┬────────┘            └───────┬────────┘
                        │                             │
                        │ 2 alternative queries       │
                        └──────────────┬──────────────┘
                                       │
               ┌───────────────────────┼───────────────────────┐
               ▼                       ▼                       ▼
      ┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
      │ Original Query  │     │ Expanded Query 1│     │ Expanded Query 2│
      └────────┬────────┘     └────────┬────────┘     └────────┬────────┘
               │                       │                       │
       ┌───────┴───────┐       ┌───────┴───────┐       ┌───────┴───────┐
       ▼               ▼       ▼               ▼       ▼               ▼
   ┌───────┐       ┌───────┐ ┌───────┐     ┌───────┐ ┌───────┐     ┌───────┐
   │ BM25  │       │Vector │ │ BM25  │     │Vector │ │ BM25  │     │Vector │
   │(FTS5) │       │Search │ │(FTS5) │     │Search │ │(FTS5) │     │Search │
   └───┬───┘       └───┬───┘ └───┬───┘     └───┬───┘ └───┬───┘     └───┬───┘
       │               │         │             │         │             │
       └───────┬───────┘         └──────┬──────┘         └──────┬──────┘
               │                        │                       │
               └────────────────────────┼───────────────────────┘
                                        │
                                        ▼
                           ┌───────────────────────┐
                           │   RRF Fusion + Bonus  │
                           │  Original query: ×2   │
                           │  Top-rank bonus: +0.05│
                           │     Top 30 Kept       │
                           └───────────┬───────────┘
                                       │
                                       ▼
                           ┌───────────────────────┐
                           │    LLM Re-ranking     │
                           │  (qwen3-reranker)     │
                           │  Yes/No + logprobs    │
                           └───────────┬───────────┘
                                       │
                                       ▼
                           ┌───────────────────────┐
                           │  Position-Aware Blend │
                           │  Top 1-3:  75% RRF    │
                           │  Top 4-10: 60% RRF    │
                           │  Top 11+:  40% RRF    │
                           └───────────────────────┘

与同类项目的对比

特性QMDObsidian Searchripgrep + fzfElasticsearch
本地运行✅ 完全本地✅ 本地✅ 本地❌ 需要服务器
语义搜索✅ 向量+重排序❌ 仅关键词❌ 仅关键词⚠️ 需配置
LLM 集成✅ 内置❌ 无❌ 无⚠️ 需外部
MCP 支持✅ 原生❌ 无❌ 无❌ 无
隐私保护✅ 数据不出境✅ 本地✅ 本地⚠️ 依赖部署
设置复杂度
资源占用中(需 GPU/CPU)

独特优势

  1. Context 系统:通过 qmd context add 为集合添加描述,这是 QMD 的关键特性,让 LLM 能做出更好的上下文选择
  2. Query Document:v1.1.0 引入的多行查询格式,支持 lex:, vec:, hyde: 等子查询类型
  3. 智能分块:不是简单的固定长度切割,而是寻找 Markdown 结构的自然断点
  4. 位置感知融合:根据结果排名动态调整 RRF 和重排序器的权重

技术栈

  • 运行时: Bun >= 1.0.0 或 Node.js >= 22
  • 数据库: SQLite + FTS5 + sqlite-vec
  • LLM 推理: node-llama-cpp (GGUF 模型)
  • 模型:
    • Embedding: embeddinggemma-300M-Q8_0 (~300MB)
    • Reranking: qwen3-reranker-0.6b-q8_0 (~640MB)
    • Generation: qmd-query-expansion-1.7B-q4_k_m (~1.1GB)

相关文档