Code Generation2021متوسط14 دقيقة قراءة

تقييم النماذج اللغوية الكبيرة المُدرَّبة على الشيفرات البرمجية

Evaluating Large Language Models Trained on Code

Chen, M. · Tworek, J. · Jun, H. · Yuan, Q. · Pinto, H.P.O. · Kaplan, J. · Edwards, H. · Burda, Y. · Joseph, N. · Brockman, G. · Ray, A. · Puri, R. · Krueger, G. · Petrov, M. · Khlaaf, H. · Sastry, G. · Mishkin, P. · Chan, B. · Gray, S. · Ryder, N. · Pavlov, M. · Power, A. · Kaiser, L. · Bavarian, M. · Winter, C. · Tillet, P. · Such, F.P. · Cummings, D. · Plappert, M. · Chantzis, F. · Barnes, E. · Herbert-Voss, A. · Guss, W.H. · Nichol, A. · Paino, A. · Tezak, N. · Tang, J. · Babuschkin, I. · Balaji, S. · Jain, S. · Saunders, W. · Hesse, C. · Carr, A.N. · Leike, J. · Achiam, J. · Misra, V. · Morikawa, E. · Radford, A. · Knight, M. · Brundage, M. · Murati, M. · Mayer, K. · Welinder, P. · McGrew, B. · Amodei, D. · McCandlish, S. · Sutskever, I. · Zaremba, W. — arXiv

المشكلة

بحلول عام 2021، كانت النماذج اللغوية الكبيرة مثل GPT-3 قد أثبتت قدرات مبهرة في مهام اللغة الطبيعية، لكن قدرتها على كتابة شيفرات برمجية صحيحة كانت شبه معدومة. فعند تجربته على معيار HumanEval لم يستطع GPT-3 حلّ أيّ مسألة برمجية على الإطلاق. في المقابل كان الطلب على البرمجة بمساعدة الذكاء الاصطناعي يتزايد بسرعة، لكن لم تكن هناك طريقة موثوقة لتوليد شيفرة صحيحة من وصف بلغة بشرية، ولا معيار منهجي لقياس التقدّم في هذا الاتجاه.

الإسهام

قدّمت الورقة Codex: نموذج GPT مُكيَّف على 159 غيغابايت من شيفرات بايثون المنشورة على GitHub. يحلّ Codex-12B نسبة 28.8% من مسائل HumanEval بعينة واحدة (pass@1)، مقابل 0% لنموذج GPT-3. ومع توليد 100 عينة لكل مسألة تصل النسبة إلى 72.3%. كما قدّمت الورقة معيار HumanEval الذي يضمّ 164 مسألة مكتوبة يدوياً لقياس ، ومقياس pass@k مع ، ونسخة Codex-S المُكيَّفة بإشراف والتي ترفع pass@1 إلى 37.7%. النسخة الإنتاجية من Codex تُشغّل خدمة GitHub Copilot.

الأثر

أثبتت Codex أن النماذج اللغوية يمكن أن تتحوّل إلى أدوات برمجة عملية حين تُكيَّف على شيفرات مصدرية، فافتتحت عصر مساعدات البرمجة المدعومة بالذكاء الاصطناعي. أصبح معيار HumanEval المرجع القياسي لتقييم ، واعتمدته عملياً كل النماذج اللاحقة. ورسّخ إطار pass@k المنهجية الصحيحة لتقييم مولّدات الشيفرات العشوائية. تقنيات الورقة — التوليد المتكرّر وضبط درجة والتكييف بإشراف — أصبحت أساسيات يبني عليها كل من جاء بعدها. ومن أحفادها المباشرين Phi-1 وStarCoder، كما ألهمت معايير مثل SWE-bench وتطبيقات مثل Voyager.

تخيّل طالباً لامعاً درس كل ما يخصّ اللغة والأدب، لكنه لم يرَ سطر شيفرة واحداً في حياته. تُعطيه كتاب برمجة وتقول له: «اقرأ هذا وابدأ بكتابة بايثون.» سيفهم قواعد اللغة بلا شك، لكن البرامج التي يكتبها ستبدو منطقية ظاهرياً وهي في الحقيقة لا تعمل.

