Table of Contents
前言
多數 AI 助理的回答是「瞬時」的——你問,它答,會話結束後什麼都不記得。對於需要長期累積上下文的工作場景,這個限制是根本性的瓶頸。
本文提出一套 三合一架構:以 OpenClaw 為 Agent 框架,qmd 為本地混合檢索層,LightRAG 為圖譜推理引擎。三者各司其職,構成一個具備持久記憶、混合檢索、圖譜推理的本地 AI 助理。
三個工具,各有所長
OpenClaw:Agent 框架
OpenClaw 是本地 AI Agent 執行框架,提供工作階段管理、工具調度、多層記憶(MEMORY.md、Wiki Vault、Vector Store)與豐富的內建工具。
它的限制是:記憶檢索以向量相似為主,缺乏結構化的關係推理能力。
qmd:本地混合檢索
qmd(Query Markup Documents)是專為 Markdown 知識庫設計的本地檢索引擎,核心特點:
- BM25 關鍵字檢索 + 向量語意檢索 + LLM re-ranking 三合一
- 索引儲存在本地 SQLite,不上雲
- 支援 structured query syntax,可指定搜尋範圍與條件
- 有現成的 OpenClaw Skill(
qmd-external),開箱即用
LightRAG:圖譜增強推理
LightRAG 採用向量 + 知識圖譜雙通道架構,入庫時自動:
- 抽取實體(Entity)與關係(Relation)
- 建立圖譜索引
查詢時同時走圖譜路徑,支援多跳推理,例如「某公司CEO任期內的併購決策」這類複雜查詢。
架構設計
┌─────────────────────────────────────────────┐
│ OpenClaw Agent │
│ (工作階段管理 / 工具調度 / 回應生成) │
└──────────────┬──────────────────────────────┘
│
┌──────┴──────┐
▼ ▼
┌──────────┐ ┌──────────────┐
│ qmd │ │ LightRAG │
│ (混合檢索)│ │ (圖譜推理) │
└────┬─────┘ └──────┬───────┘
│ │
▼ ▼
快速關鍵字/ 實體關係圖譜
語意相似匹配 (多跳推理)
│ │
└───────┬───────┘
▼
融合結果注入 prompt
(context 加持)
工作流程:
-
寫入階段:OpenClaw session 結束時,自動抽取關鍵事實
qmd:寫入 Markdown notes(適用於非結構化筆記、日誌)LightRAG:寫入知識圖譜(適用於實體關係抽取)
-
查詢階段:用戶提問時
- 先走
qmdBM25 + 向量混合檢索,取最相關的 Markdown 段落 - 再走
LightRAG圖譜查詢,取相關實體與關係路徑 - 最後將兩者結果融合,注入 prompt
- 先走
-
融合策略:
- 如果 qmd 和 LightRAG 結果有交集,提高該節點的上下文權重
- 如果結果衝突,以 LightRAG 圖譜為準(結構化優先於非結構化)
實作程式碼
1. qmd 初始化(Node.js)
import { QMD } from "qmd";
const qmd = new QMD({
dataDir: "./qmd_data", // SQLite 索引存放位置
model: "./models/bert.gguf" // 本地 embedding 模型(可選)
});
// 將 OpenClaw session 內容寫入 qmd
await qmd.index([
{
id: "note_20260421_001",
text: "Mark 在 2026-04-21 發表了 LightRAG + OpenClaw + qmd 文章",
tags: ["blog", "openclaw", "lightrag"]
},
{
id: "note_20260421_002",
text: "文章放在 dbyellow.com/blog,使用 grav-blog skill 管理發布",
tags: ["blog", "grav", "dbyellow"]
}
]);
2. qmd 查詢(混合檢索)
// 查詢「Mark 最近討論過哪些技術主題」
const results = await qmd.query({
query: "Mark openclaw lightrag 文章",
type: "hybrid", // BM25 + vector 混合
limit: 5,
rerank: true // LLM re-ranking
});
console.log(results[0].text); // 最相關的段落
3. LightRAG 初始化
from lightrag import LightRAG, QueryParam
rag = LightRAG(
working_dir="./lightrag_data",
llm_model="gpt-4o-mini",
embedding_model="text-embedding-3-small",
)
rag.insert_chunks(
texts=[
"Mark → 發表文章 → LightRAG + OpenClaw + qmd (時間: 2026-04-21)",
"Mark → 使用工具 → OpenClaw, grav-blog skill, qmd, LightRAG",
"Mark → 部落格 → dbyellow.com/blog (Grav CMS)",
]
)
4. 三合一查詢流程
async def unified_query(user_query: str):
# Step 1: qmd 混合檢索
qmd_results = await qmd.query({query: user_query, type: "hybrid", limit: 5})
# Step 2: LightRAG 圖譜查詢
graph_results = rag.query(user_query, param=QueryParam(mode="hybrid", top_k=5))
# Step 3: 結果融合
fused_context = deduplicate_and_merge(qmd_results, graph_results)
# Step 4: 注入 prompt
prompt = f"""你是 Mark 的 AI 助理。以下是相關背景:
{fused_context}
Mark 的問題:{user_query}
"""
return await llm.complete(prompt)
def deduplicate_and_merge(qmd_results, graph_results):
"""去除重疊,合併上下文"""
seen = set()
merged = []
# LightRAG 結果優先(結構化)
for r in graph_results:
if r["text"] not in seen:
seen.add(r["text"])
merged.append(f"[圖譜] {r['text']}")
# qmd 結果补充(非結構化)
for r in qmd_results:
if r["text"] not in seen:
seen.add(r["text"])
merged.append(f"[筆記] {r['text']}")
return "\n".join(merged)
為什麼是三合一?
| 維度 | qmd 單獨使用 | LightRAG 單獨使用 | 三合一(本方案) |
|---|---|---|---|
| 關鍵字檢索 | ✅ BM25 精準 | ❌ 依赖 embedding | ✅ qmd 提供 |
| 圖譜推理 | ❌ 無 | ✅ 雙通道支援 | ✅ LightRAG 提供 |
| 非結構化筆記 | ✅ 原生支援 | ⚠️ 需轉換 | ✅ qmd 原生支援 |
| Agent 框架 | ❌ 無 | ❌ 無 | ✅ OpenClaw 提供 |
| 多跳查詢 | ❌ | ✅ | ✅ |
| OpenClaw 整合 | ✅ 有 Skill | ⚠️ 需自整合 | ✅ 最佳 |
qmd 的強項是快速、精準的本地關鍵字/語意檢索,但缺乏圖譜推理能力。LightRAG 的強項是圖譜推理,但對非結構化筆記的管理不如 qmd 直覺。三者互補,剛好填滿彼此的空白。
OpenClaw Skill 整合
qmd 已有現成的 OpenClaw Skill:qmd-external。
在 OpenClaw 中啟用方式:
/skill install qmd-external
之後就可以在對話中直接呼叫:
/qmd search "Mark blog articles 2026"
整合 LightRAG 部分則需要透過 OpenClaw 的 memory_search / sessions_history 工具,在 session 結尾自動寫入。
限制與下一步
目前限制:
- 雙系統同步成本:每次 session 結尾同時寫入 qmd 和 LightRAG,約 1-2 秒延遲
- 模型本地化:qmd 的 LLM re-ranking 若想完全本地,需要 GGUF 模型支援
- 圖譜膨脹:LightRAG 長期使用需定期
rag.gc()清理孤島節點
下一步計畫:
- 將
qmd-externalSkill 改造成支援雙寫(同時寫入 qmd + LightRAG) - 研究 OpenClaw 的
memory_search作為第三層快取的可能性 - 評估將 qmd 的 BM25 結果作為 LightRAG 查詢前預過濾層的可行性
結語
qmd 處理文件級別的精準檢索,LightRAG 處理關係級別的圖譜推理,OpenClaw 處理工作流級別的 Agent 調度。三者分層,各司其職,構成一個真正「有記憶」的本地 AI 助理。
對於需要長期記憶、跨 session 累積上下文,又不願把資料送上雲的使用場景,這套架構值得一試。
相關連結:qmd GitHub / LightRAG GitHub / OpenClaw 官方文件 / qmd-external Skill