رأي

الأعطال الصامتة في خطوط معالجة الذكاء الاصطناعي: لماذا تكذب الحالة الخضراء للحاوية، وكيف خفّضنا 90% من تكاليف نماذج اللغة

الفرع الاحتياطي داخل كتلة catch دون عداد وتنبيه مستقلّين يُخفي فشلاً كاملاً للنظام: خط معالجة وكيلي جديد يضم 3 نماذج لم يعمل في بيئة الإنتاج ولا مرة واحدة على مدى عدة أشهر، في حين ظلّت واجهة سطر الأوامر (CLI) معلّقة بسبب إعدادات OAuth فارغة لخوادم MCP. وضع مرشّح أوّلي حتمي للعناوين إلى جانب أداة إزالة التكرار القائمة على الثلاثيات الحرفية (trigram) قبل استدعاء نموذج اللغة وتوليد الوسائط أدّى إلى استبعاد 76.5% من الضجيج المعلوماتي، وخفّض النفقات اليومية على واجهة البرمجة (API) بنسبة 90% تقريباً (من أكثر من 100 إلى 22 استدعاءً في كل تشغيل). استخدام DEFAULT 0 بدلاً من DEFAULT NULL عند ترحيل عمود التقييم أسقط بصمت 678 مقالة جيدة من النتائج، كما أن دورة سكون (sleep) قبل أول تشغيل لمهمة خلفية كانت تصفّر تحديث أسعار العملات مع كل عملية نشر.

الأعطال الصامتة في خطوط معالجة الذكاء الاصطناعي: لماذا تكذب الحالة الخضراء للحاوية، وكيف خفّضنا 90% من تكاليف نماذج اللغة
Hamidun News.
استمع للمقال
بطاقة الحقائق والأرقام
المعيارالتفاصيل
رئيس التحرير
فعالية التقييم الحتمياستبعاد 76.5% من التدفق الوارد غير ذي الصلة دون أي استدعاء لواجهة البرمجة (API)، وتحرير 4.9 جيجابايت من مساحة القرص
موارد مخفية2,244 ملف صوتي مُنتَج (6 جيجابايت، بتغطية 69% من القاعدة) لم تظهر في الواجهة بسبب حقل مفقود في جملة `SELECT`
  • توفير الرموز (tokens) عبر الترشيح المسبق: تراجع نسبة الإنفاق الهادر من 88% إلى أدنى مستوى، وانخفاض استدعاءات نموذج اللغة من أكثر من 100 إلى 22 في كل تشغيل (-90% من الموازنة)
  • فعالية التقييم الحتمي: استبعاد 76.5% من التدفق الوارد غير ذي الصلة دون أي استدعاء لواجهة البرمجة (API)، وتحرير 4.9 جيجابايت من مساحة القرص
  • ثمن الخطأ في ترحيل قاعدة البيانات: فقدان 678 مقالة بسبب استخدام `DEFAULT 0` بدلاً من `DEFAULT NULL`، وارتفاع عدد المقالات المعتمدة في القاعدة من 341 إلى 943 بعد عملية التعبئة الرجعية (backfill)
  • موارد مخفية: 2,244 ملف صوتي مُنتَج (6 جيجابايت، بتغطية 69% من القاعدة) لم تظهر في الواجهة بسبب حقل مفقود في جملة `SELECT`

أغلى فئة من الأخطاء في أنظمة الذكاء الاصطناعي المستقلة ليست الانهيار المصحوب بتتبّع خطأ أحمر، بل الفشل الصامت (`silent failure`). فالحاوية تُظهر في `docker ps` حالة `Up`، ومهمة الـ cron تنتهي بالرمز `0`، والمقالات تظهر في التغذية — في حين أن الكود الجديد الذي استغرق تطويره أسبوعاً كاملاً لم يُنفَّذ في الواقع ولا مرة واحدة.