الآن تخيّل أنك بدلاً من ذلك أرسلته ليعمل سنة كاملة في شركة برمجيات، يقرأ شيفرات حقيقية ويكتبها طوال اليوم. حين يعود وتصف له دالة بكلام بشري عادي، يكتب لك شيفرة تعمل من أول محاولة — أو على الأقل في واحدة من محاولاته الأولى.

هذا بالضبط ما فعلته هذه الورقة مع GPT-3: على ملايين ملفات بايثون الحقيقية فتحوّل من مبتدئ عاجز عن حلّ أي مسألة إلى مولّد شيفرات قادر وفعّال.

من نموذج لغوي إلى مولّد شيفرات: مسار Codex

تدرّب GPT-3 على كمّ هائل من نصوص الإنترنت، فاكتسب فهماً قوياً للغة الطبيعية. لكن كتابة الشيفرات عالمٌ مختلف تماماً: الصياغة صارمة، والمنطق يجب أن يكون متّسقاً بالكامل، والشيفرة لا تُعدّ صحيحة ما لم تجتز اختبارات الوحدة. بعبارة أبسط: أن تُجيد كتابة مقال لا يعني أنك تستطيع كتابة دالة بايثون.

الفكرة الجوهرية في هذه الورقة أنّ نفسها التي تتفوّق في التنبؤ بالكلمة التالية في جملة، قادرة أيضاً على التنبؤ بـ التالي في برنامج — بشرط أن تتدرّب على كمية كافية من الشيفرات. جمع الباحثون 159 غيغابايت من ملفات بايثون من 54 مليون مستودع عام على GitHub، ثم كيّفوا GPT-3 على هذه البيانات لإنتاج Codex.

والمفاجأة أنه رغم انطلاق Codex من GPT-3 الذي يملك أصلاً تمثيلات لغوية قوية، لم يُلاحَظ تحسّن في الأداء النهائي مقارنة بـ من الصفر. الفائدة الوحيدة من البدء بـ GPT-3 كانت أسرع أثناء التدريب، لا دقة نهائية أعلى.

افتح في المختبر
استكشف مسار بناء Codex: يبدأ من GPT-3 الذي يُكيَّف على شيفرات GitHub لإنتاج Codex، ثم يُصقَل إلى نسختَي Codex-S وCodex-D.
تستيقظ التجربة عند وصولك…

ثمّة تفصيل هندسي بالغ الأهمية: GPT-3 صُمِّم أصلاً للغة الطبيعية حيث الفراغات قليلة ولا تحمل معنى كبيراً. لكن بايثون تعتمد اعتماداً جوهرياً على المسافات البادئة — كل مسافة وكل جدولة لها دلالة بنيوية. لذلك أضاف الباحثون رموزاً خاصة تمثّل تسلسلات الفراغات بأطوال مختلفة، فانخفض عدد الرموز بنحو 30%. قد يبدو هذا تعديلاً بسيطاً، لكن أثره كبير: رموز أقل لكل ملف تعني أن النموذج يرى مساحة أوسع من الشيفرة ضمن الثابتة، كأنك توسّع له مجال الرؤية أثناء توليد البرامج.

HumanEval: قياس الصحة الوظيفية

السؤال المحوري: كيف تتأكّد أن الشيفرة التي ولّدها النموذج تعمل فعلاً؟ قبل هذه الورقة، كان التقييم يعتمد غالباً على المُستعار من الترجمة الآلية، وهو يقيس مدى التشابه النصّي بين الشيفرة المُولَّدة وحلّ مرجعي. المشكلة أن برنامجين مختلفين تماماً في الشكل قد يؤدّيان الوظيفة ذاتها، وبرنامجان يبدوان متطابقَين قد يسلكان سلوكاً مختلفاً كلياً بسبب تغيير حرف واحد.

لذلك قدّم الباحثون HumanEval: 164 مسألة برمجية ببايثون كُتبت يدوياً، كل منها تضمّ توقيع دالة و للمهمة ومتوسط 7.7 اختبار وحدة. الحلّ لا يُعدّ صحيحاً إلا إذا اجتاز جميع الاختبارات — وهو المعيار نفسه الذي يعمل به المطوّرون البشريون في التطوير المبني على الاختبارات.

