الانتقال إلى المحتوى الرئيسي

محرك ذاكرة QMD

QMD هو خدمة جانبية للبحث محلية أولًا تعمل إلى جانب OpenClaw. وهو يجمع بين BM25 والبحث بالمتجهات وإعادة الترتيب في ملف ثنائي واحد، ويمكنه فهرسة محتوى يتجاوز ملفات ذاكرة مساحة العمل الخاصة بك.

ما الذي يضيفه مقارنة بالمحرك المدمج

  • إعادة الترتيب وتوسيع الاستعلام لتحسين الاسترجاع.
  • فهرسة أدلة إضافية — مستندات المشروع، وملاحظات الفريق، وأي شيء على القرص.
  • فهرسة نصوص الجلسات — لاسترجاع المحادثات السابقة.
  • محلي بالكامل — يعمل عبر Bun + node-llama-cpp، ويقوم بتنزيل نماذج GGUF تلقائيًا.
  • احتياط تلقائي — إذا لم يكن QMD متاحًا، يعود OpenClaw إلى المحرك المدمج بسلاسة.

البدء

المتطلبات المسبقة

  • ثبّت QMD: npm install -g @tobilu/qmd أو bun install -g @tobilu/qmd
  • إصدار SQLite يسمح بالامتدادات (brew install sqlite على macOS).
  • يجب أن يكون QMD موجودًا على PATH الخاص بالبوابة.
  • يعمل macOS وLinux مباشرة. ويُدعَم Windows بأفضل شكل عبر WSL2.

التفعيل

{
  memory: {
    backend: "qmd",
  },
}
ينشئ OpenClaw دليل QMD مستقلًا ذاتيًا ضمن ~/.openclaw/agents/<agentId>/qmd/ ويدير دورة حياة الخدمة الجانبية تلقائيًا — حيث تتم إدارة المجموعات والتحديثات وعمليات التضمين نيابةً عنك. وهو يفضّل أشكال مجموعة QMD الحالية واستعلامات MCP، لكنه لا يزال يعود إلى أعلام المجموعات القديمة --mask وأسماء أدوات MCP الأقدم عند الحاجة.

كيف تعمل الخدمة الجانبية

  • ينشئ OpenClaw مجموعات من ملفات ذاكرة مساحة العمل وأي memory.qmd.paths مُعدّة، ثم يشغّل qmd update و qmd embed عند الإقلاع وبشكل دوري (كل 5 دقائق افتراضيًا).
  • يتم تنفيذ تحديث الإقلاع في الخلفية حتى لا يتم حظر بدء المحادثة.
  • تستخدم عمليات البحث searchMode المُعدّ (الافتراضي: search؛ ويدعم أيضًا vsearch و query). إذا فشل وضع ما، يعيد OpenClaw المحاولة باستخدام qmd query.
  • إذا فشل QMD بالكامل، يعود OpenClaw إلى محرك SQLite المدمج.
قد يكون البحث الأول بطيئًا — إذ يقوم QMD بتنزيل نماذج GGUF تلقائيًا (~2 GB) من أجل إعادة الترتيب وتوسيع الاستعلام عند أول تشغيل لـ qmd query.

تجاوزات النموذج

تُمرَّر متغيرات بيئة نموذج QMD كما هي من عملية البوابة، لذا يمكنك ضبط QMD على مستوى عام من دون إضافة إعدادات جديدة في OpenClaw:
export QMD_EMBED_MODEL="hf:Qwen/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf"
export QMD_RERANK_MODEL="/absolute/path/to/reranker.gguf"
export QMD_GENERATE_MODEL="/absolute/path/to/generator.gguf"
بعد تغيير نموذج التضمين، أعد تشغيل التضمينات حتى يتطابق الفهرس مع فضاء المتجهات الجديد.

فهرسة مسارات إضافية

