# مواصفات فنية لتحسين أداء GraphRAG ## نظرة عامة تصف هذه المواصفات تحسينات شاملة للأداء لخوارزمية GraphRAG (Graph Retrieval-Augmented Generation) في TrustGraph. تعاني التنفيذ الحالي من نقاط اختناق كبيرة في الأداء تؤثر على قابلية التوسع وأوقات الاستجابة. تعالج هذه المواصفات أربعة مجالات رئيسية للتحسين: 1. **تحسين اجتياز الرسم البياني**: التخلص من استعلامات قاعدة البيانات المتكررة وغير الفعالة وتنفيذ استكشاف الرسم البياني المجمّع. 2. **تحسين حل التسميات**: استبدال استرداد التسميات التسلسلي بعمليات متوازية/مجمعة. 3. **تحسين استراتيجية التخزين المؤقت**: تنفيذ تخزين مؤقت ذكي مع الإخلاء حسب الأقل استخدامًا (LRU) والتحميل المسبق. 4. **تحسين الاستعلام**: إضافة تجميع النتائج وتخزين تضمينات الاستعلام لتحسين أوقات الاستجابة. ## الأهداف - **تقليل حجم استعلامات قاعدة البيانات**: تحقيق تقليل بنسبة 50-80% في إجمالي استعلامات قاعدة البيانات من خلال التجميع والتخزين المؤقت. - **تحسين أوقات الاستجابة**: استهداف سرعة بناء الرسوم البيانية الفرعية 3-5 مرات أسرع وحل التسميات 2-3 مرات أسرع. - **تعزيز قابلية التوسع**: دعم رسوم بيانية معرفية أكبر مع إدارة أفضل للذاكرة. - **الحفاظ على الدقة**: الحفاظ على وظائف GraphRAG الحالية وجودة النتائج. - **تمكين التزامن**: تحسين إمكانات المعالجة المتوازية للطلبات المتزامنة المتعددة. - **تقليل البصمة الذاكرة**: تنفيذ هياكل بيانات وإدارة ذاكرة فعالة. - **إضافة إمكانية المراقبة**: تضمين مقاييس الأداء وقدرات المراقبة. - **ضمان الموثوقية**: إضافة معالجة مناسبة للأخطاء وآليات المهلة. ## الخلفية يظهر التنفيذ الحالي لـ GraphRAG في `trustgraph-flow/trustgraph/retrieval/graph_rag/graph_rag.py` عدة مشاكل أداء حرجة تؤثر بشدة على قابلية توسع النظام: ### المشاكل الحالية في الأداء **1. اجتياز الرسم البياني غير الفعال (`follow_edges` function، الأسطر 79-127)** - يقوم بإجراء 3 استعلامات منفصلة لقاعدة البيانات لكل كيان ولكل مستوى عمق. - نمط الاستعلام: استعلامات تعتمد على الموضوع، تعتمد على المرجع، وتعتمد على الكائن لكل كيان. - لا يوجد تجميع: يعالج كل استعلام كيانًا واحدًا فقط في كل مرة. - لا يوجد اكتشاف دورة: يمكن إعادة زيارة نفس العقد عدة مرات. - يؤدي التنفيذ المتكرر بدون تجميع إلى تعقيد أسي. - التعقيد الزمني: O(entities × max_path_length × triple_limit³) **2. حل تسلسلي للتسميات (`get_labelgraph` function، الأسطر 144-171)** - يعالج كل مكون ثلاثي (الموضوع، المرجع، الكائن) بالتسلسل. - قد يؤدي كل استدعاء `maybe_label` إلى تشغيل استعلام قاعدة بيانات. - لا يوجد تنفيذ متوازي أو تجميع لاستعلامات التسميات. - يؤدي إلى ما يصل إلى 3 × مكالمات قاعدة بيانات فردية لحجم الرسوم البيانية الفرعية. **3. استراتيجية تخزين مؤقت بدائية (`maybe_label` function، الأسطر 62-77)** - ذاكرة تخزين مؤقت بسيطة للقواميس بدون حدود حجم أو TTL (وقت انتهاء الصلاحية). - لا توجد سياسة إخلاء ذاكرة التخزين المؤقت تؤدي إلى نمو غير محدود للذاكرة. - تؤدي أخطاء ذاكرة التخزين المؤقت إلى استعلامات قاعدة بيانات فردية. - لا يوجد تحميل مسبق أو تسخين ذكي لذاكرة التخزين المؤقت. **4. أنماط استعلام غير مثالية** - استعلامات تشابه متجه الكيان غير مخزنة مؤقتًا بين الطلبات المتشابهة. - لا يوجد تجميع للنتائج لـ أنماط الاستعلام المتكررة. - استعلامات غير محسنة لـ الأنماط الشائعة للوصول. **5. مشاكل حرجة في دورة حياة الكائنات (`rag.py:96-102`)** - **كائن GraphRag يتم إعادة إنشاؤه لكل طلب**: يتم إنشاء نسخة جديدة لكل استعلام، مما يؤدي إلى فقدان جميع فوائد ذاكرة التخزين المؤقت. - **عمر كائن الاستعلام قصير للغاية**: يتم إنشاؤه وتدميره داخل تنفيذ استعلام واحد (الأسطر 201-207). - **تتم إعادة تعيين ذاكرة التخزين المؤقت للتسميات لكل طلب**: يتم فقدان تسخين ذاكرة التخزين المؤقت والمعرفة المتراكمة بين الطلبات. - **نفقات إعادة إنشاء العميل**: قد يتم إعادة إنشاء عملاء قاعدة البيانات لكل طلب. - **لا يوجد تحسين عبر الطلبات**: لا يمكن الاستفادة من أنماط الاستعلام أو مشاركة النتائج. ### تحليل تأثير الأداء السيناريو الأسوأ حاليًا لطلب نموذجي: - **استرداد الكيان**: استعلام تشابه متجه واحد. - **اجتياز الرسم البياني**: entities × max_path_length × 3 × triple_limit استعلامات. - **حل التسميات**: subgraph_size × 3 استعلامات تسمية فردية. بالإعدادات الافتراضية (50 كيانًا، طول المسار 2، حد ثلاثي 30، حجم الرسم البياني الفرعية 150): - **الحد الأدنى من الاستعلامات**: 1 + (50 × 2 × 3 × 30) + (150 × 3) = **9,451 استعلام لقاعدة البيانات**. - **وقت الاستجابة**: 15-30 ثانية للرسوم البيانية متوسطة الحجم. - **استخدام الذاكرة**: نمو غير محدود لذاكرة التخزين المؤقت بمرور الوقت. - **فعالية ذاكرة التخزين المؤقت**: 0% - تتم إعادة تعيين ذاكرة التخزين المؤقت في كل طلب. - **نفقات إنشاء الكائنات**: يتم إنشاء/تدمير كائنات GraphRag + Query لكل طلب. تعالج هذه المواصفات هذه الثغرات من خلال تنفيذ استعلامات مجمعة، وتخزين مؤقت ذكي، ومعالجة متوازية. من خلال تحسين أنماط الاستعلام والوصول إلى البيانات، يمكن لـ TrustGraph: - دعم الرسوم البيانية المعرفية على مستوى المؤسسات مع ملايين الكيانات. - توفير أوقات استجابة فرعية من الثانية للطلبات النموذجية. - التعامل مع مئات الطلبات المتزامنة لـ GraphRAG. - التوسع بكفاءة مع حجم الرسم البيانية وتعقيدها. ## التصميم التقني ### البنية التحتية يتطلب تحسين أداء GraphRAG المكونات التقنية التالية: #### 1. **إعادة هيكلة معمارية لدورة حياة الكائنات** - **جعل GraphRag طويل الأمد**: نقل مثيل GraphRag إلى مستوى المعالج للاستمرار عبر الطلبات. - **الحفاظ على ذاكرات التخزين المؤقت**: الحفاظ على ذاكرة التخزين المؤقت للتسميات، وذاكرة التخزين المؤقت للتضمينات، وذاكرة التخزين المؤقت لنتائج الاستعلام بين الطلبات. - **تحسين كائن الاستعلام**: إعادة هيكلة الاستعلام كسياق تنفيذ خفيف الوزن، وليس حاوية بيانات. - **استمرارية الاتصال**: الحفاظ على اتصالات عملاء قاعدة البيانات عبر الطلبات. الوحدة: `trustgraph-flow/trustgraph/retrieval/graph_rag/rag.py` (تم التعديل) #### 2. **محرك اجتياز محسّن للرسم البياني** - استبدال `follow_edges` المتكرر ببحث عرضي تكراري. - تنفيذ معالجة مجمعة للكيانات على كل مستوى من مستويات الاجتياز. - إضافة اكتشاف دورة باستخدام تتبع العقد التي تمت زيارتها. - تضمين إنهاء مبكر عند الوصول إلى الحدود. الوحدة: `trustgraph-flow/trustgraph/retrieval/graph_rag/optimized_traversal.py` #### 3. **نظام حل تسميات متوازي** - تجميع استعلامات التسميات لعدة كيانات في وقت واحد. - تنفيذ أنماط async/await للوصول المتزامن إلى قاعدة البيانات. - إضافة تحميل مسبق ذكي لـ أنماط التسميات الشائعة. - تضمين استراتيجيات تسخين لذاكرة التخزين المؤقت للتسميات. الوحدة: `trustgraph-flow/trustgraph/retrieval/graph_rag/label_resolver.py` #### 4. **طبقة تخزين مؤقت محافظة للتسميات** - ذاكرة تخزين مؤقت LRU مع TTL قصير للتسميات فقط (5 دقائق) لتحقيق التوازن بين الأداء مقابل الاتساق. - مقاييس ذاكرة التخزين المؤقت ونسبة الضبط. - **لا يوجد تخزين مؤقت للتضمينات**: يتم بالفعل تخزين التضمينات مؤقتًا لكل استعلام. - **لا يوجد تخزين مؤقت للنتائج**: يمنع نتائج الرسوم البيانية الفرعية القديمة من الكيانات/العلاقات المحذوفة. الوحدة: `trustgraph-flow/trust/graph/label_cache.py` #### 5. **تحسين الاستعلام والمراقبة** - جمع مقاييس الأداء. - تطبيق مهلة على الاستعلامات. - إضافة دائرة كهربائية لمنع الاستخدام المفرط للموارد. الوحدة: `trustgraph-flow/trust/graph/query_optimizer.py` ## اعتبارات الاتساق للذاكرة المؤقتة **موازنات بين بيانات قديمة**: - **ذاكرة التخزين المؤقت للتسميات (TTL 5 دقائق)**: خطر تقديم تسميات الكيانات المحذوفة/المتجددة. - **لا يوجد تخزين مؤقت للتضمينات**: ليس مطلوبًا - يتم تخزين التضمينات بالفعل مؤقتًا لكل استعلام. - **لا يوجد تخزين مؤقت للنتائج**: يمنع نتائج الرسم البياني الفرعية القديمة من الكيانات/العلاقات المحذوفة. **استراتيجيات التخفيف**: - **قيم TTL متحفظة**: الموازنة بين مكاسب الأداء (10-20٪) مقابل نضارة البيانات. - **خطافات إبطال ذاكرة التخزين المؤقت**: تكامل اختياري مع أحداث تعديل الرسم البياني. - **لوحات معلومات المراقبة**: تتبع معدلات ضرب ذاكرة التخزين المؤقت مقابل حوادث التقادم. - **سياسات ذاكرة التخزين المؤقت القابلة للتكوين**: السماح بضبط لكل نشر بناءً على تكرار التعديل. **تكوين ذاكرة التخزين المؤقت الموصى به حسب معدل تعديل الرسم البياني**: - **تعديل عالي (>100 تغيير / ساعة)**: TTL = 60 ثانية، أحجام ذاكرة تخزين مؤقت أصغر. - **تعديل متوسط (10-100 تغيير / ساعة)**: TTL = 300 ثانية (افتراضي). - **تعديل منخفض (<10 تغيير / ساعة)**: TTL = 600 ثانية، أحجام ذاكرة تخزين مؤقت أكبر. ## الاعتبارات الأمنية **منع حقن الاستعلام**: - التحقق من صحة جميع معرفات الكيانات ومعلمات الاستعلام. - استخدام استعلامات مُعلمات لجميع التفاعلات مع قاعدة البيانات. - تنفيذ حدود تعقيد الاستعلام لمنع هجمات الحرمان من الخدمة. **حماية الموارد**: - فرض حدود قصوى لحجم الرسم البياني الفرعية. - تنفيذ مهلات على الاستعلام لمنع استنفاد الموارد. - إضافة مراقبة استخدام الذاكرة وحدود. **التحكم في الوصول**: - الحفاظ على عزل المستخدم والمجموعة الحالي. - إضافة تسجيل تدقيق للعمليات التي تؤثر على الأداء. - تنفيذ تحديد المعدل للعمليات المكلفة. ## اعتبارات الأداء ### التحسينات المتوقعة في الأداء **تقليل الاستعلام**: - الحالي: ~ 9000+ استعلام لطلب نموذجي. - مُحسَّن: ~ 50-100 استعلام مجمعة (تقليل بنسبة 98٪). **تحسينات أوقات الاستجابة**: - اجتياز الرسم البياني: 15-20 ثانية → 3-5 ثوانٍ (4-5 مرات أسرع). - حل التسميات: 8-12 ثانية → 2-4 ثوانٍ (3 مرات أسرع). - الاستعلام الإجمالي: 25-35 ثانية → 6-10 ثوانٍ (تحسين بمقدار 3-4 مرات). **كفاءة الذاكرة**: - أحجام ذاكرة التخزين المؤقت المحدودة تمنع تسرب الذاكرة. - هياكل بيانات فعالة تقلل البصمة الذاكرة بنسبة ~ 40٪. - إدارة أفضل للذاكرة من خلال التنظيف المناسب للموارد. **تحسينات قابلية التوسع**: - دعم رسوم بيانية معرفية أكبر بنسبة 3-5 مرات (محدود باحتياجات اتساق ذاكرة التخزين المؤقت). - سعة أعلى للطلبات المتزامنة بنسبة 3-5 مرات. - استخدام أفضل للموارد من خلال إعادة استخدام الاتصال. ### مراقبة الأداء **مقاييس في الوقت الفعلي**: - أوقات تنفيذ الاستعلام حسب نوع العملية. - معدلات ضرب وفعالية ذاكرة التخزين المؤقت. - استخدام مجموعة اتصالات قاعدة البيانات. - استخدام الذاكرة وجمع البيانات المهملة. **قياس الأداء**: - اختبار أداء مقابل التنفيذ الحالي. - اختبار التحميل بأحجام بيانات وتعقيدات مختلفة. - اختبار الضغط لحدود الموارد. - اختبار الانحدار للتحسينات في الأداء. ## استراتيجية الاختبار ### اختبار الوحدة - اختبار مكون فردي لـ الاجتياز، والتخزين المؤقت، وحل التسميات. - محاكاة تفاعلات قاعدة البيانات لاختبار الأداء. - اختبار الإخلاء و TTL ذاكرة التخزين المؤقت. - سيناريوهات معالجة الأخطاء والمهلات. ### اختبار التكامل - اختبار GraphRAG الشامل مع التحسينات. - اختبار تفاعل قاعدة البيانات مع بيانات حقيقية. - اختبار التعامل مع الطلبات المتزامنة وإدارة الموارد. - الكشف عن تسرب الذاكرة والتحقق من تنظيف الموارد. ### اختبار الأداء - اختبار أداء مقابل التنفيذ الحالي. - اختبار التحميل بأحجام وتعقيدات مختلفة للرسم البياني. - اختبار الضغط لحدود الذاكرة والاتصال. - اختبار الانحدار للتحسينات في الأداء. ### اختبار التوافق - التحقق من توافق واجهة برمجة تطبيقات GraphRAG الحالية. - الاختبار مع خلفيات قاعدة بيانات رسم بياني مختلفة. - التحقق من دقة النتائج مقارنة بالتنفيذ الحالي. ## خطة التنفيذ ### النهج المباشر للتنفيذ نظرًا للسماح بتغييرات واجهة برمجة التطبيقات، قم بتنفيذ التحسينات مباشرة دون تعقيد الترحيل: 1. **استبدل طريقة `follow_edges`**: أعد كتابة مع اجتياز مجمّع تكراري. 2. **تحسين `get_labelgraph`**: قم بتنفيذ حل تسميات متوازي. 3. **أضف GraphRag طويل الأمد**: قم بتعديل المعالج لاستخدام نسخة مستمرة. 4. **قم بتنفيذ استراتيجية التخزين المؤقت**: أضف طبقة تخزين مؤقت إلى فئة GraphRag. ### نطاق التغييرات - **فئة الاستعلام**: استبدل ~50 سطرًا في `follow_edges`، وأضف ~30 سطرًا للتعامل مع التجميع. - **فئة GraphRag**: أضف طبقة تخزين مؤقت (~40 سطرًا). - **فئة المعالج**: قم بتعديل لاستخدام مثيل GraphRag دائم (~20 سطرًا). - **إجمالي**: ~ 140 سطرًا من التغييرات المركزة، في الغالب داخل الفئات الحالية. ## جدول زمني **الأسبوع 1: التنفيذ الأساسي** - استبدل `follow_edges` باجتياز تكراري مجمّع. - قم بتنفيذ حل تسميات متوازي في `get_labelgraph`. - أضف مثيل GraphRag طويل الأمد إلى المعالج. - قم بتنفيذ طبقة التخزين المؤقت للتسميات. **الأسبوع 2: الاختبار والتكامل** - اختبارات الوحدة لمنطق الاجتياز والتخزين المؤقت الجديد. - قياس الأداء مقابل التنفيذ الحالي. - اختبار التكامل مع بيانات الرسم البياني الحقيقية. - مراجعة الكود والتحسين. **الأسبوع 3: النشر** - نشر التنفيذ المُحسَّن. - مراقبة تحسينات الأداء. - ضبط TTL ذاكرة التخزين المؤقت وأحجام الدفعات بناءً على الاستخدام الفعلي. ## أسئلة مفتوحة - **تجميع الاتصال بقاعدة البيانات**: هل يجب علينا تنفيذ تجميع اتصال مخصص أم الاعتماد على تجميع عملاء قاعدة البيانات الحالي؟ - **استمرارية ذاكرة التخزين المؤقت**: هل يجب أن تستمر ذاكرات التخزين المؤقت للتسميات والتضمينات عبر عمليات إعادة تشغيل الخدمة؟ - **التخزين المؤقت الموزع**: بالنسبة لنشر متعدد المثيلات، هل يجب علينا تنفيذ تخزين مؤقت موزع باستخدام Redis/Memcached؟ - **تنسيق نتيجة الاستعلام**: هل يجب علينا تحسين التمثيل الداخلي للثلاثي لتحسين كفاءة الذاكرة؟ - **تكامل المراقبة**: ما هي المقاييس التي يجب عرضها على أنظمة المراقبة الحالية (Prometheus، إلخ)؟ ## المراجع - [التنفيذ الأصلي لـ GraphRAG](trustgraph-flow/trustgraph/retrieval/graph_rag/graph_rag.py) - [مبادئ معمارية TrustGraph](architecture-principles.md) - [مواصفات إدارة المجموعة](collection-management.md)