最近把 OpenClaw 的 Memory Search 从 SQLite 升级到了 QMD。
这不只是换个搜索引擎那么简单。
而是从单层向量搜索升级到了混合搜索(BM25 + Vector + Reranker)。
OpenClaw 之前用的是内置的 SQLite + nomic-embed-text 模型(139MB)。
很轻量。
但问题是:
对于小规模笔记(<100 篇),够用。
但我的 brain/ 目录有 174 个 Markdown 文件。
需要更精确的搜索。
QMD(Query Markdown)是一个本地 Markdown 搜索引擎。
核心特点:
| 层级 | 方法 | 作用 |
|---|---|---|
| BM25 | 关键词精确匹配 | 找到包含搜索词的文档 |
| Vector | 语义相似度 | 找到语义相关的文档 |
| Reranker | 重排序 | 综合考虑 BM25 和 Vector 分数 |
举个例子:
搜索:"自驾途中过夜"
这就是混合搜索的优势。
QMD 会自动扩展你的查询。
示例:
查询: "郑州酒店"
自动扩展:
├─ 郑州酒店
└─ 郑州住宿
这样即使笔记里只写了"住宿",也能找到。
原理:用 1.7B 参数的 Query Expansion 模型生成同义词和相关词。
我做了几个对比测试:
| 查询 | SQLite (Vector) | QMD (Hybrid) |
|---|---|---|
| "自驾途中过夜" | ❌ 无结果 | ✅ 找到郑州酒店 (63%) |
| "工作汇报模板" | ❌ 无结果 | ✅ Task Report 模板 (61%) |
| "Dan Sullivan 核心观点" | ❌ 无结果 | ✅ Who Not How 书籍 (58%) |
SQLite 只能精确匹配词汇。
QMD 理解语义。
| 维度 | SQLite | QMD |
|---|---|---|
| Embedding 模型 | 139 MB | 313 MB |
| Query Expansion | 0 | 1.2 GB |
| Reranker | 0 | ~600 MB |
| 总计 | 139 MB | ~2.1 GB |
QMD 的空间占用是 SQLite 的 15 倍。
但精度提升明显。
curl -fsSL https://bun.sh/install | bash
~/.bun/bin/bun install -g @cldcvr/qmd-cli
{
"memory": {
"backend": "qmd",
"qmd": {
"command": "/Users/seed/.bun/bin/qmd",
"includeDefaultMemory": true,
"paths": [
{
"name": "brain",
"path": "/Users/seed/clawd/brain",
"pattern": "**/*.md"
}
],
"update": {
"interval": "5m"
}
}
}
}
openclaw memory index
首次索引会下载模型(~2GB),需要等一会儿。
Memory Search 不是非此即彼。
关键词匹配(BM25)和语义搜索(Vector)各有优势。
最好的方案是混合使用。
SQLite 适合轻量场景。
QMD 适合追求精度。
OpenClaw 让你可以自由选择。
这篇文章是在配置 QMD 过程中的实践总结。如果你也在用 OpenClaw,可以试试 QMD 的混合搜索。