كل المشاريع

تعلم آلي تطبيقي · هندسة مجموعات البيانات

اختبار الشيفرة بالذكاء الاصطناعي

يبدأ المشروع من الأصل المفقود: مجموعة متعددة الفئات وقابلة للتتبع لعيوب شيفرة Python. ويجمع البيانات من ثلاث فئات مصادر ثم يعنونها ويزيل التكرار ويرشحها ويوازنها قبل تقييم مصنّف TF-IDF وXGBoost عبر سبع فئات نهائية.

  • Python
  • Corpus engineering
  • TF-IDF + XGBoost
أرقام رئيسية لمجموعة البيانات وشريط توازن لسبع فئات يلخصان مجموعة Python المعنونة.

المشكلة

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

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

لماذا كانت البيانات هي الجزء الأصعب

لم تكن هناك مجموعة معنونة جاهزة تطابق سؤال التصنيف السباعي. وفرت ملفات المستودعات شيفرة واقعية لكنها كانت تميل بشدة إلى الشيفرة الصحيحة، وقدمت Stack Overflow كتل شيفرة قصيرة مرتبطة بنقاشات، بينما استطاع التوليد الاصطناعي استهداف أنواع العيوب الناقصة لكنه أدخل بنى متكررة. لم يكن بمقدور مصدر واحد أن يحمل المهمة وحده.

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

ولا تزال هذه السلسلة قابلة للعد؛ تبدأ بـ7,749 مرشحاً جرى جمعها، وتصل إلى 11,511 بعد دمج مجمعات المصادر المحتفظ بها، ثم تنخفض إلى 7,646 عنصراً فريداً، وتنتهي عند 3,502 عينة معنونة تمثل 3,495 زوجاً فريداً من الشيفرة والتسمية. ولا تكتسب نتيجة المصنّف معناها إلا لأن هذه السلسلة قابلة للشرح.

ثلاثة مصادر وثلاث استراتيجيات

ساهمت خمسة مستودعات Python عامة مورّدة بـ3,975 ملفاً من خلال فحص محلي للمستودعات. وقدمت واجهة Stack Overflow API عدد 2,774 مرشحاً موسوماً بـPython عبر التصفح على صفحات، وضبط معدل الطلبات، واستخراج كتل الشيفرة من HTML. وأضاف مولّد 1,000 مثال من 31 قالب عيب مكتوباً يدوياً.

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

العنونة وحدودها بوضوح

أُسندت التسميات برمجياً؛ فاشتُقت تسميات كتل المستودعات وStack Overflow من مخرجات pylint وflake8، بينما ورثت العينات المولدة فئة القالب الذي أنشأها. ثم أُجريت مراجعة يدوية للكتل المصنفة.

لا تمثل هذه العملية حقيقة مرجعية عنونها خبراء. كما تعمل فئة Correct Code كحاوية افتراضية عندما لا تثبت الإشارات المربوطة فئة أخرى، ولذلك فهي أوسع وأكثر تنوعاً لغوياً من فئة عيب محددة بدقة. ويساعد هذا القرار في تفسير الالتباس اللاحق مع Syntax Error بدلاً من إخفائه خلف رقم رئيسي واحد.

التنقيح غيّر مجموعة البيانات

أنتجت مجمعات المصادر المحتفظ بها 11,511 مرشحاً قبل أن تخفضها إزالة التكرار التام إلى 7,646 عنصراً فريداً. ثم أسفر الترشيح والموازنة اللاحقان عن 3,502 عينة نهائية. وانتقلت نسبة أكبر فئة إلى أصغر فئة من نحو 4.7:1 في الجمع الخام إلى 1.43:1 في المجموعة النهائية.

وغيّر التنقيح التصنيف أيضاً؛ فقد استمرت Style Error خلال جزء كبير من المسار ثم أُوقفت قبل التدريب النهائي، لتبقى سبع فئات. كان حذف تسمية لم يعد دليلها كافياً قراراً في تصميم البيانات، لا ناتجاً ثامناً مفقوداً.

