← voidwest    research notes

ليش Research Debt Atlas ما يولّد research gaps

ليش استخراج الدليل يجي قبل توليد الـ gap
محمد الثبيتي · 2026-07-11
research tooling information extraction reproducibility Atlas

الفترة الأخيرة كنت أبني أداة صغيرة ترسم خريطة للقيود المتكررة، والتقييمات الناقصة، والمشاكل المفتوحة، وادعاءات العمل المستقبلي عبر مجموعة من الأوراق العلمية.

النسخة الواضحة من هالفكرة تطلب من LLM يقرأ الأوراق ويطلع قائمة research gaps. وهذه بعد أسهل نسخة للعرض: عطها مجلد PDFs، انتظر شوي، وبعدها اعرض قائمة مرتبة لاتجاهات بحثية شكلها مقنع.

أنا ما بنيت هالنسخة.

Atlas يبدأ بمهمة أضيق: طلع الشيء اللي قاله مؤلفو الورقة فعلاً، احفظ وين قالوه، وخلّ أي تفسير لاحق يرجع إلى هذا الدليل.

research gap مولّد ممكن يبدو مقنع. جملة من المصدر تقدر تراجعها.

أول prototype

أول نسخة من Atlas كانت بالكاد تستحق اسم pipeline. تقرأ ملفات نصية بـ UTF-8، تكتشف عناوين مثل Limitations وFuture Work وThreats to Validity، وبعدها تشغّل قواعد regex واضحة على الفقرات والجمل.

القواعد تدور على عبارات تتكرر أصلاً في الكتابة الأكاديمية:

هذا يشتغل لأن قيود الأوراق مو دائماً مكتوبة بطريقة خفية. كثير من الأوراق تعلنها بلغة متكررة، خصوصاً داخل أقسام مخصصة. الـ regex ضعيف في فهم المعنى، لكنه ممتاز في إيجاد الصيغ المتكررة. وسياق القسم يخلي الصيغة أفيد: عبارة limited to داخل قسم Limitations مو مثل نفس العبارة داخل وصف dataset.

النسخة الأولى تعطي كل نتيجة مرشحة درجة من مصدرين: عنوان القسم، وأنواع القواعد اللي طابقتها. تحذف الأجزاء القصيرة، وتسوي deduplication للنص داخل كل ورقة، وبعدها تكتب ملفات JSONL وتقرير HTML ثابت.

لا embeddings. لا API calls. لا ملخص مولّد. الجزء المهم مو قوة النموذج؛ ما كان فيه نموذج أصلاً. الجزء المهم إن كل نتيجة معها اسم الملف، وعنوان القسم، وبداية ونهاية نطاق النص، والنص الأصلي بالحرف.

ليش ما نولّد الـ gap مباشرة؟

لأن جملة عن قيد في دراسة مو نفس research gap.

لو الورقة تقول إنها ما قيّمت robustness under domain shift، فهذا دليل عن شيء مؤلفو الورقة ما اختبروه. مو دليل إن محد اختبره، أو إن المشكلة ما زالت مفتوحة، أو إن دراسة جديدة عنها ستكون novel. هالأسئلة تحتاج بحث في الأدبيات، ومقارنة بين أوراق، وحكم علمي.

نموذج لغوي يقدر يضغط كل هالخطوات في جملة مرتبة. الجملة ممكن تكون مفيدة. وممكن بهدوء تحوّل قيد محلي في ورقة واحدة إلى ادعاء عن فجوة في المجال كله.

حدود التصميم

Atlas يستخرج research debt مذكور في المصدر. ما يدّعي إن العنصر ما زال بلا حل، أو مهم، أو جديد عبر الأدبيات.

هالحد خلى الأداة أقل إثارة في لقطات العرض، لكنه خلى المخرجات أسهل بكثير في المراجعة.

من النتائج المرشحة إلى مسار مراجعة

نسخة 0.1.0 كانت استخراج. النسخ اللي بعدها أضافت المسار اللي يخلي الاستخراج دليل، مو جواب نهائي.