النقطة الجوهرية هنا أن هذه المسائل كُتبت خصيصاً لهذا التقييم. بما أن Codex تدرّب على شريحة واسعة من GitHub، فمسائل المعايير القائمة — كمسائل مواقع البرمجة التنافسية — ربما ظهرت في بيانات التدريب. كتابة مسائل جديدة يدوياً تحمي من خطر هذا.

المقياس الأساسي هو pass@k: ولِّد k عينة شيفرة لكل مسألة، وتُعدّ المسألة محلولة إذا نجحت أيّ عينة منها في اجتياز جميع اختبارات الوحدة. التقدير المباشر لهذا المقياس يعاني من تباين مرتفع، لذلك اشتقّ الباحثون مُقدِّراً غير منحاز. عملياً، يولّدون nkn \geq k عينة (عادةً n=200n = 200) ثم يعدّون الصحيح منها cc ويحسبون:

pass@k=1(nck)(nk)\text{pass@}k = 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}}
المُقدِّر غير المنحاز لمقياس pass@kتحسب هذه الصيغة احتمال أن تحتوي kk عينة مسحوبة بدون إرجاع من nn مرشّحاً (منها cc صحيحة) على حلّ صحيح واحد على الأقل. وتتفادى الانحياز الذي يعانيه المُقدِّر الأبسط 1(1p^)k1 - (1 - \hat{p})^k، إذ يميل الأخير إلى التقليل المنهجي من معدّل النجاح الحقيقي.
افتح في المختبر
جرّب تغيير عدد العينات ومعدّل نجاح العينة الواحدة وراقب كيف يرتفع pass@k. كلّما زادت العينات ارتفع احتمال العثور على حلّ صحيح بشكل ملحوظ.
تستيقظ التجربة عند وصولك…

قوانين القياس: النماذج الأكبر تكتب شيفرات أفضل

كما بيّن GPT-3 أن أداء النماذج اللغوية يتحسّن وفق منتظم مع الحجم، تكشف ورقة Codex أن النمط ذاته يستمرّ بعد التكييف على الشيفرات. خسارة الاختبار على مجموعة بايثون محجوزة تتبع العلاقة (N5.92×107)0.13\left(\frac{N}{5.92 \times 10^7}\right)^{-0.13} حيث NN عدد المعاملات غير التضمينية.

والأهمّ أن هذا يمتدّ إلى المقياس الوظيفي الذي يهمّنا فعلاً: pass@k. حين ينمو النموذج من 12 مليون إلى 12 مليار معامل، يقفز pass@1 (عند درجة حرارة T=0.2T = 0.2) من 2.0% إلى 28.8%، ويقفز pass@100 (عند T=0.8T = 0.8) من 8.6% إلى 72.3%. العلاقة تتّخذ شكل منحنى في لوغاريتم عدد المعاملات، ما يعني أن ثمّة حجماً حرجاً ينتقل عنده النموذج من توليد شيفرات معطوبة في أغلبها إلى توليد شيفرات تعمل في أغلبها.

افتح في المختبر
راقب كيف يتغيّر pass@1 وpass@100 مع تكبير النموذج. كل نقطة تمثّل نسخة من Codex بحجم يتراوح بين 12 مليون و12 مليار معامل.
تستيقظ التجربة عند وصولك…

هنا ملاحظة عملية مهمة: درجة الحرارة المثلى أثناء التوليد تتوقّف على عدد العينات التي ستولّدها. إن كان لديك محاولة واحدة فقط (pass@1)، فالأفضل حرارة منخفضة T=0.2T = 0.2 حيث يلتزم النموذج بـالرموز الأكثر ترجيحاً ويتجنّب المغامرة. أما إن كان لديك محاولات كثيرة (pass@100)، فالأفضل حرارة أعلى T=0.8T = 0.8 لأن التنوّع في العينات يرفع احتمال أن تحتوي إحداها على الحلّ الصحيح.

