OpenClaw QMD:本地混合搜索,实现十倍更智能的记忆

发布: (2026年2月22日 GMT+8 19:55)
10 分钟阅读
原文: Dev.to

抱歉,我需要您提供要翻译的具体文本内容(文章正文),才能为您完成简体中文的翻译。请把需要翻译的文字粘贴在这里,我会保持原有的格式、Markdown 语法以及技术术语不变,只翻译正文部分。

为什么默认记忆在规模上会失败

OpenClaw 的内置记忆很简单:

  1. 追加MEMORY.md
  2. 将整个文件注入 每个提示。

在约 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 接口

CommandDescription
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 集成的观点
0 浏览
Back to Blog

相关文章

阅读更多 »

停止浪费上下文

引言 OpenAI 说:“上下文是一种稀缺资源”。要把它当作稀缺资源来对待。一个庞大的指令文件可能让人觉得安全且详尽,但它会挤占实际的 t...