تخطَّ إلى المحتوى
22/30الفصل 22 من 30

ما هو AI Agent: خمسة أنواع كلاسيكية وتعريفان متنافسان

عالم المكنسة ينكسر أربع مرات ليكشف أنواع agent الخمسة، ثم أداة واحدة تحوّل نداءً من 39 token إلى 420.

في هذه الصفحة

إليك السؤال نفسه، طُرح مرتين على النموذج نفسه، بالأوزان نفسها وبفك ترميز جشع. الفرق الوحيد أن المرة الثانية كان فيها أداة واحدة في الفهرس.

TEXT
no tools in the catalogue
  turn 1  prompt=  39  out=  8  finish=stop        TEXT "The capital of France is Paris."
  => model calls=1  prompt tokens=39  output=8  wall=974 ms

one tool in the catalogue: get_temperature(city)
  turn 1  prompt= 185  out= 20  finish=tool_calls  CALL get_temperature({"city": "Paris"})
          tool  get_temperature -> {"city":"Paris","celsius":11}
  turn 2  prompt= 235  out= 18  finish=stop        TEXT "The capital of France is Paris. It is
                                                        currently at 11 degrees Celsius."
  => model calls=2  prompt tokens=420  output=38  wall=6,685 ms

أصبح النداء الواحد نداءين. وصارت 39 token إدخال 420، أي بمعامل 10.8. وما كان يستغرق أقل من ثانية صار يقارب سبع ثوانٍ. والتقطت الإجابة حقيقة لم يطلبها أحد، من أداة اختار النموذج استدعاءها لسؤال لم يذكر الطقس أصلاً.

النظام الثاني هو ما تسميه معظم الصناعة في 2026 agent. أو ليس كذلك، بحسب أيٍّ من التعريفين الأكثر قراءة تفتحه — وهذان التعريفان لا يقولان الشيء نفسه. أحدهما لا يتفق حتى مع نفسه.

هذا الخلاف هو موضوع هذا الفصل. ليس شجاراً في المفردات: فالتعريفان يرسمان الحدّ على محورين مختلفين، والمحور الذي تختاره يحدد ما تبنيه وما ستُحاسَب عليه. كلاهما يقف على تصنيف أقدم، وأرخص طريقة لاستحقاقه هي بناء أسوأ agent في العالم.

عرض التفاصيل

ما يحتاجه هذا الفصل من الفصول السابقة.

  • الفصل 13 قاس تكلفة النداء الواحد زمنياً؛ وهذا الفصل يضرب ذلك في عدد الأدوار.
  • الفصل 15: الـ prompt هو الحالة الكاملة للنموذج، لأن لا شيء ينجو بعد النداء.
  • الفصل 16: token الإدخال تنمو مع مربع طول المحادثة.
  • الفصل 18: فهرس الأدوات، ورحلة الذهاب والإياب التي يطلب فيها النموذج وتنفذ شيفرتك.

لا توجد tensors هنا. الفصل TypeScript، حيث تضعه قاعدة اللغة في الفصل 14، وحلقته هي السلف المباشر لحلقة الفصل 23.

أقدم مثال في المجال هو مكنسة كهربائية في عالم مكوّن من مربعين، A وB، وكل منهما إما نظيف أو متّسخ.1 يبقى هذا المثال في كل كتاب دراسي لأنه أصغر عالم يمكن أن يكون فيه agent على صواب أو خطأ.

الإدراك زوج — أين أنا، وهل المكان هنا متّسخ — والأفعال هي SUCK وLEFT وRIGHT. البرنامج كله سطر واحد.

reflex.tsTS
type Percept = { dirty: boolean; where?: "A" | "B" };
type Action = "SUCK" | "LEFT" | "RIGHT";

const textbook = (p: Percept): Action =>
  p.dirty ? "SUCK" : p.where === "A" ? "RIGHT" : "LEFT";   

شغّله على كل تهيئة ابتدائية لعالم المربعين:

TEXT
A dirty, B dirty, start A    -> steps=3 clean=true
A clean, B dirty, start A    -> steps=2 clean=true
A dirty, B clean, start B    -> steps=2 clean=true

هذا simple reflex agent: يتصرف بناءً على الإدراك الحالي وحده، بلا ذاكرة لأي شيء قبله. ليست فئة لعب — فالثرموستات واحد منها، وكذلك نداء واحد إلى نموذج لغوي بلا محادثة مرفقة.

الآن اكسره كما يفعل الواقع. روبوت المكنسة الحقيقي لديه حساس اتساخ ومصد، لا مربع مكتوب عليه A تحت السجادة. أخرج الموقع من الإدراك ولا تغيّر شيئاً آخر:

reflex.tsTS
const dirtOnly = (p: Percept): Action => (p.dirty ? "SUCK" : "RIGHT");
TEXT
A dirty, B dirty, start A    -> steps=3   clean=true   still dirty=0
      t=0 at=A percept={dirty:true}  -> SUCK
      t=1 at=A percept={dirty:false} -> RIGHT
      t=2 at=B percept={dirty:true}  -> SUCK

A dirty, B clean, start B    -> steps=500 clean=false  still dirty=1
      t=0 at=B percept={dirty:false} -> RIGHT
      t=1 at=B percept={dirty:false} -> RIGHT
      t=2 at=B percept={dirty:false} -> RIGHT
      t=3 at=B percept={dirty:false} -> RIGHT

البرنامج نفسه، مربعان. من حالة ابتدائية ينجز المهمة في ثلاث خطوات؛ ومن أخرى يصطدم بالجدار الأيمن خمسمئة مرة وكان سيستمر حتى تموت البطارية. لا يستطيع إدراك الفرق بين الحالتين، لذلك لا يستطيع التصرف بشكل مختلف فيهما. يصوغ Russell وNorvig النتيجة العامة في سطر واحد: الحلقات اللانهائية غالباً لا يمكن تفاديها لدى simple reflex agents في بيئات قابلة للملاحظة جزئياً.1

