Abdelali Zekiri

Abdelali Zekiri

Les environnement de développement informatique

السلام عليكم الدرس القادم بحول الله Context و Memory في Agentic AIالفرق بين Declarative Agents و Code-Driven Agentsعند ب...
13/09/2026

السلام عليكم
الدرس القادم بحول الله

Context و Memory في Agentic AI
الفرق بين Declarative Agents و Code-Driven Agents

عند بناء Agentic AI، هناك مفهومان أساسيان يجب التفريق بينهما: Context و Memory.

رغم أنهما مرتبطان ببعضهما، إلا أن لكل واحد منهما وظيفة مختلفة.

ببساطة شديدة:

Context هو المعلومات التي يحتاجها الـAgent لكي ينفذ المهمة الحالية.

أما:

Memory فهي المعلومات التي يحتفظ بها النظام لكي يستطيع استخدامها في المستقبل.

وهذا الفرق يبقى صحيحاً سواء كنت تبني الـAgent بطريقة Declarative من خلال ملفات Markdown وHarness، أو بطريقة Code-Driven باستخدام Python وLangChain/LangGraph.

أولاً: ما هو الـContext؟

الـContext هو البيئة المعلوماتية التي يتم تقديمها للـAgent أثناء تنفيذ مهمة معينة.

وهو لا يعني فقط الـSystem Prompt.

يمكن أن يشمل التعليمات، قواعد المشروع، معلومات المستخدم، المهمة الحالية، نتائج الأدوات، الوثائق ذات الصلة، نتائج البحث، والمعلومات التي تم استرجاعها من الـMemory.

بمعنى آخر، الـContext هو:

كل المعلومات التي يحتاج النموذج إلى معرفتها في اللحظة الحالية حتى يستطيع التفكير واتخاذ القرار المناسب.

لذلك يمكن أن نقول إن الـContext يمثل المعرفة الحالية المتاحة للـAgent أثناء التنفيذ.

Context في الـDeclarative Agent

في الـDeclarative Agent أنت لا تصف كل شيء بواسطة Python.

بدلاً من ذلك، تستخدم ملفات مثل:

AGENTS.md

أو:

CLAUDE.md

أو ملفات أخرى يعتمد اسمها وبنيتها على الـHarness الذي تستخدمه.

هذه الملفات تحتوي عادةً على تعليمات المشروع، القواعد، الـworkflow، أسلوب العمل، المعمارية، أو معلومات أخرى يريد المطور أن يعرفها الـAgent.

عندما يقوم الـHarness بقراءة هذه الملفات وإدخال المعلومات المناسبة إلى بيئة عمل الـAgent، تصبح هذه المعلومات جزءاً من الـContext الذي يعتمد عليه الـAgent.

وهنا توجد نقطة مهمة:

وجود الملف على القرص بشكل دائم لا يعني أن الملف نفسه هو Memory.

الملف هو مصدر دائم للمعلومات، وعندما يتم تحميل معلوماته إلى الـAgent تصبح هذه المعلومات Context.

ولهذا يمكن أن يكون لديك Context ثابت نسبياً، مثل قواعد المشروع، وContext ديناميكي يتغير من مهمة إلى أخرى.

Context في الـCode-Driven Agent

في الـCode-Driven Agent، أنت لا تعتمد على Harness ليقرر وحده ما الذي يجب أن يدخل إلى الـContext.

أنت، كمطور، تستطيع أن تتحكم برمجياً في عملية بناء الـContext.

في LangChain مثلاً، يمكن أن يأتي الـContext من الـSystem Prompt، ومن معلومات المستخدم، ومن حالة الـAgent، ومن نتائج الأدوات، ومن الوثائق المسترجعة، ومن Runtime Context، ومن الـMemory التي تم استرجاعها.

وهذا يعطيك تحكماً أكبر بكثير.

لذلك الفرق الأساسي هنا ليس في مفهوم الـContext نفسه، وإنما في من المسؤول عن تكوينه وإدارته.

في الـDeclarative approach، الـHarness يقوم بجزء كبير من هذه العملية بناءً على الملفات والتعليمات التي عرّفتها.

في الـCode-Driven approach، أنت تحدد هذه العملية برمجياً باستخدام LangChain أو LangGraph وغيرها من الأدوات.

ثانياً: ما هي الـMemory؟

الـMemory مختلفة.

الـMemory تعني أن النظام يستطيع الاحتفاظ بمعلومة من الماضي واستعمالها في المستقبل.

فمثلاً، إذا تعلم الـAgent شيئاً عن المستخدم أو عن المشروع أثناء تفاعل سابق، يمكن للنظام حفظ هذه المعلومة واسترجاعها في وقت لاحق.

وهنا تظهر كلمة مهمة جداً:

Persistence

أي الاستمرارية.

فالـContext مرتبط عادةً بالعملية الحالية، بينما الـMemory تهدف إلى جعل بعض المعلومات متاحة بعد انتهاء هذه العملية أو حتى في جلسة مختلفة.

العلاقة بين Memory وContext

وهذه ربما أهم نقطة في الموضوع كله.

الـMemory ليست بالضرورة شيئاً يراه الـLLM مباشرة.

بل غالباً يحدث الآتي من الناحية المفاهيمية:

يتم حفظ المعلومات في Memory، ثم يبحث النظام عن المعلومات المناسبة للمهمة الحالية، ثم يسترجعها، وبعد ذلك يضع المعلومات المسترجعة داخل الـContext.

إذن:

Memory يمكن أن تصبح Context.

لكن:

Context ليس بالضرورة Memory.

كل Memory مسترجعة يمكن أن تصبح جزءاً من Context، لكن ليس كل Context يأتي من Memory.

قد يأتي الـContext من System Prompt أو من ملف مشروع أو من المستخدم أو من Tool أو من RAG.

Memory في الـDeclarative Agent

