الموعد النهائي جزء من الإجابة
قضينا ثلاثة أشهر في بناء نظام يرشّح المؤتمرات، وكان يعمل. كانت ترشيحاته ذات صلة فعلًا، وكان معظمها بلا فائدة، لأن ترشيح مؤتمر مسألة حداثة بيانات قبل أن يكون مسألة مطابقة.
LLMs · Retrieval · Recommender systems
كانت المشرفة على المشروع تصادف الموقف نفسه مرارًا: باحث ينتهي من ورقته، أو من معظمها، ثم لا يعرف إلى أين يرسلها.
يبدو هذا هو النصف السهل من العمل. وليس كذلك. أنت تحتاج أن تعرف أي المؤتمرات يغطّي موضوعك، وأيها يقبل عملًا في مستواك، وما الـtracks المتاحة، وهل باب التقديم ما زال مفتوحًا، ومتى يُغلق، وهل الصفحة التي تقرأها تصف هذا العام أم تصف ما جرى قبل ثلاث سنوات. والطريقة المعتادة أن تفتح عشرة تبويبات وتقرأ صفحات الـcall for papers حتى يناسبك شيء — وأن تأمل أنك خمّنت الكلمات الصحيحة من البداية، لأن المؤتمر إن وصف موضوعك بمصطلحات غير مصطلحاتك فلن تراه أبدًا.
فبنينا شيئًا لهذا. كان مشروعًا جماعيًا — خمسة طلاب ومشرفة — وكبر حتى صار منصّة سمّيناها ScholarNexus. الجزء الذي كنت مسؤولًا عنه هو ترشيح المؤتمرات، وهذا ما يدور حوله المقال.
ثلاثة أشهر على الشكل الخطأ للمشكلة
النسخة الأولى كانت البديهية.
نجمع مجموعة بيانات عن المؤتمرات وموضوعاتها. نعمل fine-tuning لموديل عليها. يرفع المستخدم ورقته، فيفهم النظام موضوعها ويطابقه بما تعلّمه. مشكلة تصنيف ذات شكل نظيف، من النوع الذي يمكن شرحه في شريحة واحدة.
وبالتحديد: ما يقارب ثمانية عشر ألف زوج من (abstract ← اسم مؤتمر)، جُمِعت من مستودعات عامة وتمتدّ إلى عام ١٩٩٠، استُخدمت في عمل fine-tuning لـLLaMA 3.2 1B بمحوّلات LoRA، حتى يردّ على الـabstract باسم مؤتمر. وبعد أن يسمّي المؤتمر، تأتي مرحلة ثانية تبحث عنه في WikiCFP وتلخّص الـcall for papers — المواعيد، والمكان، والموعد النهائي، والرابط الرسمي.
اشتغلنا على هذا الاتجاه نحو ثلاثة أشهر. وهذا النظام هو ما تصفه ورقتنا المنشورة، وهي الموضع الذي تنتمي إليه تفاصيله: AI-Powered Conference Recommendation: Fine-Tuning Language Models for Context-Aware Academic Support، في مؤتمر SRC 2025، 10.1109/SRC65875.2025.11263514. وهذا المقال عمّا جاء بعده.
ونجح. كنت تعطيه abstract فيرجّع لك مؤتمرات في الموضوع نفسه فعلًا. وباعتبارها مشكلة مطابقة، كانت محلولة.
كان مصيبًا، وكان بلا فائدة
المؤتمرات التي كان يقترحها كانت قد انعقدت بالفعل.
ليست كلها، لكن ما يكفي. الموديل كان يعرف أن هذا المؤتمر مناسب للموضوع، ولم يكن لديه أي سبيل ليعرف أن الموعد النهائي انتهى منذ أربعة أشهر. كل ما يعرفه عن العالم كان مجمّدًا عند لحظة جمع البيانات، والمؤتمرات ليست موضوعًا ثابتًا — فالمحتوى المفيد كله في أي call for papers هو تاريخ في المستقبل القريب.
ومرحلة البحث الحيّ لم تنقذنا، ويستحق السبب دقّة في بيانه. النظام كان يخرج إلى الويب فعلًا — لكن بعد أن يكون الموديل قد اختار أي مؤتمر يسمّيه، وكان يختار مما حفظه. والبحث عن قرارٍ اتُّخذ بالفعل قد يصفه وصفًا أدقّ، لكنه لا يجعله قرارًا آخر.
مؤتمر يناسب ورقتك تمامًا وأُغلق بابه في الربيع الماضي ليس ترشيحًا أسوأ من غيره. هو ليس ترشيحًا من الأساس. المستخدم لا يستطيع أن يفعل به شيئًا. وتبيّن أن «صحيح» و«غير قابل للاستخدام» شيء واحد هنا.
أخذ ذلك وقتًا حتى نقبله، لأن الفشل لم يكن يبدو فشلًا. لم ينهَر شيء. ودرجة الصلة كانت جيدة. والمخرجات كانت تشبه النجاح تمامًا، وهذا أغلى أنواع الأخطاء ثمنًا.
الموعد النهائي جزء من الإجابة
حين اتّضح ذلك، تغيّر شكل المشكلة.
كنا نعامل ترشيح المؤتمرات باعتباره مطابقة: هذه ورقة، وهذه مجموعة مؤتمرات، جد الأقرب. لكن المطابقة نصف المسألة فقط. النصف الآخر استرجاع، وهو حسّاس للوقت. النظام الذي تتجمّد معرفته عند لحظة التدريب لا يمكن أن يكون مصيبًا في هدف متحرّك، مهما بلغت جودة المطابقة.
فتوقّف الموعد النهائي عن كونه بيانات وصفية ملحقة بالإجابة. صار جزءًا من الإجابة. والمؤتمر الذي لا باب مفتوح له ليس مرشّحًا أصلًا.
وهذا نظام مختلف، وكان معناه التخلّي عمّا قضينا ثلاثة أشهر في بنائه.
ما بنيناه بدلًا منه
النسخة النهائية لا تتعلّم المؤتمرات إطلاقًا. هي تذهب وتبحث.
تعطيها الورقة بصيغة PDF، أو العنوان والـabstract فقط. يُستخرج النص بـPyPDF2، ويُرمَّز بموديلات embedding من Hugging Face، ثم يُقسَّم ويُفهرس في قاعدة متجهات FAISS — فما يحمله النظام تمثيل دلالي لعملك، لا حقيبة من كلماتك المفتاحية.
بعدها ينطلق search agent إلى الويب الحيّ عبر Tavily API ويجمع ما يُعلَن الآن فعلًا: أسماء المؤتمرات، والـtracks، والأماكن، والمواعيد النهائية، والروابط الرسمية. ثم تُرمَّز هذه البيانات بالطريقة نفسها، وتُقارَن بالورقة باستخدام cosine similarity، وتُرتَّب.
وبعد ذلك يمكنك أن تحاور النتائج. تسأل عن الموعد النهائي، أو هل ورقتك تناسب track بعينه، فتأتي الإجابة ممّا استُرجع لا ممّا يتذكّره موديل. هذا الجزء يعمل بـMistral-Nemo-Instruct مع LangChain لإدارة ذاكرة المحادثة، حتى لا تضطر إلى إعادة ذكر المؤتمر المقصود في كل سؤال.
انتقلت المعرفة من أوزان الموديل إلى خطوة الاسترجاع. هذا هو التغيير كله، وهو السبب الوحيد في أن النظام كفّ عن إعطاء إجابات واثقة عن أحداث انتهت.
ما الذي تعنيه «context-aware» هنا فعلًا
العبارة موجودة في عنوان ورقتنا، وهي تؤدّي ثلاث وظائف منفصلة.
الأولى هي الورقة. النظام يقرأ ما كتبته فعلًا لا ما كتبته في مربّع بحث، وهذا مهم لأن المؤتمرات والباحثين نادرًا ما يستخدمون المفردات نفسها للموضوع نفسه. والترميز الدلالي هو ما يسمح لمؤتمر أن يظهر رغم أن الـcall for papers الخاص به يصوغ موضوعك بغير صياغتك.
والثانية هي المؤتمر. كل ما يقوله النظام عن مؤتمر — التواريخ والـtracks والمكان — يأتي ممّا استُرجع عنه، لا من ذاكرة الموديل.
والثالثة هي المحادثة. حين تنظر إلى نتيجة بعينها، تحمل الأسئلةُ التالية سياقَ ما تنظر إليه.
ولا شيء من هذه الثلاثة مبهر بمفرده. لكنها مجتمعة هي الفرق بين نتيجة بحث وشيء تستطيع أن تسأله.
ما يُظهره التقييم وما لا يُظهره
قيّمنا وحدة المؤتمرات بأن أعطيناها abstract بحثيًا، وأخذنا المؤتمرات الخمسة عشر التي رجّعتها، وجعلنا موديلًا يقيّم كل واحد منها من واحد إلى خمسة بحسب صلته بالموضوع. وحصل معظمها على أربعة أو خمسة.
هذه نتيجة حقيقية، وهي نتيجة صغيرة. تقول إن الترتيب لا ينتج هراءً. ولا تقول إن النظام أفضل من البديل، لأننا لم نُجرِ تلك المقارنة على تلك الحالات — لا مقابل بحث بالكلمات المفتاحية، ولا مقابل قاعدة مؤتمرات ثابتة، ولا مقابل ما يجده الباحث بنفسه في عصر يوم.
وهي كذلك لا تقول إن الترشيحات كانت مفيدة. الصلة قيّمها موديل في مقابل موضوع. أمّا هل نظر باحث إلى القائمة فوجد مكانًا يستطيع التقديم فيه فعلًا، فسؤال آخر، والإجابة عنه تحتاج باحثين لا prompt تقييم.
إذن: يعمل بما فيه الكفاية على الحالات التي جرّبناها، ومُقيَّمًا بالطريقة التي قيّمناه بها. وأي جملة أقوى من هذه ادّعاء لم نكسبه.
ولم نكن الأوائل. أنظمة ترشيح المؤتمرات كانت موجودة، وكذلك محرّكات البحث وSemantic Scholar وبرامج إدارة المراجع. ما حاولنا سدّه هو الفجوة بينها: سياق الورقة كاملة، ومواعيد حيّة، وإمكان طرح سؤال متابعة، في مكان واحد.
أين كان لا يزال يفشل
أوضح حدوده هو ما ورثه عن الاسترجاع: إن لم تكن المعلومة موجودة علنًا، فلا يستطيع النظام أن ينتجها. اطلب مؤتمرات في سنة بعيدة بما يكفي لألّا يكون أحد قد أعلن شيئًا، فلن يجد شيئًا. هذا هو السلوك الصحيح، ويظل يبدو للمستخدم فشلًا.
والتأريض يقلّل الهلوسة ولا يلغيها. سؤال غامض في مقابل استرجاع ضعيف سيحصل على إجابة واثقة رغم ذلك.
وكان التقييم على أوراق في علوم الحاسب والذكاء الاصطناعي. ولا أفترض السلوك نفسه في الطب أو العلوم الإنسانية، حيث تختلف المؤتمرات والمفردات والأعراف جميعًا.
وكان تشغيله ثقيلًا. عدّة موديلات لغوية وبصرية، وفهارس متجهات، وبحث حيّ، وتوليد فيديو في نظام واحد يعني ضغطًا حقيقيًا على الذاكرة. وعلى عتاد متواضع يظهر ذلك بطئًا وانقطاعًا، وهو عند المستخدم لا يختلف عن التعطّل.
كان الأسبوع الأخير هو الأصعب
كل وحدة كانت تعمل. وتلك كانت المشكلة.
كان كل واحد منّا يبني جزءًا — ترشيح المؤتمرات، والبحث عن الأعمال المرتبطة، وتحليل النزاهة الأكاديمية، وتحليل الأوراق، ومحاكاة التحكيم، والمساعد — وكان كل جزء سليمًا بمفرده. وجَمْعُها في تطبيق واحد عنى التوفيق بين الـAPIs، وصيغ المدخلات والمخرجات، ورفع الملفات، ومعالجة الأخطاء، والـtimeouts، وأي الموديلات محمّلة ومتى.
وإلى جانب كشف النصوص المولَّدة بواسطة الذكاء الاصطناعي، تضمّن المشروع خاصية humanization غايتها أن تجعل المقاطع المُعلَّمة تبدو أكثر طبيعية وأقلّ شبهًا بالكتابة الآلية.
وفي أثناء ذلك كنّا نضيف أشياء. كل feature جديدة تبدو صغيرة من الخارج، ولم تكن أي منها كذلك، لأن كل واحدة تأتي معها أعمال دمج، وأنماط فشل جديدة، وحمل أثقل على عتاد مُجهَد أصلًا.
الأسبوع الأخير ليس وقت توسيع النطاق، والفكرة الجيدة إذا جاءت متأخرة تظل فكرة سيئة. وقد تعلّمت ذلك بأن فعلت العكس.
ما كنت سأفعله اليوم
ليس بالطريقة نفسها، لكن ليس للسبب الذي يُقال عادة.
الموديلات الحالية أفضل كثيرًا في قراءة الأوراق، والاحتفاظ بسياق طويل، واستدعاء الأدوات، وإخراج نتائج منظّمة. وكثير ممّا بنيناه يدويًا صار اليوم بضعة tool calls محدّدة جيدًا، وأغلب الـprompt engineering على الأطراف كان سيختفي.
وما لم يكن ليتغيّر هو الجزء الذي أخطأنا فيه أول مرة. ما زلت لن أدع الموديل يجيب من ذاكرته. بحث حيّ، ومصادر رسمية، وتحقّق صريح من أن الموعد لم ينتهِ، ومرجع لكل ادّعاء، وامتناع عن الإجابة حين لا يعود شيء موثوق.
بل كنت سأفصل المراحل فصلًا أحدّ ممّا فعلنا: الاسترجاع، والترتيب، والتوليد، والتحقّق، خطوات متمايزة، حتى لا يكون الموديل أبدًا هو ما يخترع مؤتمرًا أو تاريخًا. ينبغي أن يكون يستنتج فوق معلومات ذهب غيره وتحقّق منها.
هذا هو الدرس الذي بقي. الجزء الصعب في نظام الترشيح ليس المطابقة. هو أن تعرف ما الذي لا يزال صحيحًا.