هناك إصلاح يكلف سطراً واحداً ولا يضيف ذاكرة، ويستحق القياس قبل أن نطلب شيئاً أذكى.

reflex.tsTS
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);

const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT");  

ألفا تشغيل لممر كل غرفه متّسخة بثلاثة أحجام، وبمولّد عشوائي مبذور واحد طوال الوقت:

الغرفمتوسط الخطواتالوسيطالأسوأ من 2,000لم ينهِ أبداً
24.04130
416.614810
868.7523060

العشوائية تزيل الحلقة تماماً. لكنها تكلّف أيضاً: ثماني غرف تحتاج خمس عشرة حركة إذا كنت تعرف ما تفعله، وهذا agent يحقق متوسط 68.7 واحتاج مرةً إلى 306. هذا هو الفصل كله في صورة مصغرة. كل قدرة نضيفها تشتري صحةً في حالة لم يكن agent السابق قادراً على التعامل معها، وتفرض ثمناً بعملة عليك أن تسميها أولاً.

تسمية الأجزاء، الآن وقد صارت لازمة

رابط إلى القسم: تسمية الأجزاء، الآن وقد صارت لازمة

يدرك agent بيئته عبر حساسات ويتصرف عبر مشغلات. برنامج agent هو الدالة من الإدراكات إلى الأفعال — كل قائمة أعلاه واحدة منها. تسلسل الإدراكات هو كل ما أُدرك حتى الآن، وsimple reflex agent يتجاهله كله ما عدا العنصر الأخير.

العقلانية هي الكلمة التي تخطئ فيها معظم المقالات، وتصحيحها يجعل بقية هذا الفصل قابلة للاستخدام. لا يكون agent عقلانياً أو غير عقلاني في ذاته. يعرّف Russell وNorvig الـ rational agent بأنه الذي، لكل تسلسل إدراكات ممكن، يختار الفعل المتوقع أن يعظّم مقياس الأداء لديه، بالنظر إلى دليل ذلك التسلسل وأي معرفة مدمجة يملكها.1 مقياس الأداء ليس داخل agent: إنه يخص المصمم، والعقلانية لا تُعرَّف إلا بالنسبة إليه.

تُكتب المواصفة تقليدياً كأربعة أشياء، PEAS: مقياس الأداء، البيئة، المشغلات، الحساسات.

روبوت المكنسةsupport agent في الإنتاج
مقياس Performanceمربعات نظيفة، لكل وحدة بطاريةتذاكر محلولة، لكل دولار، دون تصعيد
Environmentالأرضية، الأوساخ، الأثاث، السجادطابور التذاكر، قاعدة بياناتك، العميل
Actuatorsعجلات، شفطtool calls
Sensorsحساس اتساخ، مصدرسالة المستخدم، نتائج الأدوات

لاحظ أي صف هو المختلف. تقريباً كل فريق يبني agents في 2026 يكتب E وA وS — مخططات الأدوات، التكاملات، صيغة الرسالة — لأن الشيفرة لن تعمل من دونها. يكاد لا أحد يكتب P. من دونه، لا معنى قابلاً للتحقق لعبارة «agent لدينا يعمل جيداً»، ولا يمكن تطبيق «عقلاني» على النظام أصلاً، بل فقط على عرض توضيحي. الفصل 29 يدور حول تحويل P إلى رقم، ولهذا يوجد.

TEXT
    ┌───────────────────────── the environment ─────────────────────────┐
    │                                                                   │
    │   ┌──────────────────────── the agent ─────────────────────┐      │
    │   │                                                        │      │
 ───┼──►│  sensors  ──►  the agent program  ──►  actuators  ─────┼──────┼──►
percept │                                                        │    action
    │   └────────────────────────────────────────────────────────┘      │
    └───────────────────────────────────────────────────────────────────┘

              the performance measure lives out here, in the head of
              whoever built the thing, and the agent cannot change it

تُصنَّف بيئات المهام أيضاً على سبعة محاور، خمسة منها تحدد معظم الصعوبة هنا: قابلة للملاحظة كلياً أو جزئياً، حتمية أم لا، حلقية أم تسلسلية، ثابتة أم ديناميكية، معروفة أم مجهولة.1 أي agent يتحدث إلى أدوات حقيقية عبر شبكة حقيقية يقع في الزاوية الصعبة من الخمسة كلها — غير حتمي حتى عند temperature صفر (الفصل 17)، والأهم المُستهان به: مجهولة، لأنك لا تملك نموذجاً موثوقاً لما تفعله أدواتك أنت بالعالم. لهذا تحتاج حلقة الفصل 23 إلى معالجة أخطاء أكثر من التخطيط.

إضافة الذاكرة، والعثور على الجدار التالي

رابط إلى القسم: إضافة الذاكرة، والعثور على الجدار التالي

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

TEXT
        col  0 1 2 3 4 5 6
      row 0  * . . # . . *
      row 1  . # . # . # .
      row 2  . # . S . # .        S = the robot starts here
      row 3  . # . # . # .
      row 4  * . . # . . *

الترقية الواضحة هي الذاكرة. يحتفظ agent بخريطة: كل مربع وقف عليه وكل مربع أطلق فيه المصد إشارة. قاعدته أن يسير إلى مربع مجاور لم يزره — يميناً، ثم نزولاً، ثم يساراً، ثم صعوداً — ويتراجع حين يصبح كل ما حوله معروفاً. هذا model-based reflex agent: يحافظ على حالة داخلية من تاريخ الإدراكات، لذلك يستطيع التصرف بناءً على ما لا يراه حالياً.

هذا تحسن حقيقي، لكنه ما يزال غير كافٍ:

TEXT
5,000 steps allowed -> steps=5,000  distinct squares visited=13/25  still dirty=2/4