هذا بالضبط ما حدث في خط معالجة الأخبار القائم على الذكاء الاصطناعي الخاص بي بعد الانتقال من تركيبة `n8n + Airtable` إلى بنية خادم خاصة بنا (40 ساعة من الترحيل، وملف `MIGRATION.md` يتجاوز 600 سطر للحفاظ على السياق بين الجلسات). بنيت سلسلة من 3 وكلاء (`EditorAgent` و`WriterAgent` و`QAAgent`) وغلّفتها بكتلة `try / catch` دقيقة تتحول عند الفشل إلى `AIProcessor` القديم.

لماذا تُخفي كتلة catch ذات الفرع الاحتياطي فشلاً مكوّناً من 5 طبقات لشهور؟

بما أن الفرع الاحتياطي كان يُصدر المقالات دون انقطاع، بدا النظام سليماً من الخارج. ولم ألحظ إلا بعد مرور عدة أشهر سطراً متكرراً في السجلات: `Agent pipeline failed. Falling back to AIProcessor`. وعندما بدأنا بتفكيك طبقات هذا الفشل (استغرقت الجلسة 1,320 رسالة و517 تشغيلاً للوكلاء الفرعيين)، ظهرت تحت الغطاء دمى متداخلة من 5 أسباب:

1. رمز تفويض CLI قصير الأجل كان ينتهي صلاحيته كل بضع ساعات. 2. إعداد `timeout` كان يُقبَل في مُنشئ الوكيل الأساسي، لكنه لم يُمرَّر إلى الاستدعاء الفرعي. 3. النموذج الثقيل في مرحلة الانتقاء لم يكن يلتزم بحد الوقت على الحزم الكبيرة (التحوّل إلى نموذج أسرع عجّل هذه الخطوة بمعدل 3 إلى 4 مرات). 4. الملف التنفيذي المُحدَّث لـCLI لم يعد يقبل العلم القديم `--max-tokens`. 5. داخل الحاوية، كان CLI يتجمّد تماماً عند السطر `Fetched 4 servers` أثناء محاولة تهيئة موصلات MCP السحابية (Notion وFigma وLinear وSentry) بإعدادات OAuth فارغة.

العبرة واضحة لا جدال فيها: أي حل احتياطي (fallback) دون عداد وتنبيه مستقلّين ليس تحمّلاً للأعطال، بل تغطية على حادثة. وبالمثل، فإن حالة `Up` للحاوية لا تكشف وجود سكريبت Python داخلي عالق في حلقة انهيار متكررة بسبب `SyntaxError` مستهلكاً 98% من المعالج: الاختبار الحقيقي هو `PID` مستقر منذ أكثر من 60 ثانية وتشغيل ناجح لأمر `python3 -m py_compile`.

كيف تخفّض إعادة ترتيب مراحل خط المعالجة وإزالة التكرار بالثلاثيات

الحرفية 90% من موازنة النماذج؟

كشفت المراجعة الثانية عن ثغرة مالية: من بين 3,235 خبراً تمت معالجتها، لم يُنشر منها سوى 340، لكن استدعاءات نموذج اللغة المكلفة، وإنشاء الصور، وتحويل النص إلى كلام (TTS) كانت تُنفَّذ قبل الترشيح النهائي (كان 88% من الموازنة يُهدَر بلا فائدة، وكانت مهمة crontab مكرّرة تُشغّل جامع البيانات 288 مرة يومياً بدلاً من 48). فوضعنا أمام النموذج مرشّحاً أوّلياً مجانياً يعتمد على التعبيرات النمطية (regex) وأوزان المصادر (أكثر من 100 نمط بالإنجليزية والروسية والصينية، حيث تُستخدم `includes()` بدلاً من `\b` مع الأحرف الصينية الخالية من الفراغات):

