الـ Agents· الدرس 2 من 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 دقيقة
حلقة الـ Agent
في سطر واحد · قلب أي Agent حلقة واحدة: خطّط → نفّذ → لاحظ → كرّر — ومن غير حدود واضحة، الحلقة دي بتحرق فلوسك.
الـ Agent بيشتغل في دورة: الموديل يخطّط خطوة، الكود ينفّذها بأداة، النتيجة ترجع للموديل يلاحظها، ويقرّر يكمّل ولا يقف. الجزء اللي الناس بتستهين بيه هو «يقف إمتى؟» — شروط التوقّف وسقف اللفّات وميزانية التكلفة هم الفرق بين Agent إنتاجي وفاتورة مفاجئة.
كل لفّة في الحلقة = استدعاء موديل جديد بكل السياق المتراكم — يعني التكلفة بتكبر مع كل لفّة مش بتثبت. أشهر حادثة في حياة أي مبني agents هي «الـ Agent اللي فضل يلفّ بالليل». فهم الحلقة وحدودها هو أول مهارة إنتاجية حقيقية في الـ agents.
الحلقة أربع خطوات بتتكرّر: (1) خطّط — الموديل يقرّر الخطوة الجاية، (2) نفّذ — كودك يشغّل الأداة المطلوبة، (3) لاحظ — نتيجة الأداة ترجع للموديل، (4) كرّر — يا إمّا يكمّل يا إمّا يقول «خلصت». إنت اللي بتكتب الحلقة دي، والموديل بيملاها قرارات.
زي سوّاق تاكسي بالعدّاد في مدينة متعرفهاش: كل مرة بيبصّ على الخريطة (يخطّط)، يلفّ في شارع (ينفّذ)، يشوف وصل فين (يلاحظ)، ويقرّر يكمّل ولا وصل. لو مقلتلوش «لو معدّى ساعة أو 200 جنيه وقّف» — ممكن يفضل لافف والعدّاد شغّال.
Agent بحث سألته عن أفضل مكتبة charts. اللفّة 1: يبحث ويلاقي 5 مكتبات. اللفّة 2: يفتح توثيق أول اتنين. اللفّة 3: يقارن ويكتشف إن واحدة archived، يشيلها. اللفّة 4: يقرّر إن المعلومات كفاية ويجاوب. أربع لفّات، وكل واحدة قرار بنى على اللي قبله.
الكود عبارة عن while loop: ابعت الرسائل للموديل → لو رجّع نص نهائي، اخرج → لو رجّع طلب أداة، نفّذها وضيف النتيجة للرسائل → ارجع أول الحلقة. كل نتيجة أداة بتتضاف للسياق، فالسياق بيتضخّم لفّة ورا لفّة — وده سبب إن اللفّات المتأخّرة أغلى من الأولانية.
الحدود الإنتاجية أربعة، وكلها في كودك مش في الموديل: (1) max iterations — سقف صارم للّفات (ابدأ بـ 10–15)، (2) ميزانية tokens/فلوس بتتحسب أثناء التشغيل وتقطع لمّا تخلص، (3) timeout زمني كلي، (4) مخرج «استسلام» صريح — لو الموديل مش بيتقدّم، يوقف ويقول وصل لفين بدل ما يفضل يحاول. وسجّل trace لكل لفّة عشان تعرف بعدين الفلوس راحت فين.
🧪 جرّب بنفسك: اكتب حلقة agent بسيطة بأداة واحدة (مثلًا calculator أو بحث)، وحطّ فيها من أول سطر: max 5 لفّات + عدّاد tokens بيتطبع كل لفّة. بعدين اعمل حاجة شريرة: خلّي الأداة ترجّع error دايمًا، وشوف الموديل هيعمل إيه — هتشوف بعينك ليه السقف مش رفاهية.
الغلطة القاتلة: while(true) من غير سقف، بالثقة إن «الموديل هيعرف يقف لوحده». مش هيعرف دايمًا — أداة بترجّع error غامض، والموديل يعيد نفس المحاولة بنفس الطريقة عشرين مرة. الغلطة التانية: سقف لفّات من غير ميزانية تكلفة — 10 لفّات بسياق ضخم ممكن تكلّف أكتر من 50 لفّة صغيّرة.
الحلقة الكاملة بحدودها مطلوبة في أي agent حقيقي هيشتغل من غير مراقبة لحظية: مهام بحث، إصلاح كود، معالجة تلقائية. الحدود مش «تحسين متأخّر» — دي أول سطور بتتكتب.
لو مهمّتك بتخلص في استدعاء أداة واحد أو اتنين معروفين، متبنيش حلقة مفتوحة — sequence ثابت أبسط وأرخص. والحلقة اللامحدودة (من غير caps) متتكتبش أبدًا، ولا حتى «مؤقتًا للتجربة».