خمسة آلاف حركة، ونصف الأرضية لم يُرَ أبداً. الخريطة صحيحة والقواعد صحيحة. ما لا يستطيع agent فعله هو استخدام الخريطة للذهاب إلى مكان ما: قواعده لا تجيب إلا عن «أيٌّ من جيراني الأربعة ينبغي أن أخطو إليه»، لذلك عندما تنفد المربعات غير المزارة بجانبه، لا توجد لديه طريقة للتعبير عن الفكرة هناك مربع غير مزور على بعد ثماني حركات وأريد أن أكون واقفاً عليه. إنه يعرف أين هو. لكنه لا يعرف أين يريد أن يكون.

يحمل goal-based agent، فوق نموذجه للعالم، وصفاً للوضع الذي يريد إحداثه، ويختار الأفعال بالبحث في تسلسلات منها حتى يجد تسلسلاً ينتهي هناك. الأهداف تحول اختيار الفعل من lookup إلى بحث.

الهدف هو «ألا يبقى أي مربع متّسخ». البحث هو مشي breadth-first إلى أقرب مربع متّسخ، والمسار الذي يعيده هو الخطة.

TEXT
goal-based (fewest moves)      -> moves=27  battery=52  still dirty=0
      from 2,3 -> 4,6 via 5 moves:  2,3 2,4 3,4 4,4 4,5 4,6
      from 4,6 -> 0,6 via 4 moves:  4,6 3,6 2,6 1,6 0,6
      from 0,6 -> 4,0 via 10 moves: 0,6 0,5 0,4 1,4 2,4 2,3 2,2 3,2 4,2 4,1 4,0
      from 4,0 -> 0,0 via 4 moves:  4,0 3,0 2,0 1,0 0,0

سبع وعشرون حركة، والأرضية نظيفة. لكن انظر إلى عمود البطارية وآخر جزء من الخطة. العمود 0 مغطى بالسجاد: عبور مربع مفروش يكلف ست وحدات بطارية، والمربع المبلط وحدة واحدة. عاد agent إلى البيت عبر العمود 0 لأن ذلك أربع حركات بدلاً من ثمانٍ، وهذه الحركات الأربع على السجاد كلفت 24 حيث كان الالتفاف ذو الحركات الثماني سيكلف 13.

لا يستطيع غير ذلك. الهدف اختبار ثنائي: الأرضية نظيفة أو ليست كذلك. كل خطة تنتهي بأرضية نظيفة تحقق الهدف بالقدر نفسه، لذلك عندما تنجح عدة خطط لا يملك agent شيئاً يختار بينها. تفضيل نجاح على آخر يحتاج رقماً فوق المخرجات، وهذا الرقم هو دالة منفعة. الـ agent الذي يعظمها هو utility-based agent.

التغيير في الشيفرة حدّ واحد داخل البحث. breadth-first search يعدّ الحركات؛ اجعله يعدّ التكلفة بدلاً من ذلك، فتحصل على خوارزمية Dijkstra وagent مختلف:

search.tsTS
const nd = dist.get(k)! + (byCost ? cell.cost : 1);   // <- the entire difference
TEXT
goal-based    (fewest moves)   -> moves=27  battery=52  still dirty=0
utility-based (cheapest route) -> moves=31  battery=41  still dirty=0
      from 4,0 -> 0,0 via 8 moves: 4,0 4,1 4,2 3,2 2,2 1,2 0,2 0,1 0,0

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

هذه أيضاً أول نقطة يحتاج فيها agent إلى شيء لا يستطيع إنتاجه. يجب أن يقرر شخص ما قيمة وحدة البطارية بالنسبة إلى حركة. المنفعة هي مقياس الأداء مكتوباً بصيغة يستطيع agent الحساب بها، وكتابتها وظيفة المصمم. عندما يقول الناس إن agent «حسّن الشيء الخطأ» فهم نادراً ما يعنون وجود bug. إنهم يعنون أن هذا السطر كُتب بإهمال.

النوع الخامس، والطريقة التي يخطئ بها

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

الآن دع الأوساخ تعود. تتسخ أربع غرف من جديد بأربعة معدلات مختلفة، ولا يُخبر agent بها أبداً. يزور غرفة واحدة في كل tick ولا يرى إلا تلك الغرفة. مقياس الأداء هو room-ticks التي قضتها الغرف متّسخة خلال 4,000 tick — الأقل أفضل.

learning agent، في تفكيك الكتاب الدراسي، هو أي مما سبق مع ثلاثة أجزاء إضافية: عنصر تعلم يغيّر agent، وناقد يخبره كيف يبلي مقارنة بمعيار أداء ثابت، ومولد مشكلات يقترح أفعالاً تستحق التجربة لما ستعلّمه.1 ثلاث سياسات في البيئة نفسها. الأولى لا تتعلم؛ الثانية والثالثة تتعلمان الشيء نفسه وتستخدمانه بطرق مختلفة.

السياسةdirty-room-ticks خلال 4,000مقارنة بالدورية
دورية round-robin ثابتة، بلا تعلم2,290
المتعلم A: يقدّر معدل اتساخ كل غرفة، ثم يذهب حيث يرجح وجود اتساخ11,820أسوأ 5.2×
المتعلم B: التقديرات نفسها، موزونة بمدة الغياب منذ آخر زيارة1,576أفضل 31 %

كانت المعدلات المخفية 0.35 للمطبخ، و0.05 للممر، و0.02 للمكتب، و0.01 للعلّية — وقد وجدها المتعلم A. حدد المطبخ، بشكل صحيح، على أنه أقذر غرفة في البيت، ثم ذهب إلى المطبخ في كل tick لبقية المحاكاة بينما بقيت الغرف الثلاث الأخرى متّسخة إلى الأبد. إنه أسوأ بخمس مرات من عدم التعلم إطلاقاً، وليس معطلاً.

