Diffs vs. Whole Files: An Empirical Comparison of Iterative Edit-Based and Direct Generation for Flutter/Dart Code Models
تثبت هذه الورقة تجريبياً أنه بالنسبة لتحرير أكواد Flutter/Dart، فإن التوليد المباشر للملف الكامل بواسطة النماذج اللغوية الكبيرة يتفوق بشكل جوهري على التوليد القائم على الفروقات (diff) المتكرر عبر جميع المقاييس، حيث لا يثبت الأخير تنافسيته إلا في عمليات التحرير القصيرة والموضعية مكانياً مثل مهام إعادة الهيكلة ومعالجة الأخطاء.
عندما يحتاج برنامج حاسوبي إلى إصلاح خطأ في قطعة من الكود، هناك طريقتان رئيسيتان يمكن لآلة ذكية القيام بهما بهذه المهمة. الطريقة الأولى هي إعادة كتابة الملف بأكمله من البداية، وإنتاج نسخة جديدة وكاملة من المستند. أما الطريقة الثانية فهي أن تعمل مثل محرر بشري، عبر إجراء سلسلة من التغييرات الصغيرة والمحددة — كإيجاد جملة واستبدالها بأخرى جديدة، أو حذف سطر وإدراج آخر — حتى تكتمل المهمة. هذه الطريقة الثانية، التي تُسمى غالباً "الفرق" (diff) أو "الرقعة" (patch)، تحظى بشعبية في عالم البرمجيات لأنها تبدو أكثر كفاءة؛ فهي تولد نصاً أقل وتحاكي طريقة عمل البشر بالفعل. ومن البديهي الاعتقاد بأن إجراء تعديلات صغيرة ومستهدفة هو أمر أفضل من إعادة كتابة كل شيء. ومع ذلك، ظل التساؤل حول ما إذا كان هذا الحدس صحيحاً عند تعليم الذكاء الاصطناعي كتابة الكود مسألة مفتوحة.
لقد وضعت دراسة حديثة هذه الطريقتين في مواجهة بعضهما البعض في تجربة منضبطة لحسم هذا الجدل. قام الباحثون بتدريب نموذجين مختلفين من الحاسوب لإصلاح الكود في لغة برمجة محددة تُستخدم لبناء تطبيقات الهاتف المحمول. لقد علموا مجموعة من النماذج إعادة كتابة ملفات كاملة في خطوة واحدة، وعلموا مجموعة أخرى أداء المهام نفسها من خلال إصدار سلسلة من التعديلات الصغيرة والتدريجية. ثم اختبروا كلتا المجموعتين على ما يقرب من 1800 مهمة برمجية مختلفة لمعرفة أي طريقة أنتجت نتائج أفضل. كانت النتائج واضحة ومثيرة للدهشة نوعاً ما: فالنماذج التي أعادت كتابة الملف بالكامل تفوقت باستمرار على النماذج التي حاولت إجراء تغييرات صغيرة ومتكررة. وقد ثبتت هذه الأفضلية في كل مقياس من مقاييس النجاح، بدءاً من كون الكود يعمل بالفعل وصولاً إلى مدى مطابقته للإجابة الصحيحة.
اكتشف الباحثون أن فشل نهج الخطوات المتتالية لم يكن ناتجاً عادةً عن نفاد وقت النماذج أو وقوعها في حلقة مفرغة. في الواقع، نجحت النماذج التي استخدمت طريقة الخطوات المتتالية في إكمال قائمة تعليماتها في معظم الأوقات. لكن المشكلة كانت في أن النتيجة النهائية كانت غالباً معيبة بشكل طفيف. وقد تبين أن جزءاً كبيراً من هذه الإخفاقات يعود إلى مشكلة تقنية محددة: فعندما يحتوي الكود الأصلي على مقطعين متطابقين أو متشابهين جداً، يعجز النموذج عن التمييز بينهما وتحديد أي مقطع منهما هو المقصود بالتعديل. هذا الارتباك في تحديد الموضع الصحيح يمثل وحده ما بين نصف إلى ثلثي أسباب فشل طريقة الخطوات المتتالية في كلا النموذجين اللذين تم اختبارهما. وبسبب هذا العجز عن فك الالتباس، قد يقوم النموذج بتعديل القسم الخطأ، مما يؤدي إلى نتائج غير دقيقة رغم أن الكود قد يظل قابلاً للتشغيل.
وحتى عندما قام الباحثون بتصفية الإخفاقات الواضحة ونظروا فقط في المهام التي أنتجت فيها كلتا الطريقتين كوداً يمكن للحاسوب ترجمته بنجاح، فإن طريقة إعادة الكتابة المباشرة لا تزال تنتج نتائج ذات جودة أعلى. فقد قيم قاضٍ مستقل من الذكاء الاصطناعي — والذي قيم الكود دون معرفة الطريقة التي أنشأته — مخرجات التوليد المباشر بأنها أكثر صحة وأفضل كتابة. وقد نفت الدراسة فكرة أن نماذج الخطوات المتتالية كانت ببساطة غير مدربة كفاية أو أن المهمة كانت صعبة للغاية عليها لتقسيمها إلى أجزاء. فقد استمرت فجوة الأداء حتى بعد أن أخذ الباحثون هذه العوامل في الاعتبار، مما يشير إلى أن طريقة توليد الكود نفسها كانت السبب الرئيسي في هذا الفرق.
ومع ذلك، فإن القصة ليست ذات جانب واحد تماماً. فقد وجد الباحثون أن نهج الخطوات المتتالية كان له مجال محدد يمكنه فيه المنافسة؛ حيث كان يعمل جيداً فقط عندما يكون التغيير المطلوب صغيراً وموضعياً جداً في جزء ضئيل من الملف. على سبيل المثال، عندما تتضمن المهمة إصلاح خطأ واحد أو إعادة هيكلة كتلة قصيرة ومعزولة من الكود، كانت نماذج الخطوات المتتالية جيدة تقريباً مثل تلك التي تعيد كتابة الملف بالكامل. ولكن بمجرد أن تتطلب المهمة سلسلة أطول من التغييرات أو تعديلات موزعة عبر أجزاء مختلفة من الملف، سرعان ما تراجعت طريقة الخطوات المتتالية. وخلص الباحثون إلى أن نجاح استراتيجية التحرير يعتمد على "محلية" (locality) المهمة: فإذا كان التغيير صغيراً ومكتفياً بذاته، فقد تنجح "الرقعة"، ولكن لأي شيء أكثر تعقيداً، فإن إعادة كتابة الملف بالكامل هي الخيار الأكثر أماناً وموثوقية.
يتحدى هذا الاكتشاف الافتراض الشائع بأن إجراء تعديلات صغيرة ومستهدفة هو دائماً المسار الأكثر كفاءة للذكاء الاصطناعي. فبينما توفر طريقة الخطوات المتتالية في كمية النص الذي يحتاج الحاسوب لتوليده، إلا أنها تزيد من خطر وقوع أخطاء دقيقة تتراكم بمرور الوقت. وتشير الدراسة إلى أنه لبناء أدوات موثوقة لتحرير الكود، فإن النهج الأفضل ليس إجبار النموذج على استخدام طريقة واحدة أو أخرى دائماً، بل إدراك طبيعة المهمة. فعندما يكون التغيير واسع النطاق أو معقداً، يجب السماح للنموذج بإعادة كتابة الملف بالكامل لضمان الدقة. وفقط عندما يكون التغيير صغيراً ومحصوراً في مكان محدد، ينبغي للنظام الاعتماد على سلسلة من التعديلات الصغيرة. يساعد هذا المنظور في توضيح كيفية تصميم أدوات أفضل للمطورين، مما يضمن أن الذكاء الاصطناعي الذي يستخدمونه ينتج كوداً ليس فقط فعالاً في توليده، بل صحيحاً ومتيناً في الممارسة العملية.
ملخص تقني: الفروقات (Diffs) مقابل الملفات الكاملة في تحرير الكود
بيان المشكلة تعمل النماذج اللغوية الكبيرة (LLMs) لتحرير الكود تحت نظامين أساسيين للمخرجات: التوليد المباشر، حيث يطلق النموذج الملف المعدل بالكامل في تمريرة واحدة، والتوليد القائم على الفروقات التكرارية ("الخطوات")، حيث يطلق النموذج سلسلة من عمليات البحث والاستبدال الموضعية التي تُطبق بالتتابع. وبينما يبدو نهج الفروقات جذاباً بشكل حدسي لوكلاء الإنتاج (مثل Aider) نظراً لكفاءة الرموز (tokens) وتوافقه مع سير عمل مراجعة البشر (طلبات السحب - pull requests)، إلا أن مسأهلة ما إذا كان هذا التنسيق يعمل كـ هدف تدريبي متفوق أم مجرد واجهة وقت الاستدلال تظل سؤالاً تجريبياً مفتوحاً. تقدم الأدبيات السابقة إشارات مختلطة: تشير بعض الأعمال إلى أن تسلسلات التعديل تحسن مناهج تركيب الكود (LintSeq)، بينما تشير الاختبارات المعيارية العملية إلى زيادة معدلات التعديلات المشوهة في تنسيقات الفروقات، خاصة في النماذج الأضعف. تسعى هذه الورقة إلى حل هذا الغموض من خلال عزل تأثير نظام المخرجات نفسه، مع التحكم في المتغيرات المربكة مثل بنية النموذج الأساسي، والبيانات، والترميز (tokenization).
المنهجية أجرى المؤلف دراسة تجريبية شاملة على نطاق محدد وواقعي: تحرير كود Flutter/Dart. تضمن تصميم الدراسة تدريب وتقييم أربعة نماذج متميزة لضمان مقارنة عادلة:
البنى الهيكلية (Architectures): خلفيتان مختلفتان تماماً في السعة وتاريخ التدريب المسبق:
Rainbow-Pony-100M: نموذج ترانسفورمر (Transformer) بـ 100 مليون معلمة تقريباً، من نوع decoder-only، تم تدريبه من الصفر على مجموعة بيانات Flutter/Dart.
Qwen2.5-Coder-0.5B: نموذج بـ 0.5 مليار معلمة تقريباً، تم ضبطه بدقة (fine-tuned) من قاعدة بيانات برمجية قوية مدربة مسبقاً.
أنظمة التدريب (Training Regimes): تم ضبط كل بنية بدقة في وضعين باستخدام نفس مجموعة المهام الأساسية (14,600 مهمة مصممة يدوياً):
المباشر (Direct): يولد النموذج الملف المعدل بالكامل بناءً على الملف الأصلي والتعليمات.
الخطوات (Steps): يولد النموذج سلسلة من إجراءات البحث والاستبدال. يتم تطبيق كل إجراء ميكانيكياً على حالة الملف قبل توليد الإجراء التالي، بحد أقصى 20 خطوة.
عدم التماثل في البيانات (Data Asymmetry): تشير الدراسة صراحةً إلى أن نظام "الخطوات" تلقى رموزاً (tokens) أكثر بـ 10 أضعاف تقريباً (50 مليون مقابل 5 ملايين) بسبب تفكيك أمثلة الملف الكامل إلى صفوف متعددة على مستوى الخطوة.
التقييم: تم تقييم جميع النماذج الأربعة على مجموعة محجوزة من ~1,790 مهمة لكل بنية باستخدام:
التحليل الساكن (Static Analysis):dart_pass (نجاح/فشل عبر dart analyze).
مقاييس التشابه: "البت لكل بايت" (Bits-per-byte) والتشابه على مستوى الحروف مع المرجع.
حكم LLM الأعمى (Blinded LLM Judge): قام نموذج gpt-4.1 بتقييم تحقيق الهدف، والصحة، وجودة الكود على مقياس من 1 إلى 5 دون معرفة هوية النموذج أو وضع التدريب.
تحليل المطابقة المعرفية (Matched-ID Analysis): تمت مقارنة مجموعة "نظيفة" من مسارات الخطوات (التي اكتملت بشكل طبيعي، دون حالات تراجع بسبب الغموض، وضمن الميزانية) مقابل التوليد المباشر لنفس معرفات المهام (task IDs) بالضبط للتحكم في انحياز صعوبة المهمة.
النتائج الرئيسية تسجل الورقة أربع نتائج رئيسية، مما يضع تسلسلاً هرمياً واضحاً للأداء:
هيمنة التوليد المباشر: عبر كلا البنيتين، يتفوق التوليد المباشر بشكل كبير على التوليد القائم على الفروقات التكرارية في كل المقاييس.
التركيب/التحليل الساكن: حقق التوليد المباشر معدل dart_pass بنسبة 80-90%، بينما تأخر وضع الخطوات بشكل ملحوظ (35-50%).
الجودة: حتى عند قصر المقارنة على الكود الذي يعمل (compiles) في كلا الجانبين، صنف حكم LLM الأعمى التوليد المباشر بدرجة أعلى بكثير من حيث تحقيق الهدف، والصحة، وجودة الكود.
أنماط الفشل: لا يعود الفارق بشكل أساسي إلى نفاد الخطوات لدى النموذج أو إنتاج تعديلات غير قابلة للتحليل. معظم حالات فشل وضع الخطوات تحدث في المسارات التي اكتملت "بشكل طبيعي" (stop_reason=done) ولكنها عانت من الانحراف الدلالي (semantic drift) أو الفساد الصامت.
دور الغموض: يُعزى جزء كبير من فجوة الجودة في وضع الخطوات إلى إجراء التراجع بسبب الغموض (ambiguity-fallback heuristic). عندما يتطابق نطاق البحث مع مواقع متعددة في الملف، يقوم النظام بالتحول تلقائياً إلى أول ظهور. المسارات التي تطلبت هذا التراجع سجلت معدلات نجاح منخفضة للغاية (مثلاً 12.3% لـ Rainbow-Pony مقابل 57.0% لغير حالات التراجع)، مما يشير إلى أن عدم قدرة النموذج على استهداف حالات كود محددة بدقة هو نقطة فشل رئيسية.
محلية المهمة كمحدد (Task Locality): بينما يفوز التوليد المباشر في الإجمالي، فإن النموذج القائم على الفروقات يكون تنافسياً في مجموعة فرعية محددة وقابلة لإعادة الإنتاج من المهام. تُعرف هذه المجموعة بـ محلية المهمة:
انتصارات النموذج القائم على الفروقات تتركز في المهام التي تتطلب تعديلات قصيرة وموضعية مكانياً (طول مسار منخفض).
فئات المهام التي يفوز فيها النماذج القائمة على الفروقات (إعادة الهيكلة - refactoring و معالجة الأخطاء/إصلاح الحالات الحدية) هي بشكل مستقل الفئات ذات أقل متوسط عدد خطوات تعديل في مجموعة البيانات.
مع زيادة طول المسار (trajectory length)، ينخفض معدل فوز وضع الخطوات بشكل رتيب، بينما يظل أداء التوليد المباشر مستقراً.
التوفيق مع الأعمال السابقة: تشير النتائج إلى أن فائدة "منهج تركيب الكود" الملحوظة في تركيب الكود (LintSeq) لا تترجم إلى تحرير الكود للملفات الموجودة والمقيدة دلالياً. في التركيب، يتم اكتشاف الأخطاء بشكل تراكمي؛ أما في التحرير، فإن تعديلاً واحداً غامضاً يمكن أن يكسر بشكل صامت كوداً كان يعمل سابقاً.
الأهمية والادعاءات تخلص الورقة إلى أنه بالنسبة لمهام تحرير الكود، فإن التوليد المباشر للملف الكامل هو الاستراتيجية الافتراضية الأفضل للنماذج الصغيرة والمتوسطة، بشرط ألا تكون المهمة محلية للغاية. ويجادل المؤلف بأن حجة "كفاءة الرموز" للفروقات تفوقها تكلفة "الانحراف الدلالي" للتطبيق التكراري، خاصة عند حدوث الغموض.
المساهمة المركزية هي تحديد محلية المهمة كمتغير حاكم. لا يدعي المؤلف أن تنسيقاً واحداً أفضل عالمياً، بل يقترح أن اختيار النظام يجب أن يكون تكيفياً بناءً على النطاق المكاني للتغيير المطلوب. وهذا يدعم فرضيات التنسيق التكيفي الأخيرة (Cheng et al., 2026)، مما يشير إلى أن النموذج (أو الموجه/Router) القادر على اختيار التنسيق لكل تعديل سيتفوق على النماذج ذات التنسيق الثابت.
القيود يقر المؤلف بعدة قيود:
عدم تماثل ميزانية الرموز: تلقت نماذج الخطوات رموزاً أكثر في التدريب، ومع ذلك لم تحقق أداءً عالياً، مما يشير إلى أن الفجوة متأصلة في النظام وليس في نقص التدريب.
نطاق واحد: النتائج محددة بلغة Flutter/Dart وقد لا تعمم على لغات أخرى أو مستودعات برمجية متعددة الملفات.
غياب التغذية الراجعة للتنفيذ: كان وضع الخطوات عبارة عن حلقة تمريرة واحدة بدون تغذية راجعة من المترجم (compiler) أو الاختبارات بين التعديلات، مما يختلف عن حلقات الإصلاح الوكيلية (agentic repair loops).
القيود الاستدلالية (Heuristic Limitations): حل الغموض (أول ظهور) هو مصدر معروف للخطأ؛ وقد يؤدي استخدام نظام تطبيق أكثر صرامة إلى تغيير حجم الفجوة.
صلاحية الحكم: لم يتم التحقق من درجات حكم الـ LLM مقابل مقيمين بشريين في هذا العمل.
باختصار، توفر الورقة أدلة تجريبية على أنه بينما يعد التوليد القائم على الفروقات أمراً بديهياً لسير عمل البشر، فإنه يفرض مخاطر كبيرة على الموثوقية والجودة للنماذج اللغوية الكبيرة عند تحرير الكود الموجود، ما لم تكن التعديلات محلية للغاية وقصيرة.