الـ Agents· الدرس 5 من 6
- 1إيه هو الـ Agent؟8 دقيقة
- 2حلقة الـ Agent9 دقيقة
- 11نمط ReAct — الـ Agent اللي بيفكر قبل ما يتحرك8 دقيقة
- 20الـ Reflection — الـ Agent اللي بيراجع شغله9 دقيقة
- 21نمط الـ Evaluator–Optimizer — واحد يبني وواحد يحكم9 دقيقة
- 22تبني الـ Agents بإيه؟ — من غير Framework ولا LangGraph ولا CrewAI ولا AutoGen؟10 دقيقة
نمط الـ Evaluator–Optimizer — واحد يبني وواحد يحكم
في سطر واحد · **النمط بيقسم الشغل لاتنين: Optimizer بيولّد، و Evaluator بيحكم بمعايير معلنة — والـ Loop شغال لحد ما المخرج يعدي البوابة... أو الميزانية تخلص.** <!-- Field 3: TL;DR -->
- السؤال الحقيقي: إزاي تضمن جودة ثابتة من Generator شغال على نطاق واسع — من غير بشري يراجع كل مخرج؟
- الإجابة: حَكم آلي (Evaluator) بمعايير صريحة — Rubric أو Checklist أو Tests بتتنفذ — بيقيّم كل مخرج وبيرجّع Feedback محدد للمولّد (Optimizer أو Generator).
- الفرق الجوهري عن الـ Reflection: الحَكم هنا عنده معايير مكتوبة أو Tests وقرار Pass/Fail برمجي — مش انطباعات. «الحَكم من غير معايير = ناقد مجامل.»
- أقوى Evaluator في الدنيا هو كود بيتنفذ: Test بينجح أو يفشل عمره ما جامل حد.
- قاعدة ذهبية غير قابلة للتفاوض: دايمًا سقف — أقصى محاولات + Budget + مسار خروج. Loop مفتوح = فاتورة مفتوحة.
<!-- Field 4: Why does this matter? -->
بتولّد 500 وصف منتج للمتجر، أو عندك Agent بيكتب Functions صغيرة على مدار اليوم. مين بيتأكد إن الجودة ثابتة؟ لو إجابتك «بناخد عينات ونبص عليها» — فأنت عندك خط إنتاج من غير Quality Control، والمخرج الوحش بيوصل للعميل قبل ما توصله أنت.
النمط ده هو أقرب حاجة لفكرة الـ CI عندك: بوابة جودة أوتوماتيكية قدام كل مخرج، بتعدي الكويس وترجّع الوحش ومعاه سبب الرفض بالتحديد. من غيرها، الـ Batch Generation الجدي مستحيل — ومعاها، بتقدر تقول للعميل «كل مخرج عدى على 4 فحوصات» وأنت صادق.
وحاجة كمان: تعلم النمط ده هيغير طريقة تفكيرك في الجودة نفسها — لأنه بيجبرك تجاوب على السؤال الأصعب: «كويس» يعني إيه بالظبط، مكتوبة في بنود قابلة للفحص؟
<!-- Field 5: Explain it simply (Layer 1) -->
اتنين بدورين منفصلين. الأول بيبني. التاني ماسك ورقة معايير — مش ذوقه الشخصي — وبيحكم على الشغل بند بند: عدى / سقط.
لو بند سقط، الـ Feedback بيرجع للأول محدد: «سقطت في 2 و3، والسبب كذا». الأول يعيد وهو عارف بيصلح إيه. وكده لحد ما الشغل يعدي كل البنود — أو نوصل لسقف المحاولات، فنوقف ونبعت المخرج لمراجعة بشرية بدل ما نلف للأبد.
<!-- Field 6: Real-world analogy (Layer 2) -->
مصحح امتحانات معاه Model Answer ونموذج توزيع درجات: «تعريف صح = درجتين، مثال سليم = درجة». مش بيصحح بمزاجه — بند بند. والطالب اللي واخد 3 من 5 بيعرف بالظبط جاب إيه غلط، فمذاكرته الجاية موجهة.
قارن ده بمصحح من غير نموذج إجابة، بيقرا ويكتب «جيد جدًا» بالإحساس — ده الناقد بتاع الـ Reflection لما مايكونش معاه Rubric.
وفيه احتمال تالت أسوأ: مصحح ماسك نموذج إجابة غلط — بيدي درجات عالية بثقة لإجابات وحشة. ده بالظبط موضوع تحدي «الامتحان الغلط» — لأن أخطر حاجة في النمط ده مش غياب الحَكم... حَكم بيطمنك بالغلط.
<!-- Field 7: Simple example — one fail→retry→pass cycle -->
مثال حقيقي
المهمة: Landing copy لتطبيق إدارة مصاريف للشركات الصغيرة. الـ Evaluator ماسك 4 معايير مسماة:
> - C1: الفايدة الأساسية واضحة في أول جملة > - C2: CTA واحد بالظبط > - C3: مفيش أرقام أو ادعاءات غير موجودة في الـ Brief > - C4: الطول ≤ 80 كلمة
المحاولة 1 — الـ Generator طلّع نص فيه «وفّر 70% من وقت المحاسبة» وقفل بـ «جرب مجانًا» و«اطلب Demo»:
Evaluator report (attempt 1):
C1: PASS — benefit stated in the first sentence
C2: FAIL — two CTAs found: "جرب مجانًا" and "اطلب Demo"
C3: FAIL — the 70% claim does not exist in the brief
C4: PASS — 64 words
verdict: REJECT → feedback sent back to generatorالمحاولة 2 — الـ Generator شال الرقم، وحّد الـ CTA على «جرب مجانًا»:
Evaluator report (attempt 2):
C1: PASS C2: PASS C3: PASS C4: PASS
verdict: ACCEPT → ship itلاحظ حاجتين: الـ Feedback كان محدد بالبند («الرقم مش في الـ Brief») مش درجة عامة — عشان كده المحاولة التانية صلحت المطلوب بالظبط. والمعايير مسماة ومكتوبة قبل التشغيل — مش رأي اتولد لحظة الحكم.
<!-- Field 8: How it works (Layer 3) -->
1. Generate: الـ Optimizer بيطلّع مخرج — ومعاه في الـ Prompt أي Feedback من الجولة اللي فاتت. 2. Evaluate: الـ Evaluator بيفحص المخرج ضد كل معيار، وبيطلّع تقرير منظم: PASS/FAIL لكل بند + السبب. 3. قرار: كله PASS؟ المخرج يعدي. فيه FAIL والمحاولات لسه في الحد؟ الـ Feedback يرجع للخطوة 1. 4. مسار الخروج: خلصت المحاولات ولسه ساقط؟ المخرج يتعلّم للمراجعة البشرية — مش يفضل يلف.
### طيب المعايير نفسها جاية منين؟
دي أهم حتة في النمط كله — ودي سلم القوة بتاعها:
| المصدر | مثال | القوة |
|---|---|---|
| Tests بتتنفذ (كود) | Unit Tests، Schema Validation، «الكود اتنفذ من غير Error؟»، عدّاد كلمات | 🥇 الأقوى — موضوعي 100%، مبيجاملش ومبيتلعبش عليه بسهولة |
| Checklist بقواعد قابلة للفحص | «≤ 80 كلمة»، «فيه Citation لكل Claim»، «مفيش بيانات شخصية» | 🥈 قوي — وجزء كبير منه بيتحول لكود بسيط |
| Golden Examples | مقارنة المخرج بأمثلة نموذجية متراجعة بعناية | 🥈 قوي للمهام المتكررة — وده أول استثمار في أي Evaluation |
| LLM-as-Judge بـ Rubric | حَكم LLM معاه معايير مكتوبة بند بند | 🥉 مفيد للمعايير اللغوية — بس محتاج معايرة (شوف تحت) |
القاعدة: أتمت اللي يتأتمت بكود، وسيب للحَكم الـ LLM المعايير اللي فعلًا محتاجة فهم لغة. معيار الطول مثلًا (C4 فوق) مالوش أي مبرر يتحكم فيه LLM — سطر Python بيحسمه ببلاش.
### كلمة صريحة عن الـ LLM-as-Judge
- Self-preference حقيقي: الموديل بيميل يدي درجات أعلى للكلام اللي شبه أسلوبه — عشان كده موديل الحَكم ≠ موديل الـ Generator ممارسة أصح صحيًا.
- انحيازات موثقة: بيحب الإجابات الأطول، وحساس لترتيب العرض في المقارنات.
- المعايرة واجبة مش رفاهية: قيس حكمه على عينة صححها بشر (حتى 30 مثال بيفرقوا). لو نسبة اتفاقه مع البشر ضعيفة — عندك امتحان غلط، وكل الدرجات اللي بعده كلام فاضي.
<!-- Field 11: Technical explanation (Layer 4) -->
الحلقة كلها، بأي Provider — لاحظ فين القرارات:
MAX_ATTEMPTS = 3 # always cap!
feedback = None
for attempt in range(MAX_ATTEMPTS):
output = generator(task, brief, feedback) # optimizer produces
report = evaluator(output, criteria) # judge: per-criterion
if report.all_passed: # programmatic decision
return output # quality gate passed
feedback = report.failures # specific: which + why
return flag_for_human_review(output, report) # budget exhaustedأربع حاجات خد بالك منهم:
- دورين = نداءين مختلفين بـ Prompts منفصلة تمامًا — وياريت موديلين مختلفين (الـ Self-preference فوق).
- تقرير الحَكم Structured Output — عشان
all_passedقرار كود، مش Parsing لإنشاء. - الـ Feedback بيدخل الـ Generator بالنص: المعيار اللي سقط + السبب. درجة «6/10» من غير تفاصيل بتخلي المحاولة الجاية تخمين جديد مش تصليح.
- `flag_for_human_review` مسار مصمم مش Exception: المخرج اللي فشل 3 مرات هو بالظبط المخرج اللي محتاج عين بشرية — ومعاه تقرير جاهز بيقول ليه.
⚠️ خد بالك — قواعد التوقف تلاتة، مش واحدة: سقف محاولات (2–3 كفاية في الأغلب)، وعتبة نجاح واضحة (أنهي معايير Must-pass)، وسقف تكلفة للمهمة الواحدة. ولو لقيت المخرج بيحوم حوالين العتبة جولة ورا جولة — 78 من 80 المطلوبة، كل مرة — متزودش المحاولات: راجع المعايير نفسها، غالبًا فيه بندين بيشدوا في اتجاهين متعاكسين.
<!-- Field 21: Cost considerations -->
تمرين (30 دقيقة): خد مهمة توليد متكررة من شغلك الفعلي — وصف منتج، رد Support، رسالة Commit. (1) اكتب 4 معايير، منهم واحد على الأقل بيتفحص بكود (طول، Regex، Schema). (2) ابني الحلقة: Generator ← Evaluator بتقرير JSON ← Loop بسقف 3 محاولات. (3) شغّلها على 10 مدخلات وسجّل رقمين: نسبة النجاح من أول محاولة، ومتوسط المحاولات.
الرقم الأول بيقولك جودة الـ Prompt الأساسي عندك — لو 9 من 10 بيعدوا من أول مرة، ممكن أصلًا متكونش محتاج الـ Loop. ولو 3 من 10... الـ Evaluator لسه بيوفر عليك، بس الـ Generator محتاج شغل.
<!-- Field 28: Knowledge check (scenario-based per F5) -->
| # | ❌ الغلط | ✅ الصح |
|---|---|---|
| 1 | حَكم من غير معايير: «قيّم النص من 10» — درجات متفائلة عشوائية ملهاش معنى | Rubric ببنود مسماة + PASS/FAIL لكل بند + سبب. الدرجة المجمعة تتحسب من البنود، مش العكس |
| 2 | مفيش سقف: المخرج بيحوم حوالين العتبة والـ Loop شغال والعداد بيعد | سقف محاولات + Budget + مسار مراجعة بشرية — التلاتة، في الكود، من أول يوم |
| 3 | Gaming the metric: الـ Generator بيتعلم يرضّي الحَكم مش الجودة — يحشي كلمات الـ Rubric حرفيًا، يطوّل عشان الحَكم بيحب الطويل | عاير الحَكم دوريًا بعينات بشرية، وحط معيار مضاد للحشو، وراقب الطول كإشارة إنذار |
| 4 | Criteria drift: المعايير بتتعدل على مزاج كل أسبوع — فمخرجات الشهر ده مش قابلة للمقارنة باللي فاته | عامل الـ Rubric كأصل برمجي: Versioning و Review لأي تغيير — زي الـ Prompts بالظبط |
| 5 | نفس الموديل بيولّد وبيحكم بنفس أسلوب الـ Prompt | موديل مختلف للحَكم — أو على الأقل Prompt مستقل تمامًا + معايرة بشرية دورية |
<!-- Field 19: Trade-offs — the crucial contrast with Reflection -->
💸 التكلفة
> 💸 أرقام قابلة للتغير *(Volatile fragment — أسعار نموذجية للتوضيح؛ راجع أسعار مزوّدك الحالية)*: $3/مليون Input Token و $15/مليون Output Token.
سيناريو: توليد وصف منتج بالمعايير الأربعة:
| البند | الحساب | التكلفة |
|---|---|---|
| نداء الـ Generator | Input (المهمة + Brief + Feedback) 700 → $0.0021؛ Output 250 → $0.0038 | ~$0.006 |
| نداء الـ Evaluator | Input (الـ Rubric + المخرج) 1,100 → $0.0033؛ Output (تقرير JSON) 200 → $0.003 | ~$0.006 |
| الدورة الواحدة | ~$0.012 | |
| بمتوسط 1.6 محاولة (يعني ~60% بيعدوا من أول مرة) | 1.6 × $0.012 | ~$0.019 لكل وصف |
على 1,000 منتج: ~$19 — مقابل مراجعة بشرية بـ 5 دقايق للوصف = ~83 ساعة عمل. وده قبل ما نحسب الثبات: الحَكم الآلي مش بيتعب آخر اليوم ولا بيعدّي حاجة عشان مستعجل.
ورقم واحد يستاهل تراقبه على الـ Dashboard: متوسط المحاولات لكل مخرج. لو بدأ يزحف من 1.6 لـ 2.8، فيه حاجة اتغيرت — الـ Brief، الموديل، أو المعايير — والفاتورة بتقولك قبل الجودة ما تقول.
<!-- Field 14: Common mistakes -->
- Batch Generation بجودة موحدة: أوصاف منتجات، ردود Support، ملخصات — أي حاجة بتتعمل بالمئات.
- حد أدنى جودة قابل للتعريف: تقدر تكتب «لازم يعدي C1 لـ C4» في بنود واضحة.
- مخرجات قابلة للفحص بكود: كود بيتاخد عليه Tests، بيانات بتتاخد عليها Schema Validation — النمط في أقوى حالاته هنا.
- Pipeline شغال من غير بشر في الـ Loop بس محتاج Quality bar حقيقي قبل ما المخرج يمشي.
<!-- Field 17: When NOT to use it (Layer 7b) -->
- مهمة One-off: هتكتب الحاجة مرة واحدة؟ راجعها بعينك — بناء Evaluator لمخرج واحد هو Over-engineering من كتاب المدرسة.
- الجودة ذوقية بحتة: «النكتة أحلى؟» «الـ Copy أشيك؟» — لو أنت شخصيًا مش قادر تكتب المعيار، الحَكم مش هيخترعه لك. هيديك درجات شكلها علمي لحكم مزاجي.
- المعيار الحقيقي هو رأي العميل: مفيش Evaluator بديل عن العميل — خد Feedback حقيقي بدل ما تحاكيه.
- قرارات حساسة (قانوني، طبي، مالي): النمط يرشّح ويصفّي — لكن القرار الأخير لازم يفضل بشري. الـ Evaluator هنا فلتر أولي، مش جهة اعتماد.
💡 نصيحة: اختبار سريع قبل ما تبني: اكتب المعايير الأربعة على ورقة. لو كتبتهم في 5 دقايق وكلهم قابلين للفحص — النمط مناسب. لو قعدت نص ساعة وطالع كلام زي «يكون النص جذابًا» — مشكلتك مش في النمط، مشكلتك إنك لسه معرفش «كويس» يعني إيه. وده اكتشاف مهم في حد ذاته.
<!-- Field 23: Related concepts -->
الفرق عن الـ Reflection — بجدول
| الـ Reflection | الـ Evaluator–Optimizer | |
|---|---|---|
| الحَكم | ناقد بيدوّر على مشاكل — والنتيجة في الآخر رأي | معايير معلنة قابلة للفحص، وقرار Pass/Fail بياخده الكود |
| الهدف | تحسين مسودة لمخرج واحد مهم | بوابة جودة: يعدي أو ميعديش — على نطاق واسع |
| التوقف | عدد جولات متفق عليه | Pass أو نفاد الميزانية |
| أحسن استخدام | جودة أعلى لمخرج بعينه | حد أدنى جودة مضمون لآلاف المخرجات |
والحقيقة الكاملة: الخط بينهم مش سور — ده منحدر. لما تدي ناقد الـ Reflection معايير رسمية، وتخلي القرار برمجي، وتحط سقف ومسار خروج... أنت عمليًا بنيت Evaluator–Optimizer. كل ما المعايير بقت أصرح والقرار أوتوماتيكي أكتر، كل ما اتحركت من «مراجعة» لـ «بوابة جودة».
<!-- Field 16: When to use it (Layer 7a) -->
- جوه BuildAI: دومين AI Evaluation لما ينزل (Golden Sets · LLM-as-Judge بعمق · Regression) — النمط ده هو نسخته الـ Online.
- من الصناعة: دليل Anthropic *"Building Effective Agents"* (2024) — النمط مذكور فيه بالاسم كـ Workflow قياسي، والدليل كله قراءة ممتازة بعد الـ Pack ده.
- للفضوليين: أبحاث تقييم الـ LLM-as-Judge (زي ورقة MT-Bench — Zheng et al., 2023) بتوثّق الانحيازات اللي ذكرناها بالأرقام: تفضيل الطول، وحساسية الترتيب، والـ Self-preference.
<!-- Reading→building exit — single primary CTA per Phase 1 §6 -->