الدرس هو درس قسم المنفعة. عظّم المتعلم A «احتمال أن تكون الغرفة التي أنا على وشك زيارتها متّسخة». وكان مقياس الأداء «room-ticks التي قضتها الغرف متّسخة». رقمان مختلفان؛ الثاني هو ما كان الناقد يسجله، ولم يخبر أحدٌ agent. يضرب المتعلم B المعدل المتعلَّم نفسه في الزمن منذ آخر زيارة — أي الأوساخ التي يتوقع العثور عليها لا احتمال العثور على أي أوساخ — ويتفوق على الدورية التي بدأ منها.

تفصيل تنفيذي واحد حسم النتيجة. في النسخة الأولى من المتعلم B، الغرفة التي لم تظهر فيها أوساخ في ثلاث زيارات حصلت على معدل يساوي صفراً تماماً — وصفر مضروباً في أي شيء يساوي صفراً، لذلك لم تُزر مرة أخرى أبداً ولم يكن ممكناً تصحيح التقدير. تنعيم الكسر، النجاحات زائد واحد على المحاولات زائد اثنين، حوّل 11,895 إلى 1,576. «لم يُرصد بعد» و«قيس وخرج صفراً» ادعاءان مختلفان، والنظام الذي يخزنهما في الحقل نفسه يتخذ قرارات لا يستطيع التراجع عنها.

TEXT
  1  simple reflex    percept ────────────────────────────────► rules ────► action
  2  model-based      percept ──► [state] ──────────────────► rules ────► action
  3  goal-based       percept ──► [state] ──► [goal] ──────► search ───► action
  4  utility-based    percept ──► [state] ──► [goal] ──► [U] ──► argmax ► action
  5  learning         all of the above, plus [critic] ──► changes the parts above

كل واحد من الخمسة موجود في الإنتاج اليوم تحت اسم آخر.

النوع الكلاسيكيما يحمله بين الإدراكاتشكله في 2026ما لا يستطيع فعله
simple reflexلا شيءنداء نموذج واحد بلا تاريخ: مصنّف، endpoint استخراج، إكمال بدور واحدأي شيء يعتمد على الدور السابق
model-based reflexحالة داخلية مبنية من تاريخ الإدراكاتدردشة: السجل النصي، يُعاد إرساله كاملاً في كل نداءاختيار أين ينبغي أن تنتهي المحادثة
goal-basedحالة إضافة إلى وصف للوضع المرغوبحلقة reasoning-and-act مع شرط توقف2تفضيل خطة ناجحة على أخرى
utility-basedحالة، وهدف، ورقم فوق المخرجاتحلقات evaluator–optimiser، وترتيب الإجابات المرشحة وفق معيار مكتوب (الفصل 25)ابتكار المعيار
learningكل ذلك، إضافة إلى ناقد ومولد مشكلاتReflexion، الذي يكتب دروسه الخاصة في مخزن episodic بدلاً من تحديث الأوزان؛3 ذاكرة مستخدم مستمرة (الفصل 24)اختيار المعيار الذي يسجل الناقد وفقه

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

الدردشة هي model-based reflex agent نموذجه ليس داخلياً. في الكتاب الدراسي تكون الحالة متغيراً داخل برنامج agent. في الدردشة هي السجل النصي: يعيش في جهتك، ويُعاد إرساله كاملاً في كل نداء، ويُعاد بناؤه من الصفر داخل النموذج كل مرة. تلك هي فاتورة الفصل 16 التربيعية، وهي الشيء نفسه الذي رسمه الكتاب الدراسي كصندوق مكتوب عليه «حالة». إليك الفرق، مقاساً على سؤال متابعة واحد مع الرسالتين السابقتين ومن دونهما:

TEXT
with the transcript      prompt=67  "The current temperature in Lisbon, Portugal is 15°C."
without the transcript   prompt=29  "Lisbon is the capital of Portugal, not a city in Portugal."

النموذج نفسه، والكلمات الثلاث نفسها من إدخال المستخدم، والثاني هو روبوت الممر وهو يصطدم بالجدار. لم تكن هناك أدوات في ذلك التشغيل، لذلك فالرقم 15 مخترَع — لكن الحالة هي ما يجعل المتابعة تعني شيئاً أصلاً. تعيد بناءها كل مرة وتدفع 2.3× من token الإدخال مقابلها في محادثة من دورين. قاس الفصل 16 ما يبلغه ذلك المضاعف عند الدور الأربعين.

Reflexion هو learning agent يغيّر مدخله بدلاً من برنامجه. في تفكيك الكتاب الدراسي يغيّر عنصر التعلم عنصر الأداء. يترك Reflexion الأوزان كما هي ويكتب نصاً تأملياً في مخزن episodic تقرؤه المحاولة التالية.3 عنصر التعلم prompt، والذاكرة صف في قاعدة بيانات، وعنصر الأداء نموذج مجمّد — والمخطط هو مخطط الكتاب الدراسي نفسه، بلا تغيير.

وهنا الحد الصريح للمطابقة. الأنواع الخمسة تصنّف برنامج agent. في 2026 ينقسم ذلك البرنامج في المنتصف: بعضه شيفرتك، وبعضه داخل أوزان لم تدرّبها. عندما يقرر نموذج من تلقاء نفسه استدعاء أداة، هل اختبار الهدف في برنامجك أم في النموذج؟ لا يملك التصنيف جواباً، لأنه حين كُتب لم يكن هناك مكان آخر يمكن أن يوجد فيه — وهذا السؤال بالضبط هو موضع افتراق التعريفين الحديثين.

الإجابة، والاستدعاء، والتوقف، في trace واحد

رابط إلى القسم: الإجابة، والاستدعاء، والتوقف، في trace واحد