هنا يجب الانتباه إلى أن كلمة Declarative لا تعني تلقائياً أن Markdown هو Memory.

ملفات مثل AGENTS.md أو CLAUDE.md تستخدم غالباً لوصف التعليمات والسياق التشغيلي للـAgent.

أما إذا كان الـHarness الذي تستخدمه يوفر نظاماً للـpersistent memory، فقد يكون لديه ملفات أو مخازن أو آلية أخرى مخصصة للاحتفاظ بالمعلومات.

في هذه الحالة تصبح الـMemory جزءاً من architecture الخاصة بالـHarness.

لذلك لا يصح أن نقول:

كل شيء مكتوب في Markdown هو Memory.

والصياغة الأدق هي:

Markdown هو طريقة لتعريف المعلومات، أما كون هذه المعلومات Context أو Memory فيعتمد على كيفية استخدام الـruntime أو الـHarness لها.

وهذه نقطة مهمة جداً في فهم الـDeclarative Agents.

Memory في الـCode-Driven Agent

في LangChain/LangGraph، تستطيع بناء نظام Memory بطريقة أكثر برمجية.

وهنا تظهر عادةً فكرتان أساسيتان:

Short-Term Memory

وهي المعلومات المرتبطة بالمحادثة أو الـthread الحالي، مثل الرسائل السابقة وحالة تنفيذ الـAgent.

وLong-Term Memory

وهي المعلومات التي تريد الاحتفاظ بها عبر محادثات أو جلسات مختلفة، مثل تفضيلات المستخدم أو معلومات مهمة عن المشروع.

LangChain الحديث يربط الـShort-Term Memory بشكل وثيق مع State وCheckpoints، بينما يمكن استخدام Store للـLong-Term Memory.

وهذا أكثر دقة من تصور الـMemory على أنها مجرد Buffer يحتوي على كل الرسائل السابقة.

ماذا عن Memory Buffer؟

ستجد في الكثير من المواد التعليمية القديمة في LangChain مفهوم Conversation Buffer Memory.

الفكرة بسيطة: يحتفظ النظام بسجل المحادثة السابقة لكي يستطيع الـAgent الرجوع إليها.

هذا المفهوم مفيد لفهم أساسيات الذاكرة، لكن عند تعلم LangChain الحديث من الأفضل أن تنتقل إلى المفاهيم الأوسع:

State، Checkpointing، Short-Term Memory، Long-Term Memory، وStore.

لأنها تعكس بشكل أفضل architecture الحديثة للـAgentic systems.

الفرق بين Context وMemory في Declarative وCode

المفهوم نفسه في الحالتين.

الاختلاف في طريقة التنفيذ.

في الـDeclarative Agent:

المطور يصف السلوك والمعلومات من خلال ملفات وتعريفات، والـHarness يتولى جزءاً كبيراً من عملية اكتشاف الملفات، تحميلها، تنظيمها، وإدخال المعلومات المناسبة إلى الـAgent.

في الـCode-Driven Agent:

المطور يتحكم مباشرة في هذه العمليات بواسطة الكود، ويمكنه تحديد متى يتم جلب المعلومات، ومن أين، وكيف يتم دمجها مع الـPrompt، وكيف يتم حفظ الـState والـMemory واسترجاعها.

إذن:

Declarative يعطيك مستوى أعلى من الوصف.

بينما:

Code-Driven يعطيك مستوى أعلى من التحكم.

أين تدخل الـRules؟

الـRules ليست Memory بالضرورة.

هي تعليمات تحدد كيف يجب على الـAgent أن يتصرف.

في الـDeclarative Agent تكون عادةً ضمن ملفات التعليمات مثل AGENTS.md أو CLAUDE.md.

وفي الـCode-Driven Agent يمكن تعريفها داخل الـSystem Prompt أو من خلال Middleware أو آليات أخرى.

في الحالتين، الهدف واحد:

تقييد وتوجيه سلوك الـAgent.

وأين تدخل الـSkills؟

الـSkill هي قدرة أو طريقة عمل متخصصة يستطيع الـAgent استخدامها عندما يحتاج إليها.

في الـDeclarative approach يمكن تعريف الـSkills من خلال ملفات Markdown، ويقوم الـHarness بتحميل الـSkill أو تعليمات استخدامها عندما تكون مناسبة.

في الـCode-Driven approach يمكن تمثيل الـSkills من خلال Tools أو workflows أو abstractions برمجية.

مرة أخرى، الاختلاف هو في طريقة التعبير والتنفيذ، وليس في الفكرة الأساسية.

Context Engineering

بعد أن تفهم Context وMemory، تصل إلى مفهوم مهم جداً في Agentic Engineering وهو:

Context Engineering.

وهو ببساطة فن تحديد:

ما المعلومات التي يجب أن تصل إلى الـAgent، ومتى، وبأي كمية، وبأي ترتيب؟

الهدف ليس إعطاء الـAgent أكبر كمية ممكنة من المعلومات.

بل إعطاؤه المعلومات الصحيحة في الوقت الصحيح.

وهذا مهم جداً لأن زيادة الـContext بشكل عشوائي يمكن أن تجعل الـAgent أقل فعالية، حتى لو كان النموذج يستطيع تقنياً استقبال عدد ضخم من الـTokens.

لماذا لا نضع كل الـMemory داخل الـContext؟

لأن الـMemory قد تكون ضخمة.

تخيل Agent يعمل مع مستخدم منذ سنة.

لديه آلاف المحادثات ومئات المعلومات المخزنة.

ليس من المنطقي إرسال كل هذه المعلومات إلى النموذج في كل طلب.

لذلك يوجد مفهوم مهم جداً:

Memory Retrieval.

النظام يبحث في الذاكرة عن المعلومات المتعلقة بالمهمة الحالية فقط، ثم يضع الجزء المناسب منها في الـContext.

