تخطَّ إلى المحتوى
cd /blog

التحسين الذاتي المتكرر للغات: صقل ذكاء الكود عبر نحو 280 لغة

[المعمارية][اللغات][الوكلاء]

> ندعم ذكاء الكود لنحو 280 لغة. لا يستطيع أي إنسان تدقيق ذلك يدويًا. لذا بنينا حلقة تحسين ذاتي متكرر للغات — فحص عيّني، وحكَم LLM، وإصلاح شيء واحد، وإعادة تحقق — ونُشغِّلها بأسطول من الوكلاء المعزولين حتى يصبح الاستخلاص صحيحًا فعلًا، لا مجرد أخضر (green).

تعكس الأرقام في هذا المنشور حالة النظام وقت النشر (مايو 2026). راجع صفحة فريقنا للأرقام الحالية.

يستخلص Maguyva الرموز، والمراجع، ورسمًا بيانيًا للتبعيات من كود المصدر في نحو 280 لغة. كل لغة هي معالِج tree-sitter مخصَّص — استعلامات، وأساليب استدلال، وحالات حدّية — ويمكن أن يكون كل معالِج خاطئًا بطريقة دقيقة خاصة به. استدعاء دالة يُصدَر كقراءة. دالة تُنسَب إلى النطاق المحيط الخطأ. علاقة غير موجودة أصلًا.

لا يمكنك تدقيق ذلك يدويًا. لا يستطيع أي فريق قراءة مخرَجات الاستخلاص عبر 280 قواعد نحوية واكتشاف الحواف السيئة. لذا فإن السؤال المثير للاهتمام ليس “هل استخلاصنا صحيح” — إنه “كيف تكتشف أنه خاطئ، بهذا الاتساع، دون إنسان في كل حلقة”. إجابتنا هي التحسين الذاتي المتكرر للغات: حلقة جودة يقودها وكلاء اللغات، وLLM يعمل حكَمًا، وقاعدة واحدة نستمر في إعادة تعلّمها: الأخضر (green) ليس مرادفًا للصحيح.

الأخضر ليس صحيحًا

لكل لغة مجموعة تجهيزات اختبار (fixtures)، وتُقيِّمها بوابة إصدار عبر خمسة أبعاد — الدقة، والسلامة البنيوية، والاكتمال، والجودة، والأداء. لا تصبح اللغة خضراء (GREEN) إلا عندما تكون الدقة (precision) ≥ 0.95، والاستدعاء (recall) ≥ 0.99، وF1 ≥ 0.97 على تجهيزاتها، مع 20 حافة (edge) متوقَّعة على الأقل للثقة الإحصائية. دون ذلك تكون صفراء (YELLOW) أو حمراء (RED)، ولا تُشحَن.

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

الحلقة الداخلية: فحص عيّني، حكم، إصلاح، إثبات

تُشغَّل الحلقة الأساسية للغة واحدة في كل مرة:

        ┌──────────────────────────────────────────────────────────┐
        │                                                          │
        ▼                                                          │
  1. corpus run ── clone real-world repos, extract relationships   │
        │                                                          │
        ▼                                                          │
  2. spot-check 100 edges (seed 42, then seed 123 to cross-check)  │
        │                                                          │
        ▼                                                          │
  3. LLM judge classifies every sampled edge:                      │
        CORRECT · FALSE_POSITIVE · TYPE_ERROR ·                    │
        SCOPE_ERROR · METADATA_ERROR                               │
        │                                                          │
        ▼                                                          │
  4. fix ONE thing — handler .py, .scm query, or config           │
        │                                                          │
        ▼                                                          │
  5. re-validate — F1 + re-classify + manifest diff (no regressions)│
        │                                                          │
   better? ──no──► revert, try a different fix ────────────────────┤
        │ yes                                                       │
        ▼                                                           │
  6. promote the fix into fixtures (a permanent regression guard) ──┘

بضعة أشياء تجعل هذا ينجح بدلًا من أن يتخبط.

الحكَم هو الوكيل، لا استدعاء واجهة برمجية (API). عندما نقول “LLM كحكَم”، نعني أن وكيل اللغة نفسه يقرأ كل حافة (edge) مأخوذة كعيّنة مقابل المصدر الحقيقي ويصنِّفها وفق معيار ثابت من خمس فئات: هل هذه الحافة صحيحة، أم إيجابية كاذبة، أم العلاقة الصحيحة بنوع خاطئ، أم مرتبطة بنطاق خاطئ، أم تحمل بيانات وصفية خاطئة؟ ذلك المعيار هو اللعبة كلها — “معدل خطأ 23%” لا معنى له حتى تعرف ما إذا كانت تلك عيوبًا حقيقية أم سوء عدّ من الحكَم.

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

الدرس الذي نستمر في إعادة تعلّمه: المقاييس تُبالغ في الإبلاغ

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