```javascript function scoreArticle(title, sourceName) { let score = 0; const t = (title || '').toLowerCase(); const s = (sourceName || '').toLowerCase(); if (SOURCE_TIERS.tier1.some(x => s.includes(x))) score += 4; else if (SOURCE_TIERS.tier2.some(x => s.includes(x))) score += 3; let kw = 0; for (const rx of AI_KEYWORDS) { if (rx.test(title)) kw++; } score += Math.min(kw, 4); if (AI_COMPANIES.some(c => t.includes(c))) score += 2; if (title && title.length > 20) score += 1; if (/\d/.test(title)) score += 1; return score; } ```

هذا المرشّح يستبعد 76.5% من الضجيج الوارد دون استهلاك رمز واحد. أما اكتشاف التكرار، فقد استبدلنا فيه نموذج اللغة بحل هجين يجمع بين معامل جاكار (Jaccard) على مستوى الثلاثيات الحرفية ومسافة ليفنشتاين (Levenshtein)، مع خفض عتبة جاكار للمورفولوجيا الروسية من 0.65 إلى 0.40 مع مطابقة الكيانات. وانخفض الإنفاق على واجهة البرمجة بنسبة 90% (من أكثر من 100 إلى 22 استدعاءً في كل تشغيل)، كما أن تنظيف الوسائط اليتيمة حرّر 4.9 جيجابايت (1,764 صورة و1,398 ملف صوتي).

لماذا يُخفي DEFAULT 0 في ترحيل قاعدة البيانات، ودورة sleep قبل أول

تشغيل، بيانات كاملة؟

كلّف الفشل الصامت الثالث شهوراً من البحث: فعند إضافة العمود عبر `ALTER TABLE ... ADD COLUMN hot_score INTEGER DEFAULT 0`، حصلت جميع المقالات القديمة البالغ عددها 678 على تقييم `0`، فلم يعد SQL قادراً على التمييز بين «لم يُحسب بعد» و«حصل على صفر فعلياً». وأدّى التحوّل إلى `DEFAULT NULL` مع عملية تعبئة رجعية (backfill) إلى إعادة 581 مقالة إلى النتائج، فارتفع عدد المقالات المعتمدة في القاعدة إلى ثلاثة أمثالها تقريباً، من 341 إلى 943.

وبجانب ذلك، عثرنا على `LIMIT 5` منسي في استعلام المنظّم (orchestrator)، وحقل `audio_path` مفقود من جملة `SELECT`، ما كان يُخفي 2,244 ملفاً صوتياً جاهزاً بسعة 6 جيجابايت (69% من القاعدة). وأخيراً، كانت مهمة أسعار العملات الخلفية تبدأ بـ `await asyncio.sleep(86400)` قبل أول تشغيل لها، فلم تنجح في العمل ولا مرة واحدة مع عمليات النشر اليومية (وتمّ إصلاح ذلك عبر `FIRST_RUN_DELAY_S = 90` ومتغيّر `last_success_at`)، كما أن فحص الملفات الثابتة عبر `curl` باستخدام رمز الحالة `200` على إعداد nginx لتطبيق صفحة واحدة (SPA) كان يعيد `index.

html` بدلاً من الإشارة إلى ملفات PDF المفقودة.