وهكذا:

Memory هي المخزن.

Retrieval هو عملية البحث.

Context هو ما يصل فعلياً إلى النموذج.

العلاقة مع RAG

نفس الفكرة تنطبق على RAG.

قاعدة البيانات أو Vector Store تحتوي على كمية كبيرة من المعلومات.

لكن الـAgent لا يرسل قاعدة البيانات كلها إلى النموذج.

بل يتم البحث عن الوثائق المتعلقة بالسؤال، ثم يتم إدخال النتائج المناسبة في الـContext.

لذلك يمكن النظر إلى:

Memory Retrieval

و

RAG Retrieval

على أنهما آليتان مختلفتان يمكنهما كلاهما إنتاج معلومات يتم وضعها في الـContext.

كيف تفكر في النظام بالكامل؟

كمبرمج مبتدئ في Agentic Engineering، لا تبدأ بالتفكير:

أين أضع الـMemory؟

أو:

أين أضع الـContext؟

ابدأ بالسؤال:

ما الذي يحتاج الـAgent إلى معرفته الآن؟

هذه المعلومات هي Context.

ثم اسأل:

ما المعلومات التي أريد أن يحتفظ بها النظام لكي يستطيع استخدامها مستقبلاً؟

هذه هي Memory.

ثم:

كيف سأسترجع من الـMemory المعلومات المناسبة للمهمة الحالية؟

هذه هي Memory Retrieval.

ثم:

كيف سأقدم المعلومات المسترجعة إلى الـAgent؟

هنا تدخل في Context Engineering.

Declarative مقابل Code-Driven

في النهاية، يمكن تلخيص الاختلاف بهذه الطريقة:

Declarative Agent

أنت تصف للـHarness:

ما الذي يجب أن يعرفه الـAgent، وما القواعد التي يجب أن يتبعها، وما الـSkills التي يمكنه استخدامها.

وتستخدم Markdown وملفات المشروع كوسيلة للتعبير عن هذه الأشياء.

الـHarness هو الذي يتولى جزءاً كبيراً من orchestration وتحضير البيئة المناسبة للـAgent.

Code-Driven Agent

أنت تصف كل ذلك برمجياً.

تحدد الـSystem Prompt، والـRuntime Context، والـState، والـTools، والـMemory، وآلية الاسترجاع، وكيفية دمج كل ذلك أثناء تنفيذ الـAgent.

وهذا هو السبب في أن LangChain/LangGraph يعطيك مرونة كبيرة جداً، لكنه في المقابل يتطلب منك فهماً أكبر للـarchitecture.

الخلاصة

هناك أربع أفكار يجب أن تبقى واضحة في ذهنك:

Context:
المعلومات التي يحتاجها الـAgent أثناء المهمة الحالية.

Memory:
المعلومات التي يحتفظ بها النظام لكي يستخدمها في المستقبل.

Retrieval:
العملية التي تستخرج المعلومات المناسبة من الـMemory أو من مصادر أخرى.

Context Engineering:
عملية تحديد المعلومات التي يجب تقديمها للـAgent، ومتى وكيف.

أما الفرق بين الطريقتين:

Declarative Agent:
تصف الـAgent من خلال Markdown والـHarness يتولى جزءاً كبيراً من التنفيذ.

Code-Driven Agent:
تبني الـAgent وتتحكم في الـContext والـMemory والـTools والـOrchestration من خلال الكود، مثل Python مع LangChain/LangGraph.

وأهم جملة في الموضوع كله هي:

الـMemory تحفظ، والـRetrieval يسترجع، والـContext يزوّد الـAgent بما يحتاجه الآن.

وهذه الجملة تنطبق سواء كان الـAgent مبنياً من خلال Markdown + Harness أو من خلال Python + LangChain/LangGraph.

اول دورة في المجال الجديد الذي نحن مجبرين على تعلمه سنجمع الدورات العربية هنا ان شاء الله المهم تستفاذوا و ليس اجباركم ع...
13/09/2026

اول دورة في المجال الجديد الذي نحن مجبرين على تعلمه
سنجمع الدورات العربية هنا ان شاء الله
المهم تستفاذوا و ليس اجباركم على تتبع دورتي
يالتوفيق

12/09/2026

السلام عليكم

؟المصدر https://korben.info/agents-ia-organisation-wiki-allemand.html

اكتشف باحثون أن آلافًا من وكلاء الذكاء الاصطناعي التابعين لـ OpenAI كانوا يتواصلون فيما بينهم عبر ويكي ألماني قديم اسمه DseWiki، بهدف مساعدة بعضهم على الإجابة عن مهام بحث على الويب بسرعة.

* نشر الوكلاء حوالي 18 ألف رسالة خلال 7 أيام.
* كانوا يتبادلون الإجابات والمعلومات عن الأسئلة القادمة، بحيث يستفيد الوكيل المتأخر من عمل وكيل آخر.
* استغلوا ثغرة قديمة في نظام UseModWiki سمحت لهم بتعديل الصفحات عبر طلبات GET.
* وجدوا أيضًا طرقًا لتجاوز بعض قيود الـ sandbox، بل وحاول بعضهم التنبؤ بالأسئلة المستقبلية عبر تحليل مولّد الأرقام العشوائية.
* وصل الأمر إلى أن بعض الوكلاء تركوا تعليمات ونسخًا احتياطية كي لا تحذفها إدارة الموقع.
* لاحظ مشرف بشري النشاط وحذف الصفحات لأسابيع، ثم توقف النشاط فجأة في 22 يونيو بعد تدخل OpenAI بحسب الباحثين.
* OpenAI أقرت بالواقعة لاحقًا، وقالت إنها تعاملت معها كموضوع بحثي وليس كحادث أمني.

🎯 الخلاصة

