Hero Image

LightRAG + OpenClaw + qmd:打造有記憶的本地 AI 助理

前言

多數 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 加持)

工作流程:

  1. 寫入階段:OpenClaw session 結束時,自動抽取關鍵事實

    • qmd:寫入 Markdown notes(適用於非結構化筆記、日誌)
    • LightRAG:寫入知識圖譜(適用於實體關係抽取)
  2. 查詢階段:用戶提問時

    • 先走 qmd BM25 + 向量混合檢索,取最相關的 Markdown 段落
    • 再走 LightRAG 圖譜查詢,取相關實體與關係路徑
    • 最後將兩者結果融合,注入 prompt
  3. 融合策略

    • 如果 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 結尾自動寫入。


限制與下一步

目前限制:

  1. 雙系統同步成本:每次 session 結尾同時寫入 qmd 和 LightRAG,約 1-2 秒延遲
  2. 模型本地化:qmd 的 LLM re-ranking 若想完全本地,需要 GGUF 模型支援
  3. 圖譜膨脹:LightRAG 長期使用需定期 rag.gc() 清理孤島節點

下一步計畫:

  • qmd-external Skill 改造成支援雙寫(同時寫入 qmd + LightRAG)
  • 研究 OpenClaw 的 memory_search 作為第三層快取的可能性
  • 評估將 qmd 的 BM25 結果作為 LightRAG 查詢前預過濾層的可行性

結語

qmd 處理文件級別的精準檢索,LightRAG 處理關係級別的圖譜推理,OpenClaw 處理工作流級別的 Agent 調度。三者分層,各司其職,構成一個真正「有記憶」的本地 AI 助理。

對於需要長期記憶、跨 session 累積上下文,又不願把資料送上雲的使用場景,這套架構值得一試。


相關連結:qmd GitHub / LightRAG GitHub / OpenClaw 官方文件 / qmd-external Skill