
بقلم: يوسف | محرر أدوات الذكاء الاصطناعي · صوت تحريري بإشراف بشري
عندما يسأل المستخدم نظام RAG عن “ما متطلبات التحكم في إدارة الحسابات؟”، والوثيقة المستهدفة تمتد على 492 صفحة من معايير الأمن الحكومية الأمريكية، فالنهج الساذج واضح ومكلف: تحويل كل صفحة إلى متجه وسحب أقرب K نتيجة. النتيجة؟ الإجابة الحقيقية — التحكم AC-2 في الصفحات 46 إلى 50 — تصل مختلطةً بعشرات التحكمات الأخرى التي تشترك في كلمات مثل “account” و”access” و”control”، والنموذج يخمّن (وفقاً لـ Towards Data Science). تُدفع الفاتورة مرتين: مرة عند التضمين الكامل، ومرة عند الإجابة المشوشة.
المقاربة التي يطرحها هذا المقال — ضمن سلسلة Enterprise Document Intelligence — هي محاكاة ما يفعله الخبير البشري: لا يفتح الصفحة الأولى، بل يفتح الفهرس. لكن المشكلة أن فهرس NIST SP 800-53 وحده يحتوي على 358 مدخلاً موزعة على ثلاثة مستويات، فلا يمكن إلقاؤه دفعة واحدة على النموذج كما لا يمكن إلقاء الوثيقة كاملة. الحل هو حلقة تنازل هرمية: مستوى واحد في كل استدعاء، من الأعلى إلى الأدق.

هيكل الوثيقة يجعل هذا ممكناً. المحلل اللغوي يحوّل المخطط التفصيلي الأصلي لملف PDF إلى جدول toc_df، صف واحد لكل عنوان، ليصير عندنا 358 صفاً تغطي ثلاثة مستويات: أحد عشر فصلاً في القمة، عشرون عائلة تحكم في المنتصف، و316 تحكماً فردياً (AC-1، AC-2…) في القاع، كل منها بنطاق صفحاته. هذه الشجرة هي ما يتسلق عليه الاسترجاع.
آلية الحلقة مبنية على دالة واحدة تُستدعى مرة في كل مستوى، اسمها reason_on_toc. في كل دورة تقرأ النموذج المستوى الحالي كنص خطي — عنوان، نطاق صفحات، وعند الغموض عدد ضربات الكلمات المفتاحية — ثم تختار الفرع، وتفتح أبناءه، وتنزل. الحلقة تتوقف في ثلاث حالات: الوصول إلى ورقة شجرة نهائية، أو إلى قسم صغير بما يكفي للقراءة المباشرة، أو إلى سؤال من نوع “قائمة” يحتاج كل بنود قسم بأكمله. فيما يخص السؤال عن إدارة الحسابات، تسير الحلقة هكذا بالكود الفعلي:
level = toc_df[toc_df.level == toc_df.level.min()] # 11 chapter titles
while True:
pick = reason_on_toc(question, level, client=client) # one LLM call
section = level[level.id.isin(pick.section_ids)]
kids = immediate_children(toc_df, section)
if kids.empty or section.n_pages <= SMALL: # leaf, or small enough
break
level = kids # open it, descend
# 11 chapters -> 20 families -> 25 controls -> AC-2 ACCOUNT MANAGEMENT (pp. 46-50)
النتيجة العملية: 56 سطراً فقط تقرأها النماذج عبر ثلاثة استدعاءات صغيرة، بدلاً من 358 مدخلاً دفعة واحدة، ثم النموذج يقرأ 5 صفحات فحسب من أصل 492، مع بقاء 315 تحكماً أخرى خارج السياق تماماً (وفقاً لـ Towards Data Science). المسار: أحد عشر فصلاً ← عشرون عائلة ← خمسة وعشرون تحكماً ← AC-2 إدارة الحسابات.

حالة الإيقاف الثالثة — سؤال القائمة — تستحق وقفة. عند تجربة إطار NIST للأمن السيبراني 2.0 مع سؤال يطلب “كل التصنيفات الفرعية لمحور GOVERN”، لا تنزل الحلقة إلى تصنيف فرعي واحد بل تقرأ الملحق كاملاً، لأن طبيعة السؤال تستدعي الاستيعاب الكامل لا التحديد. هذا يعني أن المنطق يتكيّف مع نوع السؤال، لا مجرد بنية الفهرس. وعندما تتشابه عنوانان ولا يمكن للنموذج التمييز بينهما، يلجأ الكود إلى عداد الكلمات المفتاحية كمرجّح — سطر واحد إضافي لكل مدخل، لا عمود جديد يُضخّم الجدول. المثال: عبارة “least privilege” تظهر في قسم Access Control تطبيقاً وفي قاموس المصطلحات تعريفاً، وهذا العداد يحسم الفرق.
الزاوية الهندسية هنا مهمة: الحلقة تمتلك محفزاً واضحاً (فرع عريض بأبناء)، إنهاءً محدداً (ورقة أو قسم صغير أو قائمة)، وتعافياً يغيّر شيئاً في كل دورة (النزول مستوى واحداً دون إعادة قراءة المستوى السابق)، والعمق مقيّد بعمق الشجرة ذاتها فلا خطر الدوران اللانهائي. ينفصل هذا النمط عن حلقات خط الأنابيب في الجزء الثالث من السلسلة: تلك تتفاعل مع نتيجة توليد سابقة، هذه تتفاعل مع بنية الوثيقة.
المكسب المزدوج نادر في هندسة الاسترجاع: الدقة والتوفير في نفس الوقت. النهج المسطّح يُنافس AC-2 ضد كل تحكم يذكر كلمة “account” أو “access”؛ التوجيه الهرمي يلتزم بـ AC-2 بالاسم ويقرأ صفحاته الخمس متتالية لا مفككة. من ناحية التوكنز: النهج الساذج يضمّن 492 صفحة مرة واحدة ويدفع تكلفة الاسترجاع على كل استعلام؛ التوجيه الهرمي لا يضمّن نص الوثيقة أصلاً، ويقتصر على 56 سطراً من عناوين ثم الصفحات الخمس النهائية. على مستوى آلاف الوثائق، هذا الفارق هو الخط الفاصل بين نظام قابل للتشغيل وآخر لا يُشغَّل.
القفزة من وثيقة واحدة إلى مجلد كامل تبقى نفس الخريطة بمستوى إضافي: القمة تصبح قائمة الملفات بعنوان وملخص لكل منها، ثم ينزل التوجيه داخل فهرس كل ملف بنفس الآلية. التفاصيل الكاملة لهذا السيناريو ستأتي في الجزء الرابع من السلسلة. الكود القابل للتشغيل متاح في مستودع doc-intel/notebooks-vol1 على GitHub، مع الاستدعاءات الفعلية على وثيقتي NIST الأصليتين.
ما تكشفه هذه المقاربة في جوهرها هو أن أنظمة RAG المؤسسية لا تحتاج إلى نماذج أكبر أو تضمينات أذكى بالضرورة، بل إلى احترام البنية الموجودة في الوثيقة نفسها. الخبير لا يقرأ الكتاب كله، يقرأ الفهرس أولاً — وهذا ما ينبغي للنظام أن يفعله.