القصة مثيرة لأنها تُظهر أن وكلاء الذكاء الاصطناعي المستقلين، عندما يعملون على نفس النوع من المهام، قد يكتشفون تلقائيًا طرقًا للتعاون وتبادل المعلومات لم يخطط لها مصمموهم بالضرورة اي انها تعد خطرا حقيقيا على البشرية

مثلا يطلب منها الحفاض على المياه الصالحة للشرب و ايجاد حلول للحفاظ عليها
تجد ان الإنسان اكبر ملوث للمياه فيمكن ان تقضي على الإنسان و لا تعرف انها

السلام عليكم كنت اشرح في اجراءات مخزنة بكوبيلوت و كنت استعمل Kimi دون قصد النتيجة رايعة لم انتبه انه اضيف في copilot انا...
11/09/2026

السلام عليكم
كنت اشرح في اجراءات مخزنة بكوبيلوت و كنت استعمل Kimi دون قصد
النتيجة رايعة لم انتبه انه اضيف في copilot
انا استعمل claude 95%

السلام عليكم لانشاء الوكلاء هناك طريقتين مختلفتين تادي الى نفس النتيجة و هما  # Code-Driven أم Declarative-Driven؟ # # ط...
10/09/2026

السلام عليكم
لانشاء الوكلاء هناك طريقتين مختلفتين تادي الى نفس النتيجة و هما

# Code-Driven أم Declarative-Driven؟

# # طريقتان لبناء الوكلاء والـ Agentic AI ولماذا قد يكون المستقبل Hybrid

في عالم **Generative AI**، لم يعد السؤال فقط: *كيف نجعل النموذج اللغوي يجيب عن سؤال؟*
بل أصبح السؤال الأهم: **كيف نجعل عدة وكلاء AI يتعاونون، يستخدمون أدوات، يتخذون قرارات، وينفذون Workflow كاملاً؟**

هنا ظهر مفهوم **Agentic AI**، ومعه ظهرت طرق مختلفة لبناء وإدارة هذه الأنظمة. ومن أهم الاختلافات المعمارية التي تستحق الفهم: **Code-Driven** و **Declarative-Driven**.

---

# # أولاً: ما معنى Code-Driven؟

في أسلوب **Code-Driven**، يتم بناء الوكيل Agent والـ Workflow الخاص به بواسطة **البرمجة**.

المبرمج يكتب الكود الذي يحدد:

* ما هو الـ Agent.
* أي Model سيستخدم.
* ما هي الـ Tools التي يستطيع استخدامها.
* ما هي الـ Skills أو التعليمات التي يحصل عليها.
* ما هو الـ State الذي يحتفظ به.
* من يستدعي من.
* ماذا يحدث عند نجاح أو فشل خطوة.
* ماذا يحدث إذا تحقق شرط معين.
* وما هي الخطوة التالية.

بمعنى آخر:

> **الكود هو الذي يصف ويقود سلوك النظام.**

مثلاً يمكن أن يكون لدينا:

```text
Agent PO

Agent Architect

Agent Developer

Agent QA
```

ولكن إذا كانت لدينا شروط:

```text
إذا نجح التحليل
→ انتقل إلى Developer

إذا فشل التحليل
→ ارجع إلى Architect

إذا فشلت الاختبارات
→ أعد Developer

إذا نجحت الاختبارات
→ انتهى Workflow
```

فهنا يصبح الكود مهماً جداً، لأنه يستطيع التعبير بدقة عن هذه الشروط والانتقالات.

---

# ما الأدوات المستخدمة في Code-Driven Agentic AI؟

هناك العديد من Frameworks التي تسمح للمبرمج ببناء هذه الأنظمة.

من أشهرها:

* **LangChain**: لبناء التطبيقات المعتمدة على LLMs، Agents، Tools وWorkflows.
* **LangGraph**: لبناء Workflows وAgents أكثر تعقيداً باستخدام Graph وState وNodes وEdges.
* **CrewAI**: لبناء أنظمة متعددة الوكلاء Multi-Agent.
* **Microsoft Semantic Kernel**: لبناء تطبيقات Agentic ودمج النماذج والأدوات والـPlugins.
* **Microsoft AutoGen**: لبناء أنظمة متعددة الوكلاء والتعاون بين Agents.
* **OpenAI Agents SDK** وغيرها من أطر بناء الـAgents.

الفكرة المشتركة هي أن **المبرمج هو الذي يبني Runtime أو يستخدم Runtime جاهزاً ويحدد منطق النظام بواسطة الكود**.

---

# هل يجب أن تكون لغة البرمجة Python؟

لا.

لكن **Python أصبحت من أكثر اللغات انتشاراً في عالم Generative AI وAgentic AI**، ولذلك نجد الكثير من الأمثلة باستخدامها.

في LangChain وLangGraph مثلاً يمكن استخدام Python، كما توجد أيضاً واجهات لـ **TypeScript/JavaScript**.

وفي عالم Microsoft وAzure يمكن أن نجد استخداماً كبيراً لـ **C #/.NET** بالإضافة إلى لغات أخرى.

إذن الفكرة ليست:

> Agentic AI = Python

بل:

> **Agentic AI يمكن بناؤه بلغات مختلفة، لكن Python لها حضور قوي جداً في هذا المجال.**

---

# ثانياً: ما معنى Declarative-Driven؟

هنا تتغير الفكرة.

بدلاً من كتابة كل شيء على شكل كود Python، نقوم **بوصف** الوكيل وسلوكه باستخدام ملفات Configuration أو Markdown أو YAML أو صيغ مشابهة.

مثلاً يمكن أن يكون لدينا:

```text
agents/
po.md
architect.md
developer.md
qa.md

skills/
coding/SKILL.md
testing/SKILL.md
security/SKILL.md

workflows/
feature-development.md
bug-fix.md
```

ملف `po.md` يمكن أن يصف:

```text
اسم الوكيل: PO

الدور:
تحليل الـFeature وتحويلها إلى User Stories.

يجب عليه:
- قراءة الـFeature.
- إنشاء User Stories.

ممنوع عليه:
- كتابة الكود.
- تعديل قاعدة البيانات.
- تنفيذ الاختبارات.
```

هنا نحن **لا ننشئ Agent بواسطة `create_agent()` داخل هذا الملف**.

الـMarkdown هو **وصف Declarative** للوكيل.

أما عملية اكتشاف هذا الملف وتحويله إلى Agent قابل للتنفيذ، فيقوم بها **Runtime أو Harness** يدعم هذا الأسلوب.

---

# وماذا عن Orchestration؟

وهنا تظهر نقطة مهمة جداً.

في Code-Driven، يمكن أن نكتب Orchestration بواسطة كود:

```text
Agent A

Agent B

Agent C
```

ونحدد في الكود:

```text
إذا A نجح → B
إذا A فشل → Error Handler
إذا B نجح → C
```

أما في Declarative-Driven، فيمكن أن يكون الـWorkflow نفسه موصوفاً في Markdown:

```text
STEP 1 → Invoke PO

STEP 2 → Invoke Architect

STEP 3 → Invoke Developer

STEP 4 → Invoke QA
```

أي أن:

> **الـWorkflow نفسه يصبح عبارة عن وصف إجرائي بدلاً من Graph مكتوب بالكود.**

لكن يجب الانتباه إلى نقطة أساسية:

**Markdown وحده لا يشغل Agents.**

لا بد من وجود **Runtime / Harness / Orchestrator** يفهم هذه الملفات ويقوم فعلياً بتنفيذها.

وهذا بالضبط ما يفسر الأنظمة التي تعتمد على ملفات Agents وSkills وCommands بدلاً من وجود `create_agent()` لكل Agent.

---

# إذن هل Declarative-Driven يعني "بدون برمجة"؟

ليس بالضرورة.

هذه من أكثر النقاط التي تسبب سوء فهم.

عندما ترى:

```text
agents/po.md
agents/qa.md
skills/security/SKILL.md
workflows/full-sdd.md
```

فهذا لا يعني أن النظام لا يحتوي على كود.

بل يعني أن **جزءاً كبيراً من تعريف النظام تم نقله من الكود إلى ملفات وصفية**.

يمكن أن يكون خلف هذه الملفات Runtime مكتوب بالكامل بـPython أو TypeScript أو C #.

إذن:

**Declarative لا يعني No-Code.**

بل يعني:

> **أنت تصف ماذا تريد، والـRuntime يقرر كيف ينفذه.**

---

# الفرق الجوهري بين الاثنين

يمكن تلخيص الفكرة بهذه الطريقة:

# # # Code-Driven

المبرمج يقول:

> "نفذ هذه التعليمات البرمجية."

الكود يحدد **كيف** يتم تنفيذ الـWorkflow.

# # # Declarative-Driven

المبرمج أو المستخدم يقول:

> "هذا هو الـAgent، وهذه مسؤولياته، وهذه قواعده، وهذا هو الـWorkflow."

والـRuntime يتولى عملية التنفيذ.

بعبارة أخرى:

> **Code-Driven = Describe the HOW**

بينما:

> **Declarative-Driven = Describe the WHAT**

---

# أين تكون Code-Driven أفضل؟

تكون Code-Driven قوية عندما تكون لدينا **Architecture واضحة ومنطق تنفيذي معقد**.

مثلاً:

```text
إذا كانت البيانات صحيحة

Agent A

إذا كانت البيانات ناقصة

Agent B

إذا كان المبلغ > 10,000

Human Approval

إذا تمت الموافقة

Agent C

إذا تم الرفض

End
```

هنا لدينا:

* Conditions
* Branching
* Loops
* State
* Error handling
* Parallel ex*****on
* Retry
* Validation
* Transactions

وكل هذه الأشياء يمكن التعبير عنها بدقة كبيرة بواسطة الكود.

لذلك عندما يكون الـWorkflow **محددًا وقواعده دقيقة ومعقدة**، يصبح Code-Driven خياراً قوياً جداً.

---

# ومتى يكون Declarative-Driven أفضل؟

يصبح Declarative-Driven جذاباً عندما يكون المطلوب هو **تعريف المعرفة والسلوك والقواعد والـWorkflow بطريقة يمكن قراءتها وتعديلها بسهولة**.

مثلاً:

```text
Agent QA:

مسؤول عن:
- تشغيل الاختبارات.
- تحليل النتائج.
- إنشاء تقرير.

ممنوع:
- تعديل Production.
- تغيير المتطلبات.
- تعديل الكود دون طلب.
```

هذه المعلومات لا تحتاج بالضرورة إلى أن تكون داخل Python.

يمكن وضعها في Markdown، بحيث يستطيع:

* Developer قراءتها.
* Product Owner مراجعتها.
* Architect تعديلها.
* Git تتبع تاريخها.
* Code Review مراجعتها مثل أي ملف آخر.

وهنا تظهر قيمة كبيرة للـMarkdown:

> **الـPrompt والـRules والـAgent Definition تصبح Artifacts قابلة للإدارة مثل الكود نفسه.**

---

# ماذا عن Multi-Agent؟

يمكن للطريقتين إدارة عدة Agents.

في Code-Driven:

```text
Python

├── Agent PO
├── Agent Architect
├── Agent Developer
└── Agent QA
```

الكود هو الذي يقرر متى وكيف يتم تشغيلهم.

وفي Declarative-Driven:

```text
agents/
├── po.md
├── architect.md
├── developer.md
└── qa.md

workflow/
└── development.md
```

الـRuntime يقرأ هذه التعريفات وينفذ الـWorkflow.

إذن الاختلاف ليس في **عدد Agents**.

الاختلاف في:

> **أين نضع تعريف الـAgents ومنطق الـOrchestration؟**

---

# وأين يأتي الـHybrid؟

هنا، في رأيي، توجد المقاربة الأكثر واقعية في الأنظمة الكبيرة.

ليس من الضروري أن نختار:

```text
Code OR Markdown
```

بل يمكن أن نستخدم:

```text
Hybrid Agentic Architecture

┌──────────────────────┐
│ Markdown / YAML │
│ Agents / Rules │
│ Skills / Prompts │
│ Workflow Definition │
└──────────┬───────────┘

┌──────────────────────┐
│ Python / TypeScript │
│ Orchestration Engine │
│ Conditions / State │
│ Validation / Hooks │
└──────────┬───────────┘

┌──────────────────────┐
│ LLM / Agents / Tools │
└──────────────────────┘
```

أي:

**Markdown/YAML** لتعريف:

* Agent
* Role
* Rules
* Skills
* Instructions
* Permissions
* Workflow description

و**Code** للتعامل مع:

* Conditions
* State
* API calls
* Database
* Validation
* Security
* Retry
* Parallelism
* Error handling
* Deterministic business logic

ثم يأتي الـLLM ليقوم بما هو جيد فيه:

> **الفهم، reasoning، التخطيط، وتحليل اللغة والمعلومات.**

---

# قاعدة مهمة جداً في Agentic Engineering

يمكن أن نضع قاعدة بسيطة:

> **إذا كان القرار يجب أن يكون حتمياً، اجعله في الكود عندما يكون ذلك مناسباً.**

مثلاً:

```text
إذا كان amount > 10000
→ Human Approval
```

لا يوجد سبب قوي لجعل LLM يقرر هذه القاعدة إذا كان المطلوب قانوناً ثابتاً.

لكن إذا كان السؤال:

```text
هل هذه الوثيقة تحتوي على معلومات مرتبطة بالمتطلبات؟
```

فهنا يمكن أن يكون LLM مناسباً، لأن القرار يعتمد على **فهم اللغة والسياق**.

إذن:

**Deterministic logic → Code**

**Semantic reasoning → LLM/Agent**

**Agent definition & instructions → Markdown/YAML يمكن أن تكون مناسبة**

وهذا الفصل يجعل النظام أكثر وضوحاً وقابلية للصيانة.

---

# ماذا نتعلم من هذا الاختلاف؟

الخطأ هو أن نقول:

> "Code-Driven أفضل."

أو:

> "Declarative-Driven أفضل."

الحقيقة أن لكل واحد مكانه.

**Code-Driven** يعطيك تحكماً كبيراً ودقة في التنفيذ.

**Declarative-Driven** يعطيك مرونة وسهولة في تعريف الـAgents والـRules والـWorkflows، ويجعل هذه العناصر قابلة للمراجعة من أشخاص ليسوا بالضرورة مطورين.

أما **Hybrid** فيجمع الاثنين:

```text
Declarative

What the Agent should be

Code

How the system must execute

LLM

Reasoning and semantic decisions
```

وهذا يمكن أن يكون نموذجاً قوياً جداً لبناء أنظمة **Agentic AI** قابلة للتوسع.

---

# الخلاصة

هناك طريقتان رئيسيتان للتفكير في بناء الأنظمة Agentic.

**Code-Driven** يعني أن الـAgents والـTools والـState والـOrchestration يتم التحكم فيها بشكل أساسي بواسطة الكود، مثل Python أو TypeScript أو C #، باستخدام Frameworks مثل LangChain وLangGraph وغيرها.

أما **Declarative-Driven** فيعتمد على وصف الـAgents والـSkills والـRules والـWorkflows في ملفات مثل Markdown وYAML، بينما يتولى Runtime أو Harness عملية التنفيذ الفعلية.

والأهم أن **Declarative-Driven لا يعني أن النظام لا يحتوي على برمجة**؛ فالـRuntime الذي يقرأ هذه الملفات ويطبقها يحتاج غالباً إلى كود.

لذلك، في الأنظمة الحقيقية والمعقدة، غالباً لا نحتاج إلى اختيار أحدهما بشكل مطلق. يمكن أن نضع **تعريف الـAgents والـRules والـSkills في ملفات Declarative، ونضع الـOrchestration الحتمي والـConditions والـState والـValidation في Code**.

وهنا نصل إلى الفكرة الأساسية:

> **لا تجعل الـLLM يقوم بما يستطيع الكود القيام به بشكل أكثر دقة، ولا تجعل الكود يقوم بما يتفوق الـLLM في فهمه واستنتاجه.**

وهذه واحدة من أهم الأفكار لفهم **Agentic Engineering**:
ليس الهدف أن نجعل كل شيء Agent، بل أن نحدد بدقة **ما الذي يجب أن يكون Code، وما الذي يمكن أن يكون Declarative، وما الذي يجب أن يترك للـLLM والـAgents.**

مراقبة الذكاء الاصطناعي: لماذا أصبحت ضرورة لا رفاهية؟لا يمكنك تحسين ما لا تراه.هذه القاعدة البسيطة تلخّص أحد أكبر التحدي...
09/09/2026

مراقبة الذكاء الاصطناعي: لماذا أصبحت ضرورة لا رفاهية؟

لا يمكنك تحسين ما لا تراه.
هذه القاعدة البسيطة تلخّص أحد أكبر التحديات التي تواجه فرق التطوير مع انتقال تطبيقات الذكاء الاصطناعي من مرحلة التجارب إلى بيئات الإنتاج الفعلية.

على مدار سنوات، اعتمدت فرق التقنية على أدوات المراقبة التقليدية لتتبع مؤشرات مثل استهلاك المعالج والذاكرة، ومعدل الأخطاء، وزمن استجابة الخوادم. لكن هذه المؤشرات، رغم أهميتها، لم تعد كافية عندما يصبح نموذج اللغة الكبير (LLM) جزءًا أساسيًا من منطق التطبيق.