التعريفات حجج حول السلوك، والحكم عليها أسهل كثيراً عندما يكون trace أمامك.

الحلقة أدناه ترسل المحادثة إلى نموذج؛ فإذا احتوى الرد على tool call تنفذ الأداة، وتلحق النتيجة، وترسل الشيء كله مرة أخرى. تعمل ضد Qwen2.5-0.5B-Instruct محلي خلف endpoint بشكل OpenAI على هذا الجهاز — وصلة الفصل 14، لذلك لا تعرف الحلقة ولا يهمها ما يوجد خلف المنفذ.

loop.tsTS
const BASE = process.env.LLM_BASE_URL ?? "http://127.0.0.1:8799/v1";

async function loop(question: string, maxTurns = 6) {
  const messages: Msg[] = [
    { role: "system", content: SYSTEM },
    { role: "user", content: question },
  ];

  for (let turn = 1; turn <= maxTurns; turn++) {
    const reply = await call(messages, TOOLS);
    const calls = reply.choices[0].message.tool_calls ?? [];
    messages.push(reply.choices[0].message);

    if (!calls.length) return messages;                      

    for (const c of calls) {
      const out = runTool(c.function.name, JSON.parse(c.function.arguments));
      messages.push({ role: "tool", name: c.function.name, content: out });
    }
  }
  throw new Error("turn cap reached");                       
}

سطران يحملان الفكرة كلها، وكلاهما معلّم؛ والباقي مسك دفاتر. السلوكيات الثلاثة كلها مرئية في تشغيل واحد. حين يُسأل النموذج عن شيء يستطيع فعله بنفسه، فإنه يجيب. وحين يُسأل عن شيء لا يستطيع فعله، فإنه يستدعي:

TEXT
=== a question the model cannot answer, one tool available
  turn 1  prompt= 187  out= 21  finish=tool_calls  CALL get_temperature({"city": "Oslo"})
          tool  get_temperature -> {"city":"Oslo","celsius":4}
  turn 2  prompt= 238  out= 12  finish=stop        TEXT "The current temperature in Oslo is 4
                                                        degrees Celsius."
  => model calls=2  prompt tokens=425  output=33  wall=6,257 ms
  => stopped by: the model produced text instead of a call

وهو يتوقف — السلوك الثالث، والأسهل تفويته، لأنه يبدو كأن لا شيء يحدث. تنتهي الحلقة لأن الدور 2 عاد بلا tool call. لم يقرر أحد ذلك؛ النموذج فعل، بإصدار نثر. شرط إنهاء هذا البرنامج هو علامة غياب.

تشغيلان آخران يستحقان المساحة. عند طلب مقارنة مدينتين، يصدر النموذج كلتا tool calls في دور واحد، ويتلقى القراءتين، ثم يخطئ في المقارنة:

TEXT
  turn 1  prompt= 188  out= 43  finish=tool_calls  CALL get_temperature({"city": "Oslo"}),
                                                        get_temperature({"city": "Lisbon"})
          tool  get_temperature -> {"city":"Oslo","celsius":4}
          tool  get_temperature -> {"city":"Lisbon","celsius":19}
  turn 2  prompt= 284  out= 13  finish=stop        TEXT "Oslo is currently warmer than Lisbon
                                                        at 4°C."

الأدوات عملت. النداء المتوازي عمل. الحلقة عملت. الإجابة خاطئة، مع وجود الرقمين الصحيحين في السجل النصي. تغليف نموذج داخل حلقة لا يجعله يستدل؛ إنه يمنح نموذجاً مخطئاً القدرة على التصرف بناءً على خطئه — وهذا هو الفصل 30 مسبقاً، ونصف الفصل 29.

الآن احذف return المعلّم ودع الحلقة تعمل حتى سقفها بدلاً من ذلك. السؤال نفسه، والنموذج نفسه:

TEXT
  turn 1  prompt= 187  out= 21  CALL get_temperature({"city": "Oslo"})
  turn 2  prompt= 238  out= 12  TEXT "The current temperature in Oslo is 4 degrees Celsius."
  turn 3  prompt= 261  out= 30  TEXT "Could you please specify the exact location you're..."
  turn 4  prompt= 302  out= 14  TEXT "Sure! Could you tell me which city you're interested in?"
  turn 5  prompt= 327  out= 35  TEXT "I'm sorry, but I need more details to provide an..."
  turn 6  prompt= 373  out= 12  TEXT "Which city would you like to know the temperature for?"
  => model calls=6  prompt tokens=1,688  output=124  wall=25,261 ms  stopped by: turn cap

أربعة أضعاف token الإدخال، وأربعة أضعاف زمن الساعة، ونهاية نسي فيها agent ما سُئل عنه وصار يستجوب المستخدم عن سؤال أجابوا عنه في الدور الأول. كانت الإجابة الصحيحة على الشاشة في الدور 2، وكل دور بعده جعل السجل النصي أسوأ.

إذن agent ليس حلقة. إنه حلقة زائد قاعدة للخروج منها، وهذه الحلقة لديها قاعدة واحدة بالضبط. يجد الفصل 23 خمساً، ويعرض ما ينكسر عندما تغيب كل واحدة.

كلاهما مقتبس لا معاد صياغته، لأن الالتباس يُصنّع في إعادة الصياغة.

التعريف الأول يضع الحد عند من يتحكم في التدفق. تسمي وثيقة Anthropic، Building effective agents، الالتباس وتحسمه:

"At Anthropic, we categorize all these variations as agentic systems, but draw an important architectural distinction between workflows and agents: Workflows are systems where LLMs and tools are orchestrated through predefined code paths. Agents, on the other hand, are systems where LLMs dynamically direct their own processes and tool usage, maintaining control over how they accomplish tasks."4

