
بقلم: سارة | محررة نماذج الذكاء الاصطناعي · صوت تحريري بإشراف بشري
كشف الإصدار b9982 من llama.cpp عن خلل صامت ظلّ مخفياً في صميم آلية التحكم بميزانية التفكير لدى نماذج الاستدلال: أي قيمة يرسلها المطوّر لحقل reasoning_budget_tokens في طلب الـ chat completion كانت تُتجاهل تماماً، ويتولى السيرفر تطبيق قيمته الافتراضية بدلاً منها.
المشكلة كانت في ترتيب العمليات داخل الدالة oaicompat_chat_params_parse: كانت تُكتب قيمة reasoning_budget على مستوى السيرفر في llama_params قبل أن تشتغل حلقة النسخ العامة من جسم الطلب، فتجد الحلقة المفتاح موجوداً مسبقاً وتتخطاه بصمت. بمعنى عملي: إذا أرسلت reasoning_budget_tokens: 0 لإيقاف التفكير كلياً في طلب بعينه، كان النموذج يتجاهل ذلك ويفكّر كأنّ شيئاً لم يحدث. الإصلاح جاء بسيطاً في جوهره: قراءة reasoning_budget_tokens من جسم الطلب أولاً، ثم الرجوع إلى الإعداد الافتراضي للسيرفر عند الغياب (وفقاً لـ llama.cpp GitHub).
المشكلة ذاتها كانت تطال حقل reasoning_budget_message، وهو النص الذي يُحقن قبل وسم الإغلاق حين تنفد ميزانية التفكير — فكانت رسالة السيرفر الافتراضية تطغى دائماً على أي رسالة مخصصة يرسلها المطوّر مع كل طلب. الإصلاحان متناظران في المنطق، وكلاهما موثّق الآن بـ unit test في ملف test-chat.cpp يستخدم قالب Qwen3 — الذي يتعرّف عليه المحلل التلقائي كنموذج قادر على التفكير — ويتحقق أن القيمة الواصلة إلى طبقة sampling هي القيمة التي أرسلها المطوّر فعلاً.
هذا الخلل بالغ الأثر على كل من يبني تطبيقاً يتحكم ديناميكياً في عمق تفكير النموذج بحسب نوع الطلب، سواء كان يعمل مع Qwen3 أو غيره من نماذج الاستدلال. مقاله السابق حول إصلاح اختفاء الصور في b9977 يُظهر نمطاً ثابتاً: الإصدارات الأخيرة من llama.cpp تركّز على سدّ الثغرات الصامتة قبل أن تتراكم.