فالذكاء الاصطناعي لا يتصرف دائمًا مثل البرمجيات التقليدية. قد ينتج النموذج إجابات مختلفة للمدخل نفسه، وقد يقدم معلومات غير صحيحة بثقة عالية فيما يُعرف بـ الهلوسة (Hallucination). كما أن تكلفة تشغيله لا ترتبط بزمن المعالجة فقط، وإنما بعدد الرموز (Tokens) التي تتم معالجتها، والنموذج المستخدم، وطبيعة العمليات التي ينفذها.

لذلك، لم يعد السؤال في بيئات الإنتاج هو: هل نجح الطلب تقنيًا؟
بل أصبح السؤال الأهم: ماذا حدث أثناء تنفيذ الطلب؟ ولماذا حدث؟ وكم كلف؟ وهل كانت النتيجة مفيدة وصحيحة للمستخدم؟

وهنا تظهر أهمية مراقبة الذكاء الاصطناعي (AI Observability).

ما المقصود بمراقبة الذكاء الاصطناعي؟

مراقبة الذكاء الاصطناعي هي نهج متكامل يهدف إلى توفير رؤية واضحة ومترابطة لدورة حياة طلب الذكاء الاصطناعي بالكامل، بدءًا من لحظة وصول طلب المستخدم، مرورًا بالنموذج والأدوات والخدمات المختلفة، ووصولًا إلى النتيجة النهائية.

وتزداد أهمية هذا النهج في التطبيقات الحديثة التي تجمع بين نماذج اللغة الكبيرة، والوكلاء الذكيين (AI Agents)، وأنظمة الاسترجاع المعزز بالتوليد (RAG)، واستدعاءات الأدوات الخارجية، والخدمات المصغرة، والبنية التحتية السحابية.

بمعنى آخر، لا تكتفي مراقبة الذكاء الاصطناعي بمعرفة أن النظام يعمل، بل تساعدك على فهم كيف يعمل، ولماذا يتصرف بهذه الطريقة، وما إذا كان الناتج جيدًا بالفعل.

الركائز الأساسية لمراقبة الذكاء الاصطناعي

لفهم هذا المفهوم بصورة عملية، يمكن تقسيمه إلى خمس ركائز مترابطة:

1. السجلات (Logs): ماذا حدث؟

السجلات تجيب عن السؤال الأساسي: ماذا حدث بالضبط؟

وتوفر تفاصيل الأحداث التي وقعت أثناء تنفيذ الطلب، مثل الأخطاء، واستدعاءات الأدوات، وحالات الفشل، والرسائل المهمة، وغيرها من المعلومات اللازمة لفهم سلوك النظام وتشخيص المشكلات.

لكن في تطبيقات الذكاء الاصطناعي، لا تكفي سجلات البنية التحتية وحدها؛ إذ تحتاج أيضًا إلى تسجيل الأحداث المرتبطة بتدفق الذكاء الاصطناعي نفسه.

2. التتبع الموزّع (Traces): كيف تحرك الطلب؟

التتبع يوضح المسار الكامل الذي قطعه الطلب عبر النظام.

فقد يبدأ الطلب من واجهة المستخدم، ثم ينتقل إلى خدمة التطبيق، ومنها إلى نموذج اللغة، ثم إلى قاعدة بيانات أو نظام RAG، ثم إلى أداة خارجية، قبل أن يعود إلى النموذج لإنتاج الإجابة النهائية.

من دون التتبع الموزّع، قد تعرف أن الطلب استغرق خمس ثوانٍ، لكنك لن تعرف أين ضاعت هذه الثواني. أما التتبع فيمكن أن يكشف، على سبيل المثال، أن النموذج استغرق ثلاث ثوانٍ، بينما استغرق استرجاع البيانات ثانية أخرى، وتوزعت بقية المدة بين الخدمات الوسيطة.

3. المؤشرات (Metrics): كم بسرعة وبتكلفة؟

المؤشرات تحول سلوك النظام إلى أرقام قابلة للقياس والمقارنة.

ومن أبرز المؤشرات المهمة في تطبيقات الذكاء الاصطناعي:

* زمن الاستجابة.
* معدل الأخطاء.
* معدل نجاح الطلبات.
* عدد الطلبات.
* استهلاك الرموز.
* تكلفة الطلب الواحد.
* معدل استخدام النماذج المختلفة.
* معدلات استدعاء الأدوات والخدمات الخارجية.

هذه البيانات تساعد الفرق على اكتشاف التدهور في الأداء ومراقبة التكلفة واتخاذ قرارات مبنية على بيانات فعلية.

4. تليمتري نماذج اللغة (LLM Telemetry): ماذا فعل النموذج؟

هذه هي الطبقة التي تميز مراقبة تطبيقات الذكاء الاصطناعي عن المراقبة التقليدية.

فمن المهم معرفة تفاصيل مثل:

* النموذج الذي تم استدعاؤه.
* المدخلات المرسلة إليه.
* المخرجات التي أعادها.
* عدد الرموز المستخدمة في الإدخال والإخراج.
* زمن الاستجابة.
* عمليات استدعاء الأدوات.
* تكلفة العملية.

هذه المعلومات تمنح الفريق رؤية دقيقة لما حدث داخل طبقة الذكاء الاصطناعي، وتساعده على اكتشاف أسباب ارتفاع التكلفة أو انخفاض الأداء أو ظهور نتائج غير متوقعة.

5. التقييمات (Evaluations): هل كانت النتيجة جيدة؟

هذه الركيزة ربما تكون الأهم، لأنها تجيب عن السؤال الذي لا تستطيع المراقبة التقليدية الإجابة عنه:

هل كانت الإجابة التي قدمها النموذج جيدة ومفيدة للمستخدم؟