الاختبار سؤال عن الشيفرة المصدرية لديك: من اختار الخطوة التالية؟ وجود switch في برنامجك: workflow. النموذج: agent. تقول الوثيقة نفسها إن agents «عادةً ليست إلا LLMs تستخدم أدوات بناءً على تغذية راجعة من البيئة داخل حلقة» — وهذا بالضبط هو المثال البرمجي أعلاه.

التعريف الثاني يضع الحد عند الاستقلال عن المستخدم. تفتتح وثيقة OpenAI، A practical guide to building agents، صفحة التعريف هكذا:

"While conventional software enables users to streamline and automate workflows, agents are able to perform the same workflows on the users' behalf with a high degree of independence. Agents are systems that independently accomplish tasks on your behalf."5

وبعد جملتين، في الصفحة نفسها، تستبعد:

"Applications that integrate LLMs but don't use them to control workflow execution—think simple chatbots, single-turn LLMs, or sentiment classifiers—are not agents."5

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

تحت ذلك تصادم مفردات، وهو يسبب نقاشات في اجتماعات حقيقية. في الوثيقة الأولى، workflow بنية معمارية، وهو الشيء الذي ليس agent. في الثانية، workflow هو «تسلسل خطوات يجب تنفيذها لتحقيق هدف المستخدم» — أي المهمة نفسها، وكل agent لديه واحدة منها. «استبدلنا workflow بـ agent» جملة مفهومة تحت التعريف الأول وقريبة من انعدام المعنى تحت الثاني.

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

تصف مهمة؛ يقرأ الملفات، يشغل مجموعة الاختبارات، يحرر، يشغلها مرة أخرى، ويتوقف عندما تنجح أو عندما يستسلم. لا شيء في شيفرتك يقرر أن الخطوة التالية هي «شغّل الاختبارات» — النموذج يفعل، انطلاقاً مما أعادته الأداة الأخيرة.

التعريف الأول: agent، لأن النموذج يوجّه عمليته الخاصة. التعريف الثاني: agent، لأنه ينجز المهمة باستقلالية، ويتعرف إلى الاكتمال، ويعيد التحكم. كلتا الوثيقتين تستشهدان بهذا الشكل كمثال مركزي.

لكل تذكرة دعم جديدة، ثلاث نداءات نموذج بترتيب ثابت — صنّف، استخرج الحقول، اكتب مسودة الرد — ثم يرسل. لا يختار أي نموذج ما يحدث تالياً؛ حلقة for تفعل. يعمل عند 03:00 ولا يراقبه أحد.

التعريف الأول: ليس agent. إنه prompt chaining، مذكور بالاسم كـ workflow. التعريف الثاني: كلا الجوابين. وفق الجمل الافتتاحية، ينجز مهاماً باستقلالية نيابةً عنك؛ ووفق الرابعة، لا يستخدم النموذج للتحكم في تنفيذ workflow، فيُستبعد. هذا النظام هو سبب قراءة الصفحة كلها بدلاً من الاقتباس المختصر.

دور مستخدم واحد. يقرر النموذج بنفسه هل يبحث قبل الإجابة، ثم يجيب وينتظرك.

التعريف الأول: agent، لأن النموذج يوجّه استخدامه لأدواته ديناميكياً بناءً على نتائج من البيئة، وهذا هو الاختبار المعلن. التعريف الثاني: ليس agent، لأنه لا توجد استقلالية — دور واحد، ثم يعيد التحكم — و«simple chatbots» موجودة في قائمة الاستبعاد بالاسم.

اثنان من الثلاثة يبدلان الجهة. هذا ليس فشلاً لأيٍّ من الوثيقتين. إنه تحذير من نوع اجتماع يتفق فيه شخصان تماماً على ما يفعله النظام، ثم يقضيان ساعة يختلفان على ماذا يسمّيان ذلك.

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

شيفرتك تختار الخطوة التاليةالنموذج يختار الخطوة التالية
شخص يراقب كل دورنموذج داخل form: مصنفات، استخراج، إكمال بدور واحددردشة بأدوات — التعريف الأول يقول agent، والتعريف الثاني يقول لا
لا أحد يراقب حتى تنتهيpipeline — افتتاح التعريف الثاني يقول agent، وجملته الرابعة تقول لاالجميع يتفق: agent

كل تعريف ينازع خلية مختلفة، والخليتان الأخريان ليستا موضع نزاع أصلاً. لذلك عندما تكون التسمية مهمة — في عقد، أو مراجعة مخاطر، أو postmortem — فالجملتان الجديرتان بالكتابة ليستا «هل هو agent» بل من اختار الخطوة التالية ومن كان يراقب. كلتاهما يمكن إجابتها بقراءة الشيفرة، ولا تحتاج أيٌّ منهما إلى تعريف أحد، ومعاً تحملان كل نتيجة كانت التسمية تنوب عنها.

لا شيء من هذا جديد. استعرض Wooldridge وJennings المعاني المتنافسة لـ «agent» في 1995؛6 وسأل Franklin وGraesser سؤال هذا الفصل في 1996، وجمعا التعريفات المتداولة ووجدا أنها تختلف.7 ولا يزال مسح 2023 يعرّف agents من المبادئ الأولى — «كيانات اصطناعية تستشعر بيئتها، وتتخذ قرارات، وتقوم بأفعال»8 — لأنه لم يكن هناك تعريف حديث مستقر يُستشهد به، وتصف CoALA الأجزاء بدلاً من رسم حد أصلاً.9 ثلاثون عاماً من رفض الاتفاق تقول إن الكلمة تؤدي أكثر من وظيفة واحدة.

الآن النتيجة التي تصل قبل الفلسفة، وهي الفاتورة.