هذه الثوابت المتعلقة بقابلية المراقبة مدمجة في منصة [Nomad AI](https://nomadnet.ai) وبيئة التشغيل السحابية [agent.nomadnet.ai](https://agent.nomadnet.ai). وتتوفر ورشة عملية حول تصحيح أخطاء خطوط المعالجة المستقلة في [Hamidun Academy](https://academy.hamidun.com) (نسخة تجريبية لمدة 72 ساعة)، أما سكريبتات التدقيق فهي متوفرة في [Vibe Club](https://hamidun.com/club).

أسئلة وأجوبة حول الخبر

لماذا تُخفي كتلة catch ذات الفرع الاحتياطي فشلاً مكوّناً من 5 طبقات لشهور؟

بما أن الفرع الاحتياطي كان يُصدر المقالات دون انقطاع، بدا النظام سليماً من الخارج. ولم ألحظ إلا بعد مرور عدة أشهر سطراً متكرراً في السجلات: `Agent pipeline failed. Falling back to AIProcessor`. وعندما بدأنا بتفكيك طبقات هذا الفشل (استغرقت الجلسة 1,320 رسالة و517 تشغيلاً للوكلاء الفرعيين)، ظهرت تحت الغطاء دمى متداخلة من 5 أسباب: 1. رمز تفويض CLI قصير الأجل كان ينتهي صلاحيته كل بضع ساعات. 2. إعداد `timeout` كان يُقبَل في مُنشئ الوكيل الأساسي، لكنه لم يُمرَّر إلى الاستدعاء الفرعي. 3. النموذج الثقيل في مرحلة الانتقاء لم يكن يلتزم بحد الوقت على الحزم الكبيرة (التحوّل إلى نموذج أ

كيف تخفّض إعادة ترتيب مراحل خط المعالجة وإزالة التكرار بالثلاثيات الحرفية 90% من موازنة النماذج؟

كشفت المراجعة الثانية عن ثغرة مالية: من بين 3,235 خبراً تمت معالجتها، لم يُنشر منها سوى 340، لكن استدعاءات نموذج اللغة المكلفة، وإنشاء الصور، وتحويل النص إلى كلام (TTS) كانت تُنفَّذ قبل الترشيح النهائي (كان 88% من الموازنة يُهدَر بلا فائدة، وكانت مهمة crontab مكرّرة تُشغّل جامع البيانات 288 مرة يومياً بدلاً من 48). فوضعنا أمام النموذج مرشّحاً أوّلياً مجانياً يعتمد على التعبيرات النمطية (regex) وأوزان المصادر (أكثر من 100 نمط بالإنجليزية والروسية والصينية، حيث تُستخدم `includes()` بدلاً من `\b` مع الأحرف الصينية الخالية من الفراغات): ```javascript function scoreArticle(title

لماذا يُخفي DEFAULT 0 في ترحيل قاعدة البيانات، ودورة sleep قبل أول تشغيل، بيانات كاملة؟

كلّف الفشل الصامت الثالث شهوراً من البحث: فعند إضافة العمود عبر `ALTER TABLE ... ADD COLUMN hot_score INTEGER DEFAULT 0`، حصلت جميع المقالات القديمة البالغ عددها 678 على تقييم `0`، فلم يعد SQL قادراً على التمييز بين «لم يُحسب بعد» و«حصل على صفر فعلياً». وأدّى التحوّل إلى `DEFAULT NULL` مع عملية تعبئة رجعية (backfill) إلى إعادة 581 مقالة إلى النتائج، فارتفع عدد المقالات المعتمدة في القاعدة إلى ثلاثة أمثالها تقريباً، من 341 إلى 943. وبجانب ذلك، عثرنا على `LIMIT 5` منسي في استعلام المنظّم (orchestrator)، وحقل `audio_path` مفقود من جملة `SELECT`، ما كان يُخفي 2,244 ملفاً صوتياً

ZK
جمال حميدون — مدير المنتجات في Alpina Digital ومدير منتج AlpinaGPT. يبني منتجات الذكاء الاصطناعي منذ 2019. بدأ Hamidun News كمشروع شخصي ثم أصبح مُجمِّعًا إنتاجيًا بأكثر من 6000 قارئ.
✦ Autonomous AI Execution · Nomad Agent

Delegate Deep Research, Coding & Multi-Step Workflows to Nomad Agent

Deploy autonomous task execution with Nomad Agent (agent.nomadnet.ai) — automated web research, data synthesis, code generation, and MCP tool orchestration.

Launch Nomad Agent →Nomad AI Workspace
ما رأيك؟
جارٍ تحميل التعليقات…