جاءنا أحد مشغّلي الأطعمة الطازجة بسؤال واضح: هل يمكنكم التنبّؤ بطلب الغد لكل طبق ولكل موقع، بدقة كافية تجعلنا نتوقف عن إهدار الهامش ولا ننفد مخزوننا وقت الظهيرة؟ وبعد ثمانية عشر شهرًا، تتنبّأ المنصة بدقة 98% في بيئة الإنتاج. يُفترض أن الجزء الأصعب كان تعلّم الآلة. لم يكن كذلك.
النموذج الذي ينتج التنبّؤ هو مُنحدِر معزَّز بالتدرّج (gradient boosted regressor) أُضيفت إليه بضع سمات للموسمية. وبإمكان عالِم بيانات كفؤ أن يبني شيئًا من هذه العائلة في عصر يوم واحد. وكان لدينا نسخة أولى محترمة في أقل من ثلاثة أسابيع — دقيقة بما يكفي في الاختبار الرجعي (backtest) لتجعل الجميع في الغرفة يومئون موافقةً.
ثم أمضينا خمسة أشهر في بناء كل ما يحوّل «اختبارًا رجعيًا دقيقًا» إلى «رقم يراهن عليه مدير العمليات يومه كله». تلك الفجوة هي العمل كله، ولا يكاد أحد يتحدث عنها لأنها ليست برّاقة. فها هي إذن.
01النموذج في ثلاثة أسابيع
التنبّؤ بالطلب لنشاط مستقر وجيّد التسجيل هو، بصراحة، مشكلة محلولة. لديك هدف (الوحدات المباعة)، وتقويم، وكومة من الصفوف التاريخية. تصمّم بضع عشرات من السمات — يوم الأسبوع، ونوافذ التأخّر، والمتوسطات المتحركة، والعطلات، ووصلة بيانات الطقس — وتترك مكتبة تعزيز (boosting) تكتشف التفاعلات. ليست الرياضيات هي ما تموت عنده المشاريع.
ما اشترته لنا الأسابيع الثلاثة فعليًا هو اليقين بأن الإشارة موجودة أصلًا. فقد أخبرنا الاختبار الرجعي أن الطلب قابل للتنبّؤ بفارق نقطة أو نقطتين مئويتين، شريطة وجود مدخلات نظيفة. هذا هو الضوء الأخضر. وليس هو المنتج.
رقم الاختبار الرجعي الجيّد هو أخطر أثر في تعلّم الآلة. فهو يبدو كخط النهاية مع أنه بالكاد طلقة البداية. تعمل الاختبارات الرجعية على بيانات نظّفها إنسان يعرف الإجابة سلفًا وربطها وحاذاها زمنيًا. أما الإنتاج فلا يحظى بأيٍّ من هذه الرفاهيات.
02أين ذهبت الأشهر الخمسة
إليك الحساب الصادق للأشهر الخمسة التالية. لا شيء منها نمذجة. كله هو ما جعل النموذج قابلًا للاستخدام.
- استيعاب بيانات (ingestion) يصمد أمام الواقع. تصل تدفقات المبيعات متأخرة، أو مكرّرة، أو لا تصل البتة. تُعاد نقطة بيع (POS) تشغيلها فتعيد تشغيل يوم الأمس. بنينا استيعابًا متعاديًا (idempotent) يمكن إعادة تشغيله بأمان، ويعزل الصفوف التي لا يثق بها بدلًا من تسميم مجموعة التدريب.
- مخزن سمات (feature store) له ذاكرة. يجب أن تكون السمات التي يتدرّب عليها النموذج قابلة للحساب لحظة التنبّؤ، بالبيانات التي ستملكها فعلًا في تلك اللحظة فقط — دون اختلاس النظر إلى المستقبل. وفرض هذه الدقة الزمنية اللحظية (point-in-time) استغرق أسابيع من العمل، وأمسك بتسريبين كانا قد ضخّما الاختبار الرجعي الأولي.
- إعادة التعبئة (backfill) والإعادة (replay). حين كان تاريخ أحد المواقع خاطئًا، كان علينا إعادة بناء كل تنبّؤ لاحق لذلك الموقع دون إيقاف النظام الحيّ. الإعادة سباكة لا يعرضها أحد ويحتاجها الجميع.
- المراقبة قبل الميزات. شحنّا إنذارات الانحراف (drift) والطزاجة (freshness) قبل أن نشحن نصف الواجهة. فالتنبّؤ الخاطئ بصمت أسوأ من التنبّؤ الغائب على نحو ظاهر.
- التجاوز البشري (override). يُفتتح موقع جديد، أو يحلّ مهرجان، أو يُغلق طريق. لا يمكن للنموذج أن يعلم بذلك. احتاج المخطّطون إلى وسيلة مأذونة لتعديل الرقم وجعل النظام يتعلّم من ذلك التعديل.
النموذج يجيب عن سؤال. أما المنصة فتقرّر أي سؤال، وبأي بيانات، ولمن، وماذا يحدث حين تكون الإجابة خاطئة.
— عن سبب كون الغلاف هو العمل الحقيقي03عقد البيانات
أكثر ما بنيناه تأثيرًا لم يكن تحسينًا للنموذج. بل كان عقد بيانات: عقد مخطَّط صريح ومُتحقَّق منه بين كل مصدر سابق ومسارنا. أنواع الأعمدة، والنطاقات المسموح بها، ونوافذ الطزاجة، وسياسات القيم الفارغة — كلها مُعلَنة، وكلها مفحوصة عند الباب.
قبل العقد، كان بإمكان التنبّؤ أن يتدهور بصمت لأن مزوّد نقطة بيع غيّر حقل عملة من السنتات إلى الدولارات دون إخبارنا. أما بعد العقد، فيُرفض هذا التغيير عند الاستيعاب بخطأ مُسمّى ومُصعَّد — ويبقى آخر تنبّؤ جيّد على الشاشة بدلًا من تنبّؤ جديد واثق وخاطئ.
# كل مصدر يُتحقَّق منه عند الباب، لا بعد أن يسمّم التدريب sales_daily: units: int >= 0 # ارفض السالب — المبالغ المستردّة تذهب إلى مكان آخر revenue: decimal(10,2) # سنتات → أُشير إليه في v3، ويُفرَض الآن site_id: fk(sites) # موقع غير معروف → عزل، تصعيد إلى المناوبة recorded_at: freshness <= 6h # تدفق قديم → احتفظ بآخر تنبّؤ جيّد on_violation: quarantine + alert # أبدًا: التدرّب عليه بصمت
هذا هو القلب غير البرّاق لكل نظام تعلّم آلة إنتاجي شحنّاه. النموذج دالة؛ والعقد هو ما يضمن أن تتلقّى الدالة المدخلات التي دُرّبت على توقّعها. تجاوزه ولن يكون لديك منصة تنبّؤ — بل مولّد أرقام عشوائية باهظ الثمن يصيب في معظم الأحيان.
04الانحراف ميزة، لا فشل
كل نموذج يتدهور. الأذواق تتبدّل، وتظهر قائمة طعام جديدة، ويفتتح منافس في المقابل. والسؤال ليس أبدًا إنْ كان العالم سينزلق من تحت نموذجك — بل هل ستعلم بذلك من لوحة معلومات أم من مكالمة غاضبة.
نتعامل مع كشف الانحراف بوصفه ميزة منتج من الدرجة الأولى. تقارن المنصة باستمرار توزيعات المدخلات الحيّة والخطأ الحيّ بمراجع التدريب. وحين يتجاوز أيٌّ منهما عتبةً، تفعل ثلاثة أشياء، بهذا الترتيب:
- تخبر شخصًا ما — إنسانًا بعينه، مع الموقع والمقياس ومقدار التحرّك.
- تحمي المخرَج — بتوسيع نطاقات الثقة أو بالارتداد إلى مرجع أبسط وأمتن، بدلًا من الوثوق بنموذج بات يستقرئ خارج نطاقه.
- تجدول إعادة تدريب — بالبيانات الجديدة، مشروطةً بالعتبة ذاتها للاختبار الرجعي التي كان على الأصل تجاوزها.
محقَّقة في الإنتاج، لا في الاختبار الرجعي فحسب.
الثلاجات الفارغة وقت الظهيرة، انخفضت بأكثر من النصف.
هامش كان يُهدَر سابقًا في نهاية اليوم.
لاحظ أن الرقم الرئيسي — 98% — ليس الأكثر إثارة للاهتمام. فالأرقام المثيرة هي الرقمان المحيطان به، لأنهما ما يشعر به النشاط فعلًا. الدقة هي المدخل؛ وقلّة الهدر وقلّة نفاد المخزون هما المخرج. والمنصة التي تحسّن الأول وتتجاهل الثاني هي مشروع مختبري.
05لوحة المعلومات التي يطّلع عليها أحدهم في الثامنة صباحًا
يستهلك التنبّؤَ رئيسُ مطبخ في بداية مناوبة، على جهاز لوحي، وقهوته في يده، في تسعين ثانية. وقد صاغ هذا القيد عددًا من القرارات أكبر مما صاغته بنية النموذج.
فرض أن تكون الإجابة كمية، لا توزيع احتمالات. وفرض أن تكون عبارة «أنا لا أوافق، وهذا هو السبب» على بُعد نقرة واحدة. وفرض أن تُظهر الشاشة تنبّؤ الأمس مقابل ما حدث فعلًا، لأن الثقة تُكتسب بالمساءلة الظاهرة، لا بالثقة الزائدة بالنفس. والنموذج العاجز عن عرض سجلّه أمام من يعتمد عليه سيُتجاهَل بصمت في أقل من أسبوع.
ليس درجة F1. ولا RMSE. كان اختبار القبول رئيسَ مطبخ، في أسبوعه الثاني، يقول «نعم، صرت الآن أفعل ما يقوله ببساطة». هذه العبارة تساوي أكثر من أي مقياس خارج الاتصال، ولا تُكتسب إلا بتصميم التسعين ثانية الأخيرة بالعناية ذاتها التي صُمّم بها النموذج.
06ملاحظات إلى ذواتنا السابقة
إن كنت على وشك بدء شيء من هذا الشكل، فإليك ما كنا سنقوله للفريق الذي بدأ قبل ثمانية عشر شهرًا:
- ضع ميزانية للغلاف، لا للنموذج. افترض أن النموذج يمثّل 15% من الجهد، وخطّط للـ 85% المتبقية عمدًا. الفرق الذين يتجاوزون مواعيدهم النهائية هم من وضعوا الميزانية بالعكس.
- اكتب عقد البيانات أولًا. قبل أي سمة. فسيُظهِر تسريبًا في اختبارك الرجعي ويجنّبك شحن رقم لا يمكنك الدفاع عنه.
- اشحن المراقبة قبل الواجهة. لا يمكنك تشغيل ما لا تستطيع رؤيته، والتنبّؤ الخاطئ الذي لم يلحظه أحد هو نمط الفشل الذي يكلّف العقود.
- صمّم التجاوز. سيعرف البشر دائمًا أشياء يجهلها النموذج. امنحهم ذراعًا مأذونة وتعلّم منها، وإلا فسيلتفّون على النظام كله في جدول بيانات.
- اجعل النموذج مساءلًا على الشاشة. اعرض سجلّه إلى جوار تنبّؤه. الثقة قرار واجهة بقدر ما هي مسألة رياضيات.
كان تعلّم الآلة هو الجزء السهل. ونقول ذلك لا لنقلّل من شأن النموذج — فهو جيّد بصدق — بل لنشير إلى أين تكمن الصعوبة فعلًا. تبيع دورة الضجيج الأسابيع الثلاثة. أما الأشهر الخمسة فهي ما تدفع مقابله فعلًا لفريق هندسي.