أوضح مثال: أظهرت llvm ذات مرة معدل “مصدر بلا رمز” بنسبة 73% ووُصِمت بالكارثية. تعمّقنا في الأمر. كانت الدقة الحقيقية 98.5%. كانت “الرموز المفقودة” في معظمها مراجع خارجية مشروعة — استدعاءات إلى المكتبة القياسية، وإلى الأطر، وإلى كود يعيش خارج المستودع. كان المقياس يقيس خاصية للغة، لا عيبًا في المعالِج. لغات مثل Zig وCOBOL وOdin تُظهر معدلات “يُتم” بنسبة 65–70% وهي صحيحة تمامًا؛ لم يكن لدى COBOL أي أخطاء حقيقية.

لو تركنا تلك الأرقام تقود العمل، لكنا أمضينا أسابيع في “إصلاح” معالِجات كانت صحيحة بالفعل، وتجاهلنا اللغات ذات الأخطاء الحقيقية الهادئة. الخلاصة صريحة: المقاييس الإجمالية إشارة فرز أولي تقريبية في أفضل الأحوال. الإشارة الحقيقية للجودة هي الفحص العيّني مع تصنيف الحواف — النظر في حواف فعلية في مستودعات فعلية والحكم عليها واحدة تلو الأخرى. البيانات فوق الحدس، لكن فقط بمجرد أن تعرف أي البيانات يقول الحقيقة.

الحلقة الخارجية: أسطول، لا ماراثون

لغة واحدة في كل مرة ستستغرق وقتًا لا نهائيًا عبر 280 لغة، لذا تُغلَّف الحلقة الداخلية بحلقة خارجية تُشغِّل عددًا كبيرًا بالتوازي.

   pick a wave of near-GREEN / high-error languages


   fan out 10–15 agents, each ISOLATED in its own git worktree,
   each grinding ONE language, committing to its own branch


   orchestrator integrates serially: file-scoped apply, then
   `manifest diff` — any cross-language regression blocks the batch


   gated push (reviewed and confirmed) ──► rotate to the next wave

يعمل كل وكيل في شجرة عمل (worktree) قابلة للتخلص منها كي لا يتداخلوا مع بعضهم. يُدمِج المنسِّق إصلاحاتهم واحدًا تلو الآخر، كل واحد خلف فحص انحدار كامل المانفست: تغيير يساعد لغته الخاصة لكنه يكسر بصمت ثلاث لغات أخرى لا يُدمَج. التكامل مُحصَّن ومؤكَّد قبل دفع أي شيء — تقرر بوابة الانحدار ما هو آمن، ويقرر إنسان دائمًا ما يُشحَن. ثم يدور المجمع (pool) إلى المجموعة التالية من اللغات ويتكرر كل شيء مجددًا.

ما لا يزال غير كامل

يمكن أن يكون الحكَم مخطئًا، وللخطأ اتجاه: وكيل يعمل بسياق قليل جدًا يُبالغ في الإبلاغ. في دفعة واحدة، صُنِّفت ثماني لغات بخطأ 5–20%؛ وعند الفحص، كانت واحدة فقط علة حقيقية خاصة باللغة — البقية كانت أخطاء حكَم ناتجة عن إغفال دلالات اللغة نفسها (سطر مصدر واحد يُصدر شرعيًا عدة حواف، وربط معاملات نُمذِج كإسنادات، ولغات مرجع-لكل-معرِّف). لهذا نأخذ عينات ببذرتين (seeds) ونتقاطع في الفحص، ولهذا يُعامَل الاختلاف بين الحكَم والتجهيزات كأكثر إشارة مثيرة للاهتمام، لا حكمًا نهائيًا — أحيانًا تكون التجهيزة نفسها هي المخطئة.

نحن صادقون أيضًا بشأن الهدف. الهدف هو صفر أخطاء حقيقية، تمامًا — لكن “الصفر” اتجاه نصقل نحوه، لغةً تلو أخرى، لا مربعًا يُعلَّم عليه. توجد دائمًا مستودع آخر باصطلاح آخر.

مُكتسَب، لا مُدَّعى

كل ما يفعله Maguyva من أجل وكيل — إيجاد رمز، وتتبّع تبعية، والإجابة عن سؤال بكود مُستشهَد به — يرتكز على صحة الاستخلاص الذي تحته. عبر 280 لغة، لا يمكن أن يُدَّعى “الصحيح”؛ يجب أن يُكتسَب باستمرار مقابل كود حقيقي. الحلقة هي كيف نكتسبه: دورة مستقلة من الفحص العيّني والإصلاح تعامل مقاييسها الخاصة بريبة، وتُثبِت كل تغيير، وتحوِّل كل إصلاح إلى حارس ضد الانحدار التالي. إنه ليس عملًا برّاقًا. إنه العمل الذي يتيح لنا أن نقول “ندعم لغتك” ونعنيه فعلًا. الأخضر سهل. الصحيح مُكتسَب.

قراءات ذات صلة

المزيد من سجل بناء Maguyva