From Empirical Evaluation to Context-Aware Enhancement: Repairing Regression Errors with LLMs
تقدم هذه الورقة معيار RegressionBug4APR للتقييم التجريبي لإصلاح البرامج الآلي لأخطاء الارتداد (regression bugs)، كاشفةً أنه بينما تفشل الأدوات التقليدية، فإن النهج القائمة على النماذج اللغوية الكبيرة (LLM) تُحسّن معدلات نجاح الإصلاح بشكل كبير عند تعزيزها بمعلومات سياقية حول التغييرات المسببة للأخطاء.
المؤلفون الأصليون:Anh Ho, Thanh Le-Cong, Bach Le, Christine Rizkallah
البرمجيات لا تنتهي أبداً؛ فهي كائن حي ينمو ويتغير ليلبي الاحتياجات الجديدة، حيث يعمل المطورون باستمرار على إضافة ميزات جديدة أو إصلاح مشكلات قديمة. ولكن في غمرة الاندفاع نحو التحسين، يحدث خطأ شائع ومحبط: تغييرٌ كان يهدف للمساعدة تسبب عن غير قصد في كسر شيء كان يعمل بشكل مثالي من قبل. يُسمى هذا "تراجعاً" (Regression). تخيل أنك تقوم بإصلاح تسرب في سقف، ولكن أثناء العملية، اصطدمت بالجدار وتسببت في ثقب فيه بالخطأ. لقد اختفى التسرب، ولكن أصبح لديك الآن مشكلة جديدة وأكبر. في عالم البرمجيات، يصعب العثور على هذه التراجعات وإصلاحها بشكل ملحوظ لأنها تكون مخفية في تاريخ تغييرات الكود، وغالباً ما تظل كامنة لسنوات قبل أن يلاحظها أحد. لعقود من الزمن، حاول الباحثون بناء برامج حاسوبية يمكنها إصلاح هذه الأخطاء تلقائياً، آملين في إنقاذ المطورين البشر من ساعات طويلة من استكشاف الأخطاء وإصلاحها. ومع ذلك، فإن الأدوات التي بنوها كانت مصم دسته في الغالب للأخطاء العامة، وعانت عندما واجهت الطبيعة التاريخية المحددة للتراجع.
قرر فريق من الباحثين من جامعة ملبورن وجامعة سنغافورة للتكنولوجيا والتصميم التحقق مما إذا كان الذكاء الاصطناعي الحديث، وتحديداً النماذج اللغوية الكبيرة، يمكنه القيام بعمل أفضل في هذه المهمة الصعبة. هذه النماذج هي أنظمة حاسوبية متطورة تدربت على كميات هائلة من النصوص والأكواد، وهي قادرة على فهم التعليمات وتوليد محتوى جديد. أراد الباحثون معرفة ما إذا كانت هذه الأنظمة الذكية قادرة ليس فقط على إيجاد الكود المعطل، بل أيضاً على فهم لماذا تعطل من خلال النظر في التغيير المحدد الذي تسبب في المشكلة. لاختبار ذلك، كان عليهم أولاً بناء مجموعة جديدة عالية الجودة من أخطاء البرمجيات الواقعية، لأن المجموعات القديمة التي استخدموها كانت عفا عليها الزمن أو لم تكن تحتوي على نوع الخطأ الصحيح. لقد أنشأوا معياراً يسمى RegressionBug4APR، والذي يتضمن 200 خطأ تراجع مؤكد من مشاريع برمجية شهيرة مكتوبة بلغتي Java وPython. وقد تحققوا بدقة من كل خطأ لضمان أنه تراجع حقيقي، مما يعني أن ميزة كانت تعمل في نسخة سابقة من البرنامج توقفت عن العمل بعد تحديث معين.
ومع وجود هذه المجموعة الجديدة بين أيديهم، وضع الباحثون أدوات الإصلاح المختلفة قيد الاختبار. أولاً، جربوا الأدوات الآلية التقليدية التي استُخدمت لسنوات. تعمل هذه الأدوات عن طريق تخمين تغييرات صغيرة في الكود، مثل استبدال كلمة أو حذف سطر، لمعرفة ما إذا كان الخطأ سيختفي. كانت النتائج صارخة: فشلت هذه الأدوات التقليدية في إصلاح خطأ واحد من بين الـ 200 خطأ. ببساطة، لم تتمكن من التعامل مع تعقيد هذه الأخطاء المحددة. ثم انتقل الباحثون إلى نماذج الذكاء الاصطناعي الأحدث والأكثر قوة. حققت هذه النماذج أداءً أفضل بكثير، حيث نجحت النماذج الأكثر تقدماً في إصلاح عدد كبير من الأخطاء. ومع ذلك، لاحظ الباحثون أن النماذج كانت لا تزال تخمن في الظلام؛ فقد أُعطيت الكود المعطل ورسالة الخطأ، لكن لم يتم إخبارها بالتغيير المحدد في تاريخ البرنامج الذي تسبب في العطل.
ولرؤية ما إذا كان منح النماذج المزيد من السياق سيساعد، جرب الباحثون نهجاً جديداً. فقد قاموا بتغذية الذكاء الاصطناعي بتغييرات الكود الدقيقة التي أدخلت الخطأ، جنباً إلى جنب مع الملاحظات التي كتبها المطور الأصلي عند إجراء ذلك التغيير. هذا يش similar إلى إعطاء ميكانيكي ليس فقط السيارة المعطلة، بل أيضاً المفتاح المحدد الذي استخدمه لشد البرغي الذي تسبب في المشكلة. عندما مُنحت النماذج هذه المعلومات الإضافية حول "التغيير المسبب للخطأ"، قفز أداؤها بشكل كبير. التجهيز الأفضل، الذي استخدم أسلوباً حوارياً حيث يمكن للنموذج طلب التغذية الراجعة والمحاولة مرة أخرى، تمكن من إصلاح 39 خطأ من أصل 200. كان هذا تحسناً بمقدار 1.6 مرة مقارنة بنفس النموذج بدون التاريخ الإضافي. وجد الباحثون أن هذا السياق ساعد النماذج على فهم السبب الجذري للخطأ، مما سمح لها بتقرير ما إذا كان ينبغي ببساطة التراجع عن التغيير السيئ أو إجراء تصحيح أكثر دقة يحافظ على الأجزاء الجيدة من التحديث مع إصلاح الأجزاء السيئة.
كما كشفت الدراسة أن الأخطاء ليست متساوية في النوع. فبعض الأخطاء تحدث في المكان ذاته الذي تم فيه تغيير الكود، بينما تحدث أخطاء أخرى في أماكن بعيدة في أجزاء من البرنامج لم يتم لمسها على الإطلاق. وجدت النماذج أن الأخطاء البعيدة أصعب بكثير في الإصلاح، حتى مع وجود التاريخ الإضافي. علاوة على ذلك، حلل الباحثون الأخطاء التي ارتكبتها النماذج. فأحياناً، خمنت النماذج سبباً خاطئاً للخطأ، أو أنحت حلاً يجتاز الاختبارات ولكنه خاطئ منطقياً، أي أنها خدعت نظام الاختبار بدلاً من حل المشكلة الحقيقية. ورغم هذه القيود، فإن النتائج واضحة: أدوات الإصلاح الآلية التقليدية غير فعالة لأخطاء التراجع، لكن الذكاء الاصطناعي الحديث يظهر وعداً كبيراً، خاصة عندما يُسمح له بالنظر إلى تاريخ الكود لفهم كيف حدث الخطأ. وهذا يشير إلى أن مستقبل إصلاح البرمجيات لا يكمن فقط في خوارزميات أذكى، بل في منح تلك الخوارزميات القصة الكاملة لكيفية تطور البرمجيات.
ملخص تقني: من التقييم التجريبي إلى التعزيز المستند إلى السياق: إصلاح أخطاء التراجع باستخدام النماذج اللغوية الكبيرة (LLMs)
بيان المشكلة تتطور الأنظمة البرمجية باستمرار، وغالباً ما تؤدي التغييرات في الكود إلى إدخال أخطاء التراجع (regression bugs)—وهي عيوب تؤدي فيها التعديلات إلى كسر وظائف كانت تعمل سابقاً. يعد إصلاح هذه الأخطاء يدوياً أمراً صعباً لأن المطورين يجب عليهم تتبع تاريخ البرنامج لتحديد "التغييرات المسببة للخطأ" (bug-inducing changes) المسؤولة عن الفشل. ورغم تقدم تقنيات الإصلاح الآلي للبرامج (APR) بشكل كبير، لا سيما النهج القائمة على النماذج اللغوية الكبيرة (LLMs)، إلا أن الأبحاث الحالية ركزت إلى حد كبير على الأخطاء البرمجية العامة. كما تظل فعالية تقنيات APR المتطورة، وخاصة النهج القائمة على LLMs، في التعامل مع أخطاء التراجع غير مستكشفة إلى حد كبير. علاوة على ذلك، فإن المعايير المرجعية الحالية لـ APR (مثل Defects4J) ليست مصممة مع مراعاة الخصائص النوعية لأخطاء التراجع (الخصائص الزمنية والسلوكية)، كما أن مجموعات البيانات القديمة الخاصة بأخطاء التراجع أصبحت عفا عليها الزمن أو يصعب إعادة إنتاجها.
المنهجية أجرى المؤلفون دراسة تجريبية شاملة مهيكلة حول أربعة أسئلة بحثية (RQs):
بناء المعيار المرجعي (RQ1): قدم المؤلفون RegressionBug4APR، وهو معيار مرجعي عالي الجودة يتكون من 200 خطأ تراجع (150 في لغة Java و50 في لغة Python) تم جمعها من مستودعات GitHub الواقعية.
التنقيب: استخدموا أداة RegMiner للغة Java وأداة تحقق مخصصة للغة Python لتحديد التراجعات المحتملة عبر تحليل تاريخ تطور البرمجيات (إيجاد التغييرات التي أصلحت الخطأ، والتغييرات المسببة للخطأ، وحالات الاختبار التي شهدت الخطأ).
التحقق: ضمنت عملية تحقق صارمة مكونة من ثلاث خطوات قابلية التنفيذ (الترجمة/التوافق)، والصلاحية (الشروط السلوكية للتراجعات الحقيقية)، والمنفعة (الملاءمة لـ APR).
الخصائص: يتضمن المعيار المرجعي أحجام رقع (patches) ونطاقات وعمليات إصلاح متنوعة، تغطي أنواع التراجع المحلية (Local)، والبعيدة (Remote)، وغير المقنعة (Unmask).
التقييم التجريبي لتقنيات APR (RQ2): قيمت الدراسة 15 تقنية من تقنيات APR على مجموعة فرع Java من المعيار المرجعي دون توفير سياق خاص بالتراجع (سير عمل APR القياسي).
الأدوات التقليدية: الأدوات القائمة على البحث (GenProg, Kali, Arja, إلخ) والأدوات القائمة على القوالب (TBar).
الأدوات القائمة على LLM: النماذج التي خضعت للضبط الدقيق (RepairLLaMA, Incoder, CodeGen) والنماذج القائمة على التلقين (ChatGPT-3.5-Turbo, ChatGPT-4o) باستخدام استراتيجيات التلقين الصفري (zero-shot) والتفاعلي (conversational).
تأثير التعزيز المستند إلى السياق (RQ3): بحث المؤلفون فيما إذا كان دمج معلومات "التغيير المسبب للخطأ" (BIC) (أي الفرق في الكود ورسالة الالتزام/commit message للتغيير الذي تسبب في التراجع) يحسن فعالية الإصلاح. وقد ركزوا على التقنيات القائمة على التلقين نظراً لمرونتها. تم تعزيز التلقين بمعلومات BIC لتوجيه النموذج في تحديد الأسباب الجذرية والتمييز بين التحديثات المقصودة والتراجعات غير المقصودة.
دراسة الاستئصال (RQ4): أُجريت دراسة استئصال لعزل مساهمة عناصر سياقية محددة داخل معلومات BIC: رسائل الالتزام وحدها، تغييرات الكود وحدها، والجمع بينهما (Full BIC).
النتائج الرئيسية
جودة المعيار المرجعي: تم التحقق من أن RegressionBug4APR مورد متنوع وفي الوقت المناسب، حيث يحتوي على أخطاء من عام 2016 فصاعداً مع قابلية إعادة إنتاج موثقة ومجموعة واسعة من عمليات الإصلاح.
أداء APR التقليدي: فشلت جميع أدوات APR التقليدية (البحثية والقائمة على القوالب) في إصلاح أي من أخطاء التراجع الـ 150 في لغة Java. ويعزو المؤلفون ذلك إلى عدم كفاية أنماط الإصلاح الحالية للسيناريوهات الخاصة بالتراجع، وعدم توفر الإصلاحات في نسخة البرنامج الحالية.
أداء LLM (بدون سياق): أظهرت النهج القائمة على LLM إمكانات واعدة.
الضبط الدقيق: حقق RepairLLaMA أعلى دقة (48.39%) وأصلح 15 خطأً.
التلقين: أصلح ChatGPT-4o عبر التفاعل التفاعلي أكبر عدد من الأخطاء (18 خطأً) ولكن بدقة أقل (30.00%).
أنواع الأخطاء: كانت الأخطاء المحلية هي الأكثر قابلية للإصلاح، بينما كانت الأخطاء البعيدة هي الأكثر تحدياً.
تأثير سياق BIC: أدى دمج معلومات BIC إلى تعزيز الأداء بشكل كبير.
التحسن: حقق أفضل تكوين (ChatGPT-4o التفاعلي مع Full BIC) إصلاح 39 خطأً من أصل 200 خطأ (19.50%)، مما يمثل تحسناً بمقدار 1.6 ضعف مقارنة بأفضل تكوين بدون BIC (24 خطأً).
التعميم: كان هذا التحسن متسقاً عبر معايير Java وPython.
النتائج النوعية: ساعد سياق BIC النماذج على تحديد الأسباب الجذرية، والقرار بين التراجع الكلي أو الجزئي، وتضييق نطاق الإصلاح.
دراسة الاستئصال: ساهمت كل من رسائل الالتزام وتغييرات الكود بشكل إيجابي. قدمت تغييرات مستوى الكود مكاسب أكبر من رسائل الالتिकेशन وحدها، لكن المكونين كانا متكاملين، حيث أعطيا أفضل النتائج عند الجمع بينهما.
تحليل الفشل: حددت الدراسة أربعة أنماط رئيسية لفشل LLMs: التشخيص الخاطئ (44%)، ضعف مجموعة الاختبار (24%)، الإصلاح غير الممكن الوصول إليه (20%)، والإصلاح الزائد (12%).
الأهمية والادعاءات يدعي البحث ما يلي:
APR التقليدي غير كافٍ لأخطاء التراجع: الأدوات الحالية القائمة على الأنماط أو البحث غير فعالة لهذا النوع المحدد من العيوب.
النماذج اللغوية الكبيرة (LLMs) واعدة ولكنها تحتاج إلى سياق: رغم تفوق LLMs على الأدوات التقليدية، إلا أن فعاليتها محدودة بشكل كبير بدون سياق خاص بالتراجع.
التعزيز المستند إلى السياق أمر حاسم: توفير معلومات التغيير المسبب للخطأ هو استراتيجية فعالة للغاية لتحسين أداء APR في أخطاء التراجع، حيث توفر تحسناً بمقدار 1.6 ضعف في معدلات الإصلاح.
الإشارات المتكاملة: تلتقط رسائل الالتزام وتغييرات الكود إشارات غير متكررة؛ والجمع بينهما يعطي نتائج متفوقة مقارنة باستخدام كل منهما على حدة.
منفعة المعيار المرجعي: يوفر RegressionBug4APR أساساً ضرورياً وعالي الجودة وقابلاً للتوسع للأبحاث المستقبلية في مجال إصلاح التراجع الآلي، معالجاً بذلك نقص مجموعات البيانات الحديثة في هذا المجال.
يخلص المؤلفون إلى أنه بينما تظهر LLMs إمكانات كبيرة، لا تزال التحديات قائمة، لا سيما مع الأخطاء البعيدة (Remote bugs) والحالات التي تتطلب معرفة خاصة بالمكتبات. ويقترحون أن العمل المستقبلي يجب أن يركز على دمج سياق BIC وردود فعل فشل الاختبار مباشرة في عمليات الضبط الدقيق وتطوير آليات للتعامل مع سيناريوهات التراجع المعقدة.