0.2.0 أضافت تفاصيل كل قاعدة ومراجعة يدوية. بدل ما يقول Atlas بس إن الجملة طابقت future_work، صار يحفظ pattern ID ثابت والنص المحدد اللي شغّل القاعدة. بعدها المراجع يقدر يقبل نطاق النص المرشح أو يرفضه قبل ما يصير ادعاء أقوى.

النسخ اللاحقة أضافت ترقية النتائج المراجعة، وعُقد خريطة ثابتة، وملفات manifest، والتحقق، وتعديلات أكثر أماناً، وتشخيص للإصدار. عقدة الخريطة تجمع أدلة مراجعة: مثلاً عدة أوراق تقول إن تقييم اللهجات ناقص تنحط تحت عقدة واحدة، بدون ما يدّعي Atlas إن المشكلة ما زالت بلا حل عبر الأدبيات. كل طبقة أضافت احتكاك أكثر بين خرج الـ regex الخام والادعاء البحثي النهائي.

الـ determinism جزء من المنهج

Atlas يرتب أسماء الملفات، والأقسام، والنتائج، والقواعد، والـ tags، وعُقد الخريطة بشكل صريح. الـ IDs مشتقة من مدخلات مطبّعة باستخدام SHA-256 مختصر. ملفات الاستخراج ما فيها timestamps. نفس الـ corpus ونفس النسخة المفروض يعطون نفس ملفات الأدلة.

هذا مهم لسبب ممل: لو تغيرت نتيجة مرشحة، أبغى أعرف هل الورقة تغيرت، أو القاعدة تغيرت، أو حدود القسم تغيرت، أو مسار التشغيل تغير. الاستخراج العشوائي يصعّب هالمقارنة.

الـ determinism ما يخلي الـ regex صحيح. يخلي أخطاءه قابلة للتكرار، والفحص، والقياس.

نتيجة زائفة تقدر تعيد إنتاجها أسهل في الإصلاح من جواب مقنع ما تقدر تعيد بناءه.

دعم الـ PDF خلى المشكلة أقل نظافة

أول MVP كان يقبل ملفات .txt مجهزة مسبقاً. هذا بسّط الاستخراج، لكنه رمى مشكلة مهمة على المستخدم. مجموعات الأوراق تجي عادة كـ PDFs.

Atlas 1.0.0 أضاف استخراج محلي عبر pdftotext. التحويل يستخدم ترتيب قراءة ثابت، وAtlas يحفظ النص المحول نفسه اللي استُخدم لكل موضع حرفي. ما نتظاهر إن الرقم يشير إلى بايت داخل الـ PDF أو إحداثي في الصفحة. يشير إلى ملف UTF-8 محفوظ تقدر تفتحه وتراجعه.

أول تشغيل على أوراق حقيقية كان سيئاً. ثلاث أوراق أنتجت 293 "قسم". أسماء المؤلفين، والجامعات، وصفوف الجداول، وعناوين الرسومات، ونصوص ملتفة كلها بدت كأنها عناوين للـ detector المتساهل. وتصميم العمودين دمج نصوصاً غير مرتبطة داخل نطاق مرشح واحد.

هذا كان مفيد. الفشل كان محدد. أقدر أشير إلى النص المحول، والحد الخطأ، والقاعدة اللي اشتغلت، ومعرّف النتيجة. تغيير التحويل من حفظ شكل الصفحة إلى ترتيب القراءة شال أسوأ خلط بين الأعمدة. وتشديد قواعد العناوين خفّض نفس المجموعة من 293 قسم إلى 126.

126 ما زال رقم مزعج. نص الـ PDF مو شجرة دلالية لبنية المستند، والمحول الثابت ما يقدر يرجع بنية الملف إذا البنية مو مشفرة أصلاً. Atlas يعرض هالقيد بدل ما يخفيه تحت ملخص مرتب.

القواعد فشلت بطرق أفيد

