OpenClaw QMD:本地混合搜索,实现十倍更智能的记忆
抱歉,我需要您提供要翻译的具体文本内容(文章正文),才能为您完成简体中文的翻译。请把需要翻译的文字粘贴在这里,我会保持原有的格式、Markdown 语法以及技术术语不变,只翻译正文部分。
为什么默认记忆在规模上会失败
OpenClaw 的内置记忆很简单:
- 追加 到
MEMORY.md。 - 将整个文件注入 每个提示。
在约 500 token 时运行良好,但在约 5 000 token 时就会崩溃。
问题会叠加
| 问题 | 症状 |
|---|---|
| Token 爆炸 | 每条消息都要支付完整的上下文费用。一个 10 token 的查询会拖拽约 4 000 token 的记忆。你的 $0.01 API 调用会变成 $0.15。 |
| 相关性崩塌 | 模型看到所有内容,却没有任何优先级。询问“数据库连接池”时,模型会把你的午餐偏好当作同等重要。 |
| 缺乏语义理解 | 仅靠关键词匹配会错过同义词。除非使用完全相同的词汇,否则“DB connection”找不到关于“PostgreSQL pooling”的笔记。 |
| 云依赖 | 向量搜索通常意味着 Pinecone、Weaviate 或其他托管服务。你的私人笔记现在存放在别人的服务器上。 |
QMD 解决所有四项
在本地索引你的 markdown 文件,运行结合三种搜索策略的混合检索,并仅返回相关片段。
- 每个结果最多 700 个字符(默认 = 6 条结果)。
- 你的 10 000 令牌内存占用将变为 ≈ 200 令牌的黄金。
面试官实际在考察什么: 你能解释上下文注入的代币经济学吗?
洞察: 上下文长度的成本是 O(n),但相关性才是关键。检索增强生成(RAG)之所以存在,是因为“把所有内容都包括进来”无法扩展。
混合搜索 – 三个阶段
阶段 1 – BM25(关键词匹配)
经典信息检索:词频、逆文档频率、文档长度归一化。
Score = Σ IDF(term) × TF(term,doc) × (k₁+1) / (TF + k₁ × (1‑b + b × |doc|/avgdl))
- 快速、确定性强,适合精确匹配。
- 示例:搜索 “SwiftUI navigation” 能找到包含这些确切词汇的文档。
局限性: 无法捕捉语义关系(例如 “iOS routing” 无法匹配 “SwiftUI navigation”)。
阶段 2 – 向量搜索(语义匹配)
- 使用 Jina v3 embeddings(本地约 1 GB GGUF 模型)。
- 文本 → 1024 维向量;语义相近的内容会聚在一起。
- “iOS routing” 会出现在 “SwiftUI navigation” 附近。
嵌入模型会在首次运行时自动下载。无需 API 密钥,也不调用云服务。你的笔记永远不会离开本机。
阶段 3 – LLM 重排序(精度提升)
在 BM25 和向量搜索返回候选后,本地 LLM 会根据实际与查询的相关性对它们进行重新排序。
Query: "Ray's SwiftUI style"
├── BM25 candidates (10)
├── Vector candidates (10)
└── LLM reranker → Top 6 results (≈700 chars each)
- 能捕捉到关键词和语义匹配都未能命中的情况。
- 示例:关于 Ray 的代码审查偏好的片段会胜过仅仅提到 SwiftUI 的片段。
面试官真正想考察的点: 混合搜索是 2026 年生产环境 RAG 的标准做法。纯向量搜索存在召回率问题;纯 BM25 存在语义理解问题。两者结合再加上重排序,才是构建真正有效检索的方式。
为什么本地运行?
| 好处 | 原因 |
|---|---|
| 成本 | 向量搜索 API 按查询计费。QMD 在首次下载模型后免费。 |
| 隐私 | 代理记忆包含敏感上下文(项目名称、凭证、个人偏好)。本地保存即保持私密。 |
| 延迟 | 网络往返每次查询增加 50‑200 毫秒。本地推理更快,尤其在每轮进行多次检索时。 |
权衡: 计算。你需要一台拥有足够内存来加载模型的机器(建议约 4 GB)。云实例也可以,但你是为计算付费,而不是 API 调用。
面试官实际在考察的内容: 构建‑还是购买的机器学习基础设施决策。本地模型用计算成本换取 API 成本。盈亏平衡点取决于查询量、延迟需求和隐私约束。了解你的数据。
QMD 架构
- Rust CLI – 快速、单二进制文件、跨平台。
- GGUF 模型 – 为本地推理量化(约 1 GB 总计)。
- SQLite 索引 – 本地存储 BM25 + 元数据。
- Jina v3 嵌入 – 1024 维向量,多语言。
在 Mac Mini M2 上,嵌入 1 000 个 markdown 文件约需 ~30 秒。查询返回时间约为 ≈ 100 ms。
面试官真正考察的点: 系统集成模式。如何在不破坏系统其余部分的前提下替换组件(内存后端)?答案涉及清晰的接口、基于配置的切换,以及在新后端失败时的优雅降级。
Source: …
QMD的模型上下文协议(MCP)服务器
QMD 提供一个 MCP 服务器,使代理能够以编程方式查询记忆(例如,通过 HTTP/JSON)。这实现了:
- 语言无关 的访问,适用于任何代理实现。
- 对检索参数(最大结果数、字符限制、过滤器)的 细粒度控制。
- 当 MCP 服务器不可用时,能够 平滑回退 到内置记忆。
TL;DR
- 默认的 “注入全部” 记忆 无法扩展。
- 混合检索(BM25 + 向量 + LLM 重排)提供廉价、私密、低延迟的检索。
- QMD 在本地提供该功能,可通过简单配置与 OpenClaw 集成,让你的代理记忆保持快速、相关且安全。
启用自愈记忆工作流
示例: 一个修剪过时条目的压缩技能
// Memory compaction skill
const staleEntries = await qmd.query({
collection: "agent-logs",
filter: { olderThan: "30d", accessCount: 0 }
});
for (const entry of staleEntries) {
if (await confirmDeletion(entry)) {
await qmd.delete(entry.id);
}
}
await qmd.reindex();
MCP 接口
| Command | Description |
|---|---|
query | 带过滤器的混合搜索 |
add | 插入新记忆条目 |
update | 修改已有条目 |
delete | 删除过期内容 |
reindex | 在批量更改后重建嵌入 |
这将记忆从被动存储转变为主动系统。代理可以自行整理上下文,修剪无关条目并提升有用条目。
模式提示: 运行一个夜间任务,分析查询模式,识别从未被检索的条目并将其归档。记忆保持精简,无需手动整理。
面试官真正在考察什么
“你能设计能够自我维护的系统吗?”
自愈基础设施是高级工程师关注的重点。具体技术(记忆压缩)不如模式重要:观察 → 分析 → 行动 → 验证.
基准测试 QMD 与默认记忆
环境
- OpenClaw v2026.2.0+
- Bun 或 Node 22+
- 4 GB RAM,约 2 GB 磁盘用于模型
bun install -g https://github.com/tobi/qmd
验证安装
qmd --version
# Expected: qmd 0.4.2 or higher
为已有记忆建立索引
qmd collection add ~/.openclaw/agents/main/memory --name test-memory
构建嵌入(首次运行需 30‑60 秒)
qmd embed --collection test-memory
运行混合搜索
time qmd query "database connection pooling" --collection test-memory
对比 Token 数量
echo "QMD returns ~700 chars × 6 results = 4,200 chars max"
echo "Full MEMORY.md injection = $(wc -c MEMORY.md)"
成本提示: 如果你的 MEMORY.md 超过 2 000 个 token 且你按 token 计费进行上下文注入,QMD 一周内即可收回成本。
Sources
- 如何使用 QMD 修复 OpenClaw 的内存搜索 – José Casanova
- OpenClaw 内存文档
- QMD 技能 – OpenClaw 技能手册
- Tobi Lütke 关于 QMD 集成的观点