وجّه QMD إلى أدلة إضافية لجعلها قابلة للبحث:
{
  memory: {
    backend: "qmd",
    qmd: {
      paths: [{ name: "docs", path: "~/notes", pattern: "**/*.md" }],
    },
  },
}
تظهر المقاطع من المسارات الإضافية على هيئة qmd/<collection>/<relative-path> في نتائج البحث. ويفهم memory_get هذه البادئة ويقرأ من جذر المجموعة الصحيح.

فهرسة نصوص الجلسات

فعّل فهرسة الجلسات لاسترجاع المحادثات السابقة:
{
  memory: {
    backend: "qmd",
    qmd: {
      sessions: { enabled: true },
    },
  },
}
تُصدَّر النصوص على هيئة أدوار مستخدم/مساعد منقّحة إلى مجموعة QMD مخصصة ضمن ~/.openclaw/agents/<id>/qmd/sessions/.

نطاق البحث

افتراضيًا، لا تظهر نتائج بحث QMD إلا في جلسات الرسائل المباشرة (وليس في المجموعات أو القنوات). اضبط memory.qmd.scope لتغيير ذلك:
{
  memory: {
    qmd: {
      scope: {
        default: "deny",
        rules: [{ action: "allow", match: { chatType: "direct" } }],
      },
    },
  },
}
عندما يمنع النطاق عملية بحث، يسجل OpenClaw تحذيرًا مع القناة المشتقة و نوع المحادثة بحيث تصبح النتائج الفارغة أسهل في تصحيحها.

الاستشهادات

عندما تكون memory.citations مساوية لـ auto أو on، تتضمن مقاطع البحث تذييلًا بصيغة Source: <path#line>. اضبط memory.citations = "off" لإزالة التذييل مع الاستمرار في تمرير المسار إلى الوكيل داخليًا.

متى تستخدمه

اختر QMD عندما تحتاج إلى:
  • إعادة الترتيب للحصول على نتائج أعلى جودة.
  • البحث في مستندات المشروع أو الملاحظات خارج مساحة العمل.
  • استرجاع محادثات الجلسات السابقة.
  • بحث محلي بالكامل من دون مفاتيح API.
بالنسبة إلى الإعدادات الأبسط، يعمل المحرك المدمج جيدًا من دون أي تبعيات إضافية.

استكشاف الأخطاء وإصلاحها

هل QMD غير موجود؟ تأكد من أن الملف الثنائي موجود على PATH الخاص بالبوابة. إذا كان OpenClaw يعمل كخدمة، فأنشئ رابطًا رمزيًا: sudo ln -s ~/.bun/bin/qmd /usr/local/bin/qmd. هل البحث الأول بطيء جدًا؟ يقوم QMD بتنزيل نماذج GGUF عند أول استخدام. قم بالتهيئة المسبقة باستخدام qmd query "test" مع استخدام أدلة XDG نفسها التي يستخدمها OpenClaw. هل انتهت مهلة البحث؟ زد قيمة memory.qmd.limits.timeoutMs (الافتراضي: 4000ms). اضبطها على 120000 للأجهزة الأبطأ. هل النتائج فارغة في محادثات المجموعات؟ تحقّق من memory.qmd.scope — فالافتراضي يسمح فقط بجلسات الرسائل المباشرة. هل تتسبب المستودعات المؤقتة الظاهرة في مساحة العمل في ENAMETOOLONG أو تعطّل الفهرسة؟ يعتمد اجتياز QMD حاليًا على سلوك ماسح QMD الأساسي بدلًا من قواعد الروابط الرمزية المدمجة في OpenClaw. احتفظ بعمليات سحب monorepo المؤقتة ضمن أدلة مخفية مثل .tmp/ أو خارج جذور QMD المفهرسة إلى أن يوفّر QMD اجتيازًا آمنًا من الحلقات أو عناصر تحكم صريحة للاستبعاد.

الإعدادات

للاطلاع على سطح الإعدادات الكامل (memory.qmd.*) وأوضاع البحث وفترات التحديث وقواعد النطاق وجميع الخيارات الأخرى، راجع مرجع إعدادات الذاكرة.