كل قياس هنا له الشكل نفسه. النداء الواحد كلف 39 token إدخال؛ والسؤال نفسه مع أداة واحدة كلف 420 عبر نداءين؛ والحلقة بعد إزالة قاعدة توقفها كلفت 1,688 عبر ستة. النمو أسوأ من خطي، لأن الدور n يحمل كل الأدوار السابقة معه: عمود prompt في تشغيل الأدوار الستة يقرأ 187، 238، 261، 302، 327، 373. اشتق الفصل 16 أن المجموع هو Θ(n2)\Theta(n^2) وملاءم المنحنى على محادثة حقيقية. يحول agent كل مهمة إلى تلك المحادثة، سواء رآها إنسان أم لا.

لو ذهبت أعداد token المقاسة هذه إلى endpoint تجاري بالأسعار التي قرأها الفصل 16 في 6 سبتمبر 2026 — $2.00 لكل مليون token إدخال و$12.00 لكل مليون إخراج — لكانت أسعار التشغيلات الأربع كالتالي:

التشغيلنداءات النموذجtoken الإدخالtoken الإخراجالتكلفة
السؤال، بلا أدوات1398$0.000174
السؤال نفسه، أداة واحدة في الفهرس242038$0.001296
سؤال يحتاج إلى الأداة242533$0.001246
الشيء نفسه، مع إزالة قاعدة التوقف61,688124$0.004864

الصف الثاني مقابل الصف الأول هو الرقم الذي يجب حفظه. سبعة أضعاف ونصف التكلفة، مقابل إجابة أسوأ لسؤال كان النموذج يعرفه بالفعل. لم يكن هناك سوء تهيئة: وُجدت أداة، فاستخدمها النموذج — ونتيجة الفصل 18، أن سعر الفهرس لا دقته هو ما يؤلم، تجد هنا أرخص عرض لها بفهرس من أداة واحدة.

لهذا فالجزء المفيد من الوثيقتين هو الجزء الذي يتحدث عن عدم بناء هذا. وثيقة Anthropic صريحة: اعثر على أبسط حل ممكن وأضف التعقيد فقط عند الحاجة، وهذا «قد يعني عدم بناء أنظمة agentic إطلاقاً»، لأن الأنظمة agentic «تبادل الكمون والتكلفة بأداء أفضل للمهام»، و«في كثير من التطبيقات، يكون تحسين نداءات LLM المفردة مع retrieval وأمثلة in-context كافياً عادةً».4 حالتها لصالح agent ضيقة: مشكلات مفتوحة لا يمكنك توقع عدد خطواتها ولا hardcode مسارها، في بيئة تثق بها، مع قبول «تكاليف أعلى، واحتمال أخطاء متراكبة».4 شاشة OpenAI هي الصورة المعكوسة — حكم معقد، مجموعات قواعد لا يمكن صيانتها، بيانات غير مهيكلة — وتنتهي بالطريقة نفسها: «وإلا، فقد يكفي حل حتمي».5

إذن، في تصنيف هذا الفصل: عدد ثابت من الخطوات بترتيب ثابت هو pipeline، وتسميته agent لن تجعله أسرع. إذا كان عدد الخطوات يعتمد على ما تجده في الطريق، فأنت تريد حلقة — وتشتري تلك المرونة بـ N نداءات، وسجل نصي تربيعي، ونظام يمكن أن يخطئ N مرة بدلاً من مرة واحدة.

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

لتلك الحلقة طريقة واحدة للانتهاء: يتوقف النموذج عن طلب أدوات. يكسرها الفصل 23 عمداً، سبع مرات، وكل كسر يضيف قطعة. مهمة مستحيلة، فلا تنتهي أبداً — سقف أدوار. ليلة من التشغيل، فتصل الفاتورة — ميزانية بالدولار. أداة تفشل — خطأ يستطيع النموذج التصرف بناءً عليه. النداء نفسه مرتين — idempotency key. ملف لم يكن ينبغي لمسه — موافقة بشرية. إعادة تشغيل في منتصف الطريق — استمرارية الجلسة. أداة تستغرق ثلاث دقائق في صمت — تقدم وإلغاء. الناتج هو harness، الملف الذي يعمل عليه بقية هذا المساق.

يبقى السؤال الذي كان القطر المختلف عليه في هذا الفصل يدور حوله حقاً. حلقة تقرر خطوتها التالية بنفسها عليها أن تقرر متى تتوقف، وقد شاهدنا للتو ما يحدث عندما لا تستطيع: ستة أدوار، أربعة أضعاف الفاتورة، وagent يستجوب المستخدم عن سؤال كان قد أجاب عنه بالفعل. التوقف ليس شرطاً واحداً. كم شرطاً هناك، وأيها يطلق أولاً؟


مقال Lilian Weng، LLM Powered Autonomous Agents (2023)، هو أشهر تفكيك لـ language agent إلى تخطيط وذاكرة واستخدام أدوات، وهو القراءة التالية المناسبة إلى جانب وثيقتي البائعين؛ مكوناته الثلاثة هي الفصول 23 و24 و18 من هذا المساق بهذا الترتيب.

