QMD深度调研-混合搜索管道设计分析
项目地址: research/qmd/
核心架构洞察
1. Hybrid Search Pipeline
1 | Query → [Strong Signal检测] → 跳过LLM扩展 |
2. 关键设计模式
| 模式 | 实现 | 洞察 |
|---|---|---|
| Strong Signal Skip | BM25 score > 0.85 且 gap > 0.15 | 高置信时跳过昂贵LLM调用 |
| Smart Chunking | 按Markdown标题层级评分 | h1=100, h2=90…空白=20 |
| Code Fence Protection | 检测```区域禁止切割 | 避免破坏代码块 |
| RRF Weight | 前2个列表2x权重 | 原始查询优先级最高 |
| Position-Aware Blend | rank ≤3: 0.75RRF, ≤10: 0.60 | 保护头部结果不被rerank推翻 |
3. 查询类型系统
1 | type QueryType = 'lex' | 'vec' | 'hyde'; |
4. RRF核心算法
1 | score = Σ(weight / (k + rank + 1)) // k=60 |
关键文件
| 文件 | 行数 | 功能 |
|---|---|---|
store.ts |
3392 | 核心搜索pipeline |
llm.ts |
1421 | GGUF模型抽象层 |
mcp.ts |
876 | MCP服务器实现 |
qmd.ts |
3241 | CLI入口 |
技术决策批判
优点:
- 本地优先,隐私保护
- 多层缓存(expandQuery, rerank)
- 批量embedding优化
- 结构化搜索支持LLM直接调用
局限:
- Bun运行时依赖(非Node.js主流)
- GGUF模型需要下载管理
- 无时间衰减(文档年龄不影响排序)
- 单机SQLite,无分布式支持
可借鉴点
- Strong Signal Skip - 适合所有LLM-augmented系统
- 智能分块 - Markdown感知的分段策略
- Position-Aware Blend - 平衡检索和重排序
- 类型化查询 - lex/vec/hyde分离路由
本地集成状态
位置: research/qmd/
状态: ✅ BM25搜索可用, ⚠️ 向量搜索需要 Homebrew SQLite
配置:
1 | # Collection: workspace (408个md文件) |
API测试:
1 | curl -X POST http://localhost:8181/search \ |
限制: macOS 上 sqlite-vec 需要扩展加载支持,默认系统 SQLite 不支持。BM25 可独立工作。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Aletheia!
评论