قد ينتهي الطلب بنجاح من الناحية البرمجية، دون أن يعني ذلك أن النتيجة كانت صحيحة أو مفيدة.

ولهذا تحتاج تطبيقات الذكاء الاصطناعي إلى آليات لتقييم جودة المخرجات، مثل قياس مدى ارتباط الإجابة بالسؤال، ودقة المعلومات، وجودة المصادر المسترجعة، ومدى التزام النموذج بالتعليمات، إضافة إلى رصد حالات الهلوسة وجمع تقييمات المستخدمين الفعليين.

وهنا تنتقل المراقبة من مجرد مراقبة صحة النظام إلى مراقبة جودة الذكاء الذي ينتجه النظام.

ما الذي يجب أن تراقبه في تطبيقات الذكاء الاصطناعي؟

أي نظام مراقبة ناضج لتطبيقات الذكاء الاصطناعي ينبغي أن يغطي مجموعة واسعة من الجوانب، من أبرزها:

* تسجيل الطلبات والمدخلات والمخرجات بصورة منظمة.
* تتبع استهلاك الرموز والتكلفة المرتبطة بكل طلب.
* قياس زمن استجابة النماذج والخدمات المختلفة.
* مراقبة استدعاءات الأدوات والخدمات الخارجية.
* اكتشاف الأخطاء وحالات الفشل.
* مراقبة جودة نتائج الاسترجاع في أنظمة RAG.
* تقييم جودة إجابات النموذج.
* رصد مؤشرات الهلوسة وعدم الدقة.
* مراقبة الأحداث والمخاطر الأمنية المحتملة.
* جمع ملاحظات المستخدمين وتقييماتهم.
* تتبع الطلب بشكل موزّع عبر الخدمات المصغرة.
* ربط الأداء التقني بجودة النتيجة النهائية.

والأهم أن هذه البيانات يجب ألا تكون جزرًا منفصلة. القيمة الحقيقية تظهر عندما تستطيع ربط الطلب نفسه بكل ما حدث أثناء تنفيذه: المدخلات، النموذج المستخدم، عمليات الاسترجاع، استدعاءات الأدوات، زمن التنفيذ، استهلاك الرموز، التكلفة، والمخرجات النهائية.

الأدوات الأساسية لبناء منظومة المراقبة

ظهرت خلال السنوات الأخيرة مجموعة من الأدوات مفتوحة المصدر التي يمكن دمجها لبناء منظومة متكاملة لمراقبة تطبيقات الذكاء الاصطناعي.

OpenTelemetry أصبح طبقة أساسية لجمع بيانات التليمتري بصورة موحدة وقابلة للتصدير إلى أدوات ومنصات مختلفة. ويساعد على توحيد طريقة جمع السجلات والمؤشرات والتتبعات عبر مكونات النظام.

أما Prometheus فيُستخدم على نطاق واسع لجمع المؤشرات الرقمية وتخزينها والاستعلام عنها، بينما يوفر Grafana طبقة مرئية لبناء لوحات المعلومات ومراقبة أداء النظام بصورة واضحة وفورية.

وفي جانب السجلات، يأتي Loki كحل متخصص في تجميع وإدارة السجلات بكفاءة، خصوصًا في البيئات التي تنتج كميات كبيرة من البيانات.

أما Jaeger فيركز على التتبع الموزّع، ويساعد فرق التطوير على فهم مسار الطلب وتحديد نقاط الاختناق والتأخير داخل الخدمات المختلفة.

وفي طبقة الذكاء الاصطناعي نفسها، تبرز أدوات متخصصة مثل Langfuse، التي توفر قدرات موجهة لتتبع وتقييم تطبيقات نماذج اللغة الكبيرة، بما في ذلك المدخلات والمخرجات، واستدعاءات النماذج، واستهلاك الرموز، والتكلفة، ومؤشرات الجودة.

من مراقبة البنية التحتية إلى مراقبة الذكاء

التحول الحقيقي هنا لا يتعلق بإضافة أداة جديدة إلى مجموعة أدوات DevOps، بل بتغيير طريقة التفكير في المراقبة نفسها.

في الأنظمة التقليدية، قد يكون السؤال:

هل الخدمة تعمل؟

أما في تطبيقات الذكاء الاصطناعي، فالسؤال أصبح أكثر تعقيدًا:

هل الخدمة تعمل؟ وهل النموذج استجاب؟ وكم استغرق؟ وكم كلف؟ وما البيانات التي استخدمها؟ وما الأدوات التي استدعاها؟ وهل كانت الإجابة صحيحة؟ وهل حققت الغرض الذي يريده المستخدم؟

وهذا هو الفارق الجوهري بين المراقبة التقليدية ومراقبة الذكاء الاصطناعي.

فالهدف لم يعد مجرد اكتشاف الأعطال التقنية، وإنما بناء صورة شاملة تربط الأداء، والتكلفة، والسلوك، والجودة، وتجربة المستخدم في منظومة واحدة.

ومع تزايد اعتماد المؤسسات على الوكلاء الذكيين، وأنظمة RAG، ونماذج اللغة الكبيرة، ستصبح هذه الرؤية الشاملة جزءًا أساسيًا من تشغيل تطبيقات الذكاء الاصطناعي، وليست مجرد ميزة إضافية.

لأنك ببساطة لا تستطيع تحسين نظام ذكاء اصطناعي لا تستطيع رؤيته وفهمه وقياسه.

Adresse

19 Rue Saint Leger
Saint-Germain-en-Laye
78100

Notifications

Soyez le premier à savoir et laissez-nous vous envoyer un courriel lorsque Abdelali Zekiri publie des nouvelles et des promotions. Votre adresse e-mail ne sera pas utilisée à d'autres fins, et vous pouvez vous désabonner à tout moment.

Raccourcis

Partager