كل رقم في هذا الفصل أُنتج على هذا الجهاز ولم يُقدَّر أي شيء. الممر، ومخطط الأرضية، وagents الأربعة التي تمشي فيه، وسياسات الدورية الثلاث هي TypeScript أعلاه، شُغّلت على Node 22؛ أرقام agent العشوائي هي متوسطات عبر 2,000 تشغيل مبذور لكل حالة، وأرقام الدورية تشغيلات مبذورة منفردة من 4,000 tick. تأتي traces النموذج من Qwen2.5-0.5B-Instruct بصيغة float32 على CPU مع فك ترميز جشع، مخدومة عبر loopback بواسطة endpoint محلي صغير في Python يحمّل الأوزان ويتحدث بصيغة OpenAI chat-completions — الوصلة نفسها مرة أخرى، مع tensors على جهة Python والحلقة على جهة TypeScript — لذلك أعداد token هي tokenizer ذلك النموذج، والكمونات هي كمونات ذلك الجهاز. الأرقام الوحيدة المأخوذة من مكان آخر هي السعران في جدول التكلفة، وهما الأسعار التي قرأها الفصل 16 من صفحة تسعير OpenAI في 6 سبتمبر 2026، مطبقة هنا على أعداد token مقاسة محلياً كإيضاح لا كفاتورة مرصودة.

  1. Russell, S. وNorvig, P. Artificial Intelligence: A Modern Approach، الطبعة الرابعة، الفصل 2، Intelligent Agents. مصدر عالم المكنسة، ومواصفة PEAS، وتعريف العقلانية نسبةً إلى مقياس أداء، والخصائص السبع لبيئات المهام، وأنواع agent الخمسة المستخدمة هنا، والملاحظة أن الحلقات اللانهائية غالباً لا يمكن تفاديها لدى simple reflex agents في بيئات قابلة للملاحظة جزئياً. الشيفرة المصاحبة للكتاب هي aimacode/aima-python على GitHub (8,806 نجمة، آخر دفع 30 يونيو 2026، قُرئت 7 سبتمبر 2026) — ومن المهم تسميتها بدقة على ما هي عليه. إنها repository مصاحبة لكتاب، لا reference implementation تبني عليها مشاريع أخرى كما تفعل karpathy/micrograd (17,412) وkarpathy/nanoGPT (62,852). لهذا يستشهد بها هذا الفصل ويربطها بدلاً من ترجمتها، ولهذا لا تنطبق هنا حجة المنظومة التي أبقت الفصل 5 في Python: لا يلمس شيء في هذا الفصل tensor، والحلقة المكتوبة أعلاه هي السلف المباشر لحلقة الفصل 23. 2 3 4 5

  2. Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. وCao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). التداخل بين آثار reasoning والأفعال الذي يشير إليه صف goal-based في جدول المطابقة.

  3. Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. وYao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). ملخص الورقة نفسه للآلية هو سبب مطابقتها لـ learning agent: فهي تعزز agents «ليس بتحديث الأوزان، بل من خلال تغذية راجعة لغوية»، مع agents «تتأمل لفظياً في إشارات تغذية راجعة للمهام، ثم تحتفظ بنصها التأملي في مخزن ذاكرة episodic لتحفيز اتخاذ قرار أفضل في المحاولات اللاحقة». 2

  4. Anthropic، Building effective agents، 19 ديسمبر 2024، anthropic.com/engineering/building-effective-agents، قُرئت 7 سبتمبر 2026. مصدر تمييز workflow/agent المقتبس أعلاه، ومصطلح «agentic systems» الجامع، ووصف agents بأنها «عادةً ليست إلا LLMs تستخدم أدوات بناءً على تغذية راجعة من البيئة داخل حلقة»، والإرشاد إلى العثور على أبسط حل ممكن وأن هذا «قد يعني عدم بناء أنظمة agentic إطلاقاً»، والحالة المؤيدة والمعارضة لـ agents، بما في ذلك «تكاليف أعلى، واحتمال أخطاء متراكبة» والتوصية بشروط توقف «مثل حد أقصى لعدد التكرارات» للحفاظ على التحكم. 2 3

  5. OpenAI، A practical guide to building agents، الصفحات 4 إلى 7، قُرئت 7 سبتمبر 2026. مصدر «Agents are systems that independently accomplish tasks on your behalf»، واستبعاد «simple chatbots, single-turn LLMs, or sentiment classifiers»، وتعريف workflow بأنه «تسلسل خطوات يجب تنفيذها لتحقيق هدف المستخدم»، والخاصيتين الجوهريتين لـ agent، والمكونات الثلاثة — النموذج، الأدوات، التعليمات — ومعايير الفرز عند تقرير متى تبني واحداً، منتهياً بـ «otherwise, a deterministic solution may suffice». 2 3

  6. Wooldridge, M. وJennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review، المجلد 10، العدد 2 (1995). المسح الذي قسم استخدام المجال إلى مفهوم ضعيف للـ agency — الاستقلالية، والقدرة الاجتماعية، والتفاعلية، والمبادرة — ومفاهيم أقوى تستعير مفردات ذهنية. عند قراءته اليوم، هو سجل للحجة نفسها التي لا تزال وثيقتا هذا الفصل تخوضانها.

  7. Franklin, S. وGraesser, A. Is It an Agent, or Just a Program? A Taxonomy for Autonomous Agents. Proceedings of the Third International Workshop on Agent Theories, Architectures, and Languages، Springer (1996). يُستشهد به هنا على ما هو لا لاقتباس: مسح جمع تعريفات «agent» المتداولة حينها، ووجد أنها تختلف، واقترح taxonomy لتحل محل الحجة. بعد ثلاثين عاماً، الحجة موجودة في توثيق أفضل تصميماً، وهي بخلاف ذلك لم تتغير.

  8. Xi, Z. وآخرون. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). اقتُبس أعلاه لتعريفه الافتتاحي، «AI agents are artificial entities that sense their environment, make decisions, and take actions»، وهو تعريف الكتاب الدراسي معاداً في 2023 لأنه لم يكن هناك تعريف حديث متفق عليه يُستشهد به.

  9. Sumers, T. R., Yao, S., Narasimhan, K. وGriffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). تنظّم language agents بوصفها «مكونات ذاكرة معيارية، وفضاء أفعال منظماً للتفاعل مع الذاكرة الداخلية والبيئات الخارجية، وعملية اتخاذ قرار معممة لاختيار الأفعال»، وتضعها صراحةً في تاريخ AI الرمزي والعلوم المعرفية. يعود تصنيف الذاكرة في الفصل 24، حيث يكون جدول المخازن الثلاثة ظله العملي.

هل أنت مستعد لتترك الاختيار لـ LIA؟

ابنِ بكل نماذج الذكاء الاصطناعي في مكان واحد — ابدأ مجانًا اليوم.