الأوراق الحقيقية كشفت نوعين مختلفين من النتائج الزائفة.

أولاً، عبارة مثل future research ممكن تصف موضوع، مو خطة المؤلفين. القاعدة القديمة كانت واسعة. الآن تحتاج سياق فعلي أكثر، مثل future research would أو future studies should.

ثانياً، ورقة عن توليد القيود تستخدم كلمة limitation في كل مكان: prompts، وlabels، وتعريفات التقييم، ومخرجات النماذج، وأمثلة البيانات. احتساب الدرجات بمجرد وجود الكلمة عامل عنوان مثل Limitation Subtype: Limited Datasets كأنه قسم القيود الخاص بالورقة. خلال مرحلة التجهيز الأخيرة قبل نشر وسم 1.0.0 العام، استُبدل هذا الأسلوب بمطابقة دقيقة للعناوين المعروفة، وتوقف Atlas عن فحص قسم المراجع.

المجموعة كشفت أيضاً عن نتائج كانت القواعد تفوّتها. فقرات واضحة تبدأ بـ Threats to construct validity وThreats to internal validity ما كانت تدخل إلا إذا صادفت قاعدة ثانية. هالعبارات الآن قواعد دليل مستقلة.

ولا تغيير من هذي احتاج prompt أفضل. احتاج failure log، وsource spans محفوظة، واختبار يفشل لنفس السبب اللي خلى الورقة الحقيقية تفشل.

وش يعني 1.0.0 فعلياً؟

Atlas 1.0.0 يقبل نصوص إنجليزية وPDFs فيها طبقة نص. يفحص الأقسام المكتشفة، يشغّل سبع فئات من القواعد، يعطي درجات ويزيل التكرار، ويحفظ ملفات التحويل، ويكتب JSONL وتقارير HTML قابلة للمراجعة.

المسار الكامل يروح من الأوراق إلى الأقسام، ثم النتائج المرشحة، ثم مراجعات يدوية، ثم سجلات الدين وعُقد الخريطة. عنده 155 اختبار، وفحوصات إصدار على Python 3.11 و3.12 و3.13، ومسار نظيف من مشروع جديد إلى ملفات ناتجة متحقَّق منها.

وما زالت عنده حدود حقيقية:

1.0.0 ما تعني إن الاستخراج اكتمل. تعني إن عقد الأدلة صار ثابتًا بما يكفي إننا نختبره بصدق.

وين يدخل الـ machine learning لاحقاً؟

إبقاء الاستخراج ثابت مو حجة ضد الـ machine learning. هي حجة عن الترتيب.

semantic clustering ممكن يجمع جمل مراجعة تستخدم لغة مختلفة. التلخيص ممكن يعطي وصف قصير لمجموعة أدلة. الـ retrieval ممكن يختبر هل القيد يتكرر بين الأوراق أو انحل في مكان ثاني. وLLM ممكن يساعد المراجع يتنقل في خريطة كبيرة.

لكن قياس هالطبقات يصير أسهل بعد ما تكون لطبقة الاستخراج قصة precision/recall واضحة ومجموعة جمل مصدر مراجعة. غير كذا، الطبقة الدلالية تحكم على premises هي ولّدتها بنفسها.

الخلاصة

Atlas بدأ كتجربة regex صغيرة لأن الأوراق الأكاديمية كثير تقول قيودها بشكل أوضح مما نتوقع. وكبر إلى مسار مراجعة لأن إيجاد جملة مو نفس إثبات فجوة.

النسخة الثابتة أقل سحراً. ترجع أدلة من المصدر، مو أفكار بحثية. تترك الغموض واضح، وتخلي المراجع يسوي شغل.

وهذا هو الهدف: أول خريطة مفيدة للـ research debt لازم تورينا من وين جاء كل ادعاء، قبل ما تحاول تقول لنا وين المفروض يروح البحث بعده.

الكود وملفات الإصدار: github.com/voidwest/atlas.