دراسة حالة هندسية: بناء محرك استرجاع هجين يجمع بين المتجهات والرسوم البيانية للمؤسسات
Muhammad Talha Sultan
Lead Engineer, Innvo Labs
عندما تتوسع أنظمة البرمجيات للمؤسسات، نادراً ما تُخزن البيانات في تنسيق موحد واحد. تعمل المؤسسات عبر عقود PDF غير هيكلية، وجداول SQL هيكلية، ومخططات علاقات كيانات معقدة توضح الهياكل التنظيمية، وتاريخ المعاملات، وقواعد الامتثال.
عندما تواصل عميل مؤسسي مع إينفو لابس لبناء منصة دعم اتخاذ القرار بالذكاء الاصطناعي فوق 2.5 مليون مستند امتثال مالي، فشلت الاختبارات الأولية باستخدام البحث المتجهي التقليدي (RAG). فبينما حدد البحث المتجهي الفقرات المتشابهة دلالياً بنجاح، كان أعمى عن العلاقات الكيانية متعددة القفزات—مثل تحديد ما إذا كانت شركة تابعة تشترك في الملكية الفعلية مع كيان محظور يقع على بعد خمس طبقات تنظيمية.
لحل هذه المشكلة، قمنا بهندسة **محرك استرجاع هجين يجمع بين المتجهات والرسوم البيانية (GraphRAG)** ينفذ استرجاع المتجهات وتتبع الرسم البياني بالتوازي، ويعيد السياق المدمج في أقل من 85 ميلي ثانية (p95).
إليك دراسة الحالة الهندسية الكاملة لكيفية تصميم، واختبار، ونشر هذا النظام.
1. عائق البحث المتجهي المنفرد
يعتمد البحث المتجهي على التشابه بين التضمينات في فضاء متعدد الأبعاد. يتفوق هذا في مطابقة التشابه المفاهيمي (مثل مطابقة *"مخاطر السيولة"* مع *"نقص الاحتياطي النقدي"*).
ومع ذلك، تفشل التضمينات المتجهية في **استعلامات التفكير العلاقائي** مثل:
> *"ما هي عقود الموردين التي عدلت شروط الدفع عقب الاستحواذ في الربع الثالث على الشركة التابعة X من قبل الشركة القابضة Y؟"*
يقوم المسترجع المتجهي التقليكي بتقسيم الفقرات وتضمينها بشكل مستقل. ليس لديه تمثيل هيكلي يربط الشركة التابعة X بالشركة القابضة Y ما لم يكن هذا الربط مكتوباً صراحة داخل الفقرة المسترجعة.
لالتقاط كل من التشابه المفاهيمي والعلاقات الهيكلية، بنينا محركاً هجيناً يجمع بين **pgvector** (للبحث المتجهي) و **Neo4j** (لتتبع كيانات الرسم البياني).
2. البنية الهندسية وتدفق تنفيذ الاستعلام
يقسم محركنا استعلامات المستخدمين إلى خط تنفيذ متوازٍ:
[استعلام المستخدم]
│
├───────────────────────────────┐
▼ ▼
[مصنف القصد والكيانات] [مولد المتجهات المكثفة]
│ │
▼ ▼
[تتبع الرسم البياني في Neo4j] [بحث التشابه HNSW في pgvector]
(رسم بياني فرعي للكيانات) (أفضل 50 شريحة نصية دلالية)
│ │
└───────────────┬───────────────┘
▼
[دمج الرتب المتبادلة (RRF)]
│
▼
[إعادة الترتيب بالترميز التقاطعي]
│
▼
[سياق مدمج في أقل من 85 ميلي ثانية]المرحلة أ: تنفيذ الاسترجاع المتوازي
عندما يدخل الاستعلام إلى النظام:
**مسار المتجهات**: يتم تحويل الاستعلام إلى تضمين متجهي باستخدام text-embedding-3-large ومطابقته في قاعدة بيانات PostgreSQL مفهرسة باستخدام pgvector مع إعدادات HNSW.
**مسار الرسم البياني**: يستخرج مصنف سريع الكيانات وينفذ استعلام Cypher محسّن في Neo4j لاسترجاع العلاقات والخصائص للكيانات.
المرحلة ب: دمج الرتب المتبادلة وإعادة الترتيب
دمج درجات المتجهات الخام مع عقد الرسم البياني غير بسيط رياضياً لأن مقاييس المسافة تختلف. نحل هذا باستخدام **دمج الرتب المتبادلة (RRF)**:
function calculateRRFScore(
vectorRank: number | null,
graphRank: number | null,
k = 60
): number {
let score = 0;
if (vectorRank !== null) score += 1 / (k + vectorRank);
if (graphRank !== null) score += 1 / (k + graphRank);
return score;
}بعد حساب درجات الدمج، تمر أفضل 30 نتيجة مرشحة عبر **نموذج إعادة ترتيب تقاطعي محلي** (BGE-Reranker-Large)، مما يقلص السياق النهائي إلى أفضل 6 عناصر أكثر صلة.
3. فهارس قواعد البيانات وتحسين زمن الاستجابة
تحقيق زمن استجابة أقل من 100 ميلي ثانية تطلب ضبطاً دقيقاً لفهارس قواعد البيانات:
- **ضبط pgvector**: قمنا بإعداد
ef_search = 40أثناء تشغيل الاستعلام. وفر هذا معدل استرجاع 98.2% مع الحفاظ على زمن البحث المتجهي أقل من 14 ميلي ثانية لـ 2.5 مليون متجه.
- **تهيئة Neo4j**: تم إنشاء فهارس البحث عن الكيانات على مفاتيح مركبة
(EntityName, EntityType). قمنا بتهيئة الذاكرة المؤقتة لـ Neo4j للحفاظ على تتبع الرسم البياني تحت 22 ميلي ثانية.
- **الذاكرة المؤقتة الدلالية في Redis**: تم تخزين الرسوم البيانية والتجمعات المتجهية المتكررة في Redis. استجابت طلبات الذاكرة المؤقتة في أقل من 4 ميلي ثانية.
4. النتائج واختبارات الأداء في الإنتاج
قمنا بتقييم محرك GraphRAG الهجين مقابل نظام RAG المتجهي التقليدي عبر 500 سؤال امتثال علاقاتي معقد:
| المقياس | البحث المتجهي المنفرد | محرك GraphRAG الهجين | نسبة التحسن |
| :--- | :--- | :--- | :--- |
| **معدل الاسترجاع Recall@10** | 68.5% | **94.2%** | +25.7% |
| **دقة الاستعلامات العلاقاتية** | 41.2% | **89.6%** | +48.4% |
| **زمن استجابة p95** | 142ms | **82ms** | أسرع بنسبة 42% |
| **معدل هلوسة النموذج** | 14.8% | **2.1%** | تخفيض بنسبة 85% |
الدروس الهندسية المستفادة
**البحث المتجهي لا يكفي لبيانات المؤسسات المعقدة**: إضافة طبقة الرسم البياني توفر السياق العلاقاتي الذي تفتقده التضمينات المتجهية.
**التنفيذ المتوازي إجباري**: تشغيل استعلامات Cypher والبحث المتجهي بالتوازي يمنع تراكم زمن الاستجابة.
**نماذج إعادة الترتيب تلغي ضوضاء المطالبات**: تضمن إعادة ترتيب النتائج وصول السياق عالي الجودة فقط إلى النموذج اللغوي، مما يقلل استهلاك التوكنز ويزيد من دقة الاستجابة.
من خلال الدمج بين الرسوم البيانية العلاقاتية والبحث المتجهي الدلالي، يمكن للبرمجيات المخصصة الإجابة على استعلامات المؤسسات المعقدة بدقة متناهية وبأقل زمن استجابة.