فكّر في الأمر كمسابقة مواهب: لو كان لديك متسابق واحد فقط، ستختار الأكثر موثوقية. لكن لو كان لديك مئة متسابق، فأنت تريد التنوّع — قد يظهر شخص غير تقليدي يُفاجئك بأداء استثنائي لن يصل إليه عشرات الخيارات الآمنة.

اختيار أفضل مرشّح بدون تشغيل الاختبارات

مقياس pass@k يفترض وجود «أوراكل» — أي أنك تعرف أيّ عينة صحيحة لأنك تملك اختبارات الوحدة. لكن في الواقع العملي، كأداة إكمال تلقائي مثلاً، لا تملك اختبارات. أنت تُولّد عدة حلول مرشّحة وعليك اختيار واحد تعرضه على المستخدم. فكيف تختار؟

قارن الباحثون ثلاث طرق. الأولى: الاختيار العشوائي ببساطة. الثانية: ترتيب العينات حسب متوسط — أي اختيار العينة التي «يثق» بها النموذج أكثر من غيرها. الثالثة: الترجمة العكسية باستخدام Codex-D (الذي يُولّد أوصافاً نصية من الشيفرة)، واختيار العينة التي يصف كودها الوصف الأصلي بأفضل شكل.

النتيجة: ترتيب العينات بالاحتمال اللوغاريتمي تفوّق بوضوح على الاختيار العشوائي وتفوّق قليلاً على الترجمة العكسية. مع Codex-12B عند حرارة 0.8 و100 عينة، حقّق هذا الترتيب دقة 44.5% مقابل 77.5% للأوراكل. بعبارة أخرى: بدون تشغيل أي اختبار، تستطيع استعادة أكثر من نصف ميزة الأوراكل بسؤال بسيط: «أيّ إجابة يثق بها النموذج أكثر؟»

افتح في المختبر
قارن بين ثلاث طرق لاختيار العينة الأفضل: الاختيار العشوائي والترتيب بالاحتمال اللوغاريتمي والأوراكل. لاحظ كيف تتّسع الفجوة بينها كلّما زادت العينات.
تستيقظ التجربة عند وصولك…

Codex-S: التكييف بإشراف لشيفرات أدقّ

معظم شيفرات بايثون على GitHub ليست دوال مستقلة مصحوبة بـأوصاف نصية — بل تشمل تعريفات أصناف وملفات إعداد وسكريبتات وحتى ملفات لتخزين البيانات. هذا الاختلاف في التوزيع يعني أن Codex يبذل جزءاً كبيراً من طاقته في تعلّم أنماط لا صلة لها بالمهمة المطلوبة: توليد دوال من أوصاف نصية.

لتركيز Codex على المهمة، بنى الباحثون Codex-S بـ على مجموعة منتقاة من الدوال المستقلة المكتوبة بشكل صحيح. جاءت هذه الدوال من مصدرين: مواقع البرمجة التنافسية (لاختبار التفكير الخوارزمي) ومشاريع مفتوحة المصدر تعمل بالتكامل المستمرّ (لاختبار مهارات التنفيذ العملي). بلغ المجموع نحو 50,000 مسألة تدريبية.

وكانت خطوة ضبط الجودة حاسمة: استخدموا Codex-12B نفسه لتوليد 100 عينة لكل مسألة، ثم استبعدوا أيّ مسألة لم تنجح فيها أيّ عينة. بهذه الطريقة تخلّصوا من المسائل الغامضة أو المُفرطة الصعوبة التي كانت ستُدخل ضوضاء في التدريب.

النتائج كانت لافتة: حقّق Codex-S نسبة 37.7% في pass@1 و77.5% في pass@100، مقابل 28.8% و72.3% للنسخة الأساسية — أي أن Codex-S يصل إلى أداء مماثل بنموذج أصغر بمقدار رتبة إلى رتبتين من حيث عدد المعاملات.

Codex-D: وصف الشيفرات بلغة طبيعية

مسار Codex يسير في اتجاه واحد: وصف نصي ← شيفرة. لكن الباحثين أرادوا الاتجاه المعاكس أيضاً: شيفرة ← وصف نصي. الدافع هنا يتعلّق بالأمان: إن كان النموذج يولّد شيفرة، فوجود نموذج مرافق يشرح ما تفعله تلك الشيفرة يساعد المستخدم على التحقّق من سلوكها.

لبناء Codex-D، أعاد الباحثون ترتيب بيانات التدريب: بدلاً من (التوقيع + الوصف + جسم الدالة)، استخدموا (التوقيع + جسم الدالة + الوصف) ودرّبوا النموذج على التنبؤ بالوصف النصي. وحين قُيِّمت النتائج يدوياً — إذ لا توجد طريقة آلية للحكم على جودة نصّ بشري — حقّق Codex-D نسبة 20.3% في pass@1 و46.5% في pass@10، وهي نسب قريبة من أداء Codex-S في توليد الشيفرات وإن كانت أقلّ قليلاً.

ومن الطرائف أن النموذج يعكس طبيعة بيانات تدريبه: فقد يُنتج أحياناً عبارات مثل «وجدت هذه الدالة على الإنترنت» أو «هذا الاختبار مكتوب بشكل خاطئ وليس من حلولي» — محاكياً أسلوب التوثيق العفوي المنتشر في مستودعات GitHub الحقيقية.

القيود: أين يتعثّر Codex

رغم هذه النتائج المبهرة، لدى Codex أنماط إخفاق واضحة. أبرزها تدهور الأداء مع سلاسل العمليات: صمّم الباحثون مهامّ اصطناعية بربط عمليات نصّية بسيطة بعضها ببعض — مثل «حوّل إلى أحرف صغيرة» ثم «احذف كل حرف ثالث» ثم «اعكس ترتيب الكلمات». كل عملية بمفردها سهلة على Codex، لكن كلّما طالت السلسلة انخفض معدّل النجاح بشكل أسّي — يتراجع تقريباً إلى النصف مع كل عملية تُضاف.

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

النمط الثاني هو أخطاء ربط المتغيّرات. حين يتضمّن الوصف النصي عدة عمليات على عدة متغيّرات، كثيراً ما يُطبّق Codex العملية الصحيحة على المتغيّر الخطأ. مثلاً: لو طلبت منه «أضف 3 إلى y واطرح 4 من x وw ثم أعِد حاصل ضرب الأربعة»، قد ينسى إنقاص w ويحسب الناتج بشكل خاطئ. السبب العميق أن النموذج يرى رموزاً متتالية ولا يملك جدول متغيّرات يتتبّع حالتها.

افتح في المختبر
راقب كيف ينخفض معدّل النجاح بشكل أسّي مع كل عملية إضافية في السلسلة — ينخفض تقريباً إلى النصف في كل مرة.
تستيقظ التجربة عند وصولك…
مثال: فشل ربط المتغيّرات في Codexpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

def do_work(x, y, z, w):
    """أضِف 3 إلى y، ثم اطرح 4
    من كلٍّ من x وw. أعِد حاصل
    ضرب الأعداد الأربعة."""
    # ما يولّده Codex:
    t = y + 3
    u = x - 4
    v = z * w      # خطأ: w لم تُنقَص
    return v        # خطأ: ليس حاصل ضرب الأربعة

الأثر الأوسع: الأمان والمواءمة والمجتمع

تُفرد الورقة مساحة واسعة لمخاطر نشر أنظمة توليد الشيفرات. أخطر هذه المخاوف وأدقّها هو الاعتماد المفرط: Codex قادر على توليد شيفرة تبدو سليمة للوهلة الأولى لكنها تُخفي أخطاء دقيقة. المبرمجون المبتدئون هم الأكثر عرضة لهذا الخطر — قد لا يملكون الخبرة الكافية لاكتشاف الأخطاء فيقعون في شعور زائف بالأمان.

ثمّ تبرز مسألة : حين يحتوي السياق المُدخَل على شيفرة فيها أخطاء، يميل Codex إلى محاكاة تلك الأخطاء بدلاً من تصحيحها. والمفارقة أن المشكلة تزداد سوءاً مع النماذج الأكبر — لأنها أمهر في محاكاة أسلوب المُدخَل بما فيه عيوبه. فالنموذج مُحسَّن للتنبؤ بما يلي السياق في توزيع التدريب، لا لأن يكون مفيداً للمستخدم. نموذج عالي القدرة لكنه غير مُوائَم قد يُنتج شيفرة مُموَّهة تبدو سليمة عند التدقيق لكنها تفعل شيئاً غير مرغوب.

ويُنبّه الباحثون أيضاً إلى مخاطر أمنية (شيفرات قد تحتوي ثغرات)، ومخاوف (تعليقات الشيفرات قد تعكس صوراً نمطية من بيانات التدريب)، وتأثيرات اقتصادية على سوق عمل المبرمجين، وتكاليف بيئية لتدريب النماذج الكبيرة، وأسئلة قانونية حول التدريب على شيفرات منشورة علنياً.

النتائج الرئيسية في لمحة

افتح في المختبر
استعرض أداء النماذج المختلفة على HumanEval. انقر على أيّ نموذج لترى نتائجه في pass@1 وpass@10 وpass@100.
تستيقظ التجربة عند وصولك…

الإرث: عصر البرمجة بالذكاء الاصطناعي

  1. 2020

    GPT-3 يُظهر قدرة برمجية بدائية

    استطاع GPT-3 توليد برامج بسيطة من أوصاف نصية لكنه لم يحلّ أيّ مسألة من HumanEval. أشار هذا إلى أن نماذج أكبر مع تدريب مخصّص على الشيفرات قد تحقّق نتائج أفضل بكثير.

  2. 2021

    إطلاق Codex وGitHub Copilot

    قدّمت هذه الورقة Codex ومعيار HumanEval وإطار pass@k. النسخة الإنتاجية شغّلت GitHub Copilot، أول مساعد برمجي بالذكاء الاصطناعي يُتبنّى على نطاق واسع.

  3. 2022

    AlphaCode يخوض البرمجة التنافسية

    ولّد AlphaCode من DeepMind ملايين العينات لمسائل البرمجة التنافسية وصفّاها ليحقّق أداءً على مستوى المتسابقين البشريين في منصة Codeforces.

  4. 2023

    StarCoder ونماذج الشيفرات مفتوحة المصدر

    أطلق مشروع BigCode نموذج StarCoder المُدرَّب على The Stack، مجموعة بيانات شيفرات متعددة اللغات جُمعت بمسؤولية. أصبحت نماذج الشيفرات مفتوحة المصدر تُنافس النماذج المملوكة.

  5. 2023

    SWE-bench يُقيّم هندسة البرمجيات الواقعية

    انتقل SWE-bench إلى ما هو أبعد من توليف الدوال ليُقيّم النماذج على مشكلات GitHub حقيقية تتطلّب فهم قواعد شيفرات كاملة — خليفة طبيعي لتقييم HumanEval على مستوى الدوال.

  6. 2023

    Phi-1 يحقّق نتائج قوية بنماذج صغيرة

    أظهر Phi-1 من مايكروسوفت أن بيانات التدريب العالية الجودة (شيفرات بمستوى الكتب الدراسية) تُمكّن نموذجاً من 1.3 مليار معامل من تحقيق 50.6% في pass@1 على HumanEval — متجاوزاً Codex-12B الأصلي بعُشر عدد المعاملات.

ورقة Codex لحظة فاصلة في تاريخ المجال. قبلها كان توليد الشيفرات فضولاً أكاديمياً بلا فائدة عملية تُذكر. بعدها تحوّلت البرمجة بمساعدة الذكاء الاصطناعي إلى صناعة تُقدَّر بمليارات الدولارات. لا يزال HumanEval المعيار الأكثر استشهاداً في تقييم توليد الشيفرات، ومقياس pass@k الذي قدّمته هذه الورقة أصبح الطريقة القياسية لتقييم مولّدات الشيفرات. كل نموذج جاء بعدها — StarCoder وCode Llama وGPT-4 وClaude — يبني على الأساس الذي أرسته Codex.

المرجعChen, Tworek, Jun, Yuan, Pinto, Kaplan, Edwards, Burda, Joseph, Brockman, et al.. Evaluating Large Language Models Trained on Code. arXiv, 2021.

مصطلحات هذه الورقة