توزيع فئات مجموعة البيانات النهائية
الفئةالعيناتالنسبة (%)
Logical Error59016.85
Syntax Error53415.25
Correct Code52314.93
Performance Issue50514.42
Runtime Error48613.88
Compatibility Issue45112.88
Security Issue41311.79
الإجمالي3502100.00

الميزات والنموذج

تحول TF-IDF النص المنقح إلى 6,457 ميزة، ثم يصنفه XGBoost. ويستخدم التقييم النهائي تقسيماً 80/20 مع random_state=42: عدد 2,801 عينة للتدريب و701 عينة محفوظة للاختبار.

ويحدد هذا التمثيل البسيط سقف الأداء أيضاً؛ إذ يسقط نمط الرموز الافتراضي في المحول علامات الترقيم والرموز أحادية الحرف، رغم أن محارف مثل النقطتين والأقواس قد تحمل معنى نحوياً حاسماً في Python.

النتائج مرتبطة بالمنهج

حقق إعادة تشغيل نظيفة باستخدام مُرمّز تسميات موحد دقة 81.6% وmacro F1 مقداره 0.820 وweighted F1 مقداره 0.818 عبر سبع فئات على 701 عينة محفوظة. وتراوح F1 لكل فئة من 0.67 لفئة Syntax Error إلى 0.94 لفئة Performance Issue.

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

يمثل الالتباس بين Correct Code وSyntax Error نسبة 22% من جميع الأخطاء. وتغلق هذه النتيجة الحلقة مع التسمية الافتراضية وتمثيل الرموز؛ فبعض العيوب النحوية لا تحمل الإشارات اللفظية التي يراها النموذج. وترافق الرسوم جداول دلالية حتى تظل كل قيمة متاحة دون الاعتماد على الصورة.

مقاييس التقييم المعاد تشغيلها لكل فئة
الفئةالدقة الإيجابيةالاستدعاءF1عدد عينات الاختبار
Compatibility Issue0.92000.80230.857186
Correct Code0.66090.67860.6696112
Logical Error0.85470.89290.8734112
Performance Issue0.95960.92230.9406103
Runtime Error0.82860.79090.8093110
Security Issue0.91860.91860.918686
Syntax Error0.63460.71740.673592
المتوسط الكلي0.82530.81760.8203701
المتوسط الموزون0.82200.81600.8180701
الدقة0.8160701
أعداد الفئات الفعلية مقابل المتوقعة عبر سبع فئات
الفعلية / المتوقعةCompatibility IssueCorrect CodeLogical ErrorPerformance IssueRuntime ErrorSecurity IssueSyntax Error
Compatibility Issue69710117
Correct Code376625317
Logical Error031000207
Performance Issue05095102
Runtime Error111408734
Security Issue11004791
Syntax Error112625066

ما الذي تكشفه أربعة أمثلة جديدة

استخدم فحص نوعي صغير أربعة مقتطفات كُتبت خصيصاً لمعرض الأعمال، ولم تُنفذ ولم تؤخذ من مجموعة البيانات. وافق تنبؤ النموذج القراءة المقصودة في اثنين من الأربعة: مثال الأمان والدالة السليمة. أما مثال النقطتين المفقودتين ومثال مخاطر وقت التشغيل فعادا إلى Correct Code.

لا يمثل ذلك مقياس دقة ثانياً، بل اختباراً نوعياً محدوداً للتعميم يوضح لماذا لا يكون تكبير النموذج أول تحسين. الخطوة التالية هي تمثيل أغنى يشمل نجاح التحليل وشكل AST وأنماط أنواع الرموز، يتبعه قياس جودة التسميات وتقسيم واعٍ بالمجموعات يمنع صور القالب الواحد من الظهور في التدريب والاختبار معاً.