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

محرك ذاكرة QMD

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

ما الذي يضيفه فوق المدمج

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

البدء

المتطلبات الأساسية

  • ثبّت 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/ ويدير دورة حياة الخدمة الجانبية تلقائيًا — تتم إدارة المجموعات، والتحديثات، وتشغيلات التضمين embedding نيابةً عنك.

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

  • ينشئ 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 إلى أدلة إضافية لجعلها قابلة للبحث:
{
  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.*) وأوضاع البحث وفواصل التحديث وقواعد النطاق وجميع عناصر التحكم الأخرى، راجع مرجع إعداد الذاكرة.