引言
作为 AI 助手开发者,核心挑战在于如何让 AI 真正'记住'知识,而非每次对话从零开始。
传统云端记忆方案存在 API 成本、延迟及本地文档检索能力不足等痛点。本文介绍一种本地 + 云端混合的双层记忆架构,实现了毫秒级本地检索与深度语义理解的结合。
第一部分:QMD 本地搜索的 Windows 集成
初始尝试
QMD 是一个本地文档搜索引擎,支持 BM25 关键词搜索和语义向量搜索。它使用 SQLite 存储索引,适合作为本地记忆底层。
本文介绍了为 OpenClaw Agent 系统构建的双层记忆架构,结合本地 QMD 搜索引擎与云端 Mem0 向量数据库。通过心跳机制替代传统 Cron 任务,解决了非 24/7 开机场景下的自动化维护问题。实测显示 QMD 检索延迟低于 100ms,Mem0 低于 2s,实现了快速本地检索与深度语义理解的平衡。文章还记录了 Windows 下编译 native 模块及处理编码问题的踩坑经验。
作为 AI 助手开发者,核心挑战在于如何让 AI 真正'记住'知识,而非每次对话从零开始。
传统云端记忆方案存在 API 成本、延迟及本地文档检索能力不足等痛点。本文介绍一种本地 + 云端混合的双层记忆架构,实现了毫秒级本地检索与深度语义理解的结合。
QMD 是一个本地文档搜索引擎,支持 BM25 关键词搜索和语义向量搜索。它使用 SQLite 存储索引,适合作为本地记忆底层。
安装过程如下:
bun install -g github:tobi/qmd
bunx tsx src/qmd.ts --help
在 Windows 上运行时报错:
Error: Could not locate the bindings file.
Tried: ... dist/better-sqlite3.node
This usually happens because better-sqlite3 is not compiled for the current OS.
这是因为 better-sqlite3 是 native 模块,需要编译环境。解决方案是安装 Visual Studio 2022 Community 和 Windows SDK。
npm rebuild
成功编译后 QMD 即可运行。
cd ~/.openclaw/workspace-magic
bunx tsx src/qmd.ts search "包打听" -c "."
结果示例:
Title: IDENTITY.md - Who Am I
Score: 64%
- **Name:** 包打听
- **Creature:** AI 万事通
响应速度毫秒级,精度满足需求。
单一记忆方案无法满足所有场景:
设计了互补的双层架构:
| 层次 | QMD(短期记忆) | Mem0(长期记忆) |
|---|---|---|
| 定位 | 本地工作区文档检索 | 云端语义向量数据库 |
| 检索技术 | BM25 关键词 | 语义向量相似度 |
| 响应速度 | <100ms | <2s |
| 覆盖范围 | 当前 workspace | 全域知识、跨会话 |
| 成本 | 完全免费 | 已配置免费 API |
关键信息分层存储:
.md 文件、项目上下文、临时信息。def search(query):
# 第一层:QMD 快速搜索(<100ms)
qmd_results = qmd_search(query)
if qmd_results.score > 0.8:
return qmd_results
# 第二层:Mem0 语义搜索(<2s)
mem0_results = memory_search(query)
if mem0_results:
return mem0_results
# 第三层:生成新答案
return generate_new_answer(query)
这种分层数据在不牺牲响应速度的前提下,获得了深度语义理解能力。
Cron 任务依赖电脑持续开机,不适合个人开发场景。采用心跳机制,在用户活跃时检查是否需要执行任务。
核心逻辑:
def check_tasks():
elapsed = now - last_execution
# 超过 20 小时 → 触发每日任务
if elapsed > 20 hours:
return "execute_daily_tasks"
# 超过 6 天 → 触发每周任务
if elapsed > 6 days:
return "execute_weekly_tasks"
return "nothing_to_do"
优势包括适应非 24/7 开机、避免无谓轮询、状态持久化。
创建了三个核心文件:
scripts/check-tasks.py:任务检查器核心逻辑,读取状态文件并判断执行。memory/cron-state.json:任务状态追踪。{
"lastQMDUpdate": 1771815000000,
"lastDailySummary": 1771815000000,
"lastWeeklyMaintenance": 0
}
HEARTBEAT.md:配置心跳如何调用检查器。| 指标 | 数值 |
|---|---|
| QMD 搜索延迟 | <100ms |
| Mem0 搜索延迟 | <2s |
| 索引文件数 | 16 个.md 文件 |
| 索引大小 | 240KB |
场景 1:查找工作区文件 用户询问端口号,QMD 直接返回日志片段,延迟 <100ms。
场景 2:回忆技术知识 用户询问优化 Redis 缓存,QMD 无匹配,Mem0 返回存储的经验,延迟 <2s。
场景 3:混合检索 综合 QMD 日志片段与 Mem0 经验总结,延迟 <2.5s。
问题: Could not locate the bindings file
解决: 安装 Visual Studio 2022 Community 和 Windows SDK,执行 npm rebuild。
现象: qmd embed 进度条停留在 "Gathering information"。
原因: CPU 模式下 embeddings 生成极慢,模型约 300MB。
决策: 跳过向量嵌入,仅使用 BM25 关键词搜索。对于本地个人使用场景,关键词搜索完全够用。
错误: cron delivery config is only supported for sessionTarget="isolated"
修复: 主会话任务使用 systemEvent 类型,独立代理任务使用 agentTurn 类型。
错误: UnicodeEncodeError: 'gbk' codec can't encode character
修复: 移除 emoji 打印,确保所有汉字字符串显式指定编码。
MEMORY-ARCHITECTURE.md - 详细架构设计MEMORY-QUICKSTART.md - 快速使用指南AGENTS.md - 已更新,添加双层记忆体系scripts/check-tasks.py - 任务检查器scripts/memory-assistant.py - 记忆助手(预留)memory/cron-state.json - 任务状态追踪HEARTBEAT.md - 心跳配置技术的价值在于解决实际问题,而不是追求完美的理论架构。
最初计划做完美的向量嵌入系统,但 CPU 模式下太慢不可用。BM25 已能满足 90% 的场景。真正需要的是自动化维护,而不是完美的算法。
有时,'够用'比'完美'更重要。双层混合架构不是最优雅的设计,但在实际使用中确实有效。
下一步计划包括测试混合检索效果、建立典型使用场景库、探索 GPU 加速集成。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online