سياق الأدوات وتخزين المطالبات مؤقتًا
في كل طلب يرسله الإطار المضمّن أمران: تعريفات الأدوات أكبر كلفة ثابتة فيه، ولن يُستخدم منها إلا أقل القليل. تشرح هذه الصفحة ما يفعله Control Center في ذلك، ولماذا لا يكفي الجواب «أرسِل أدوات أقل».
المشكلة في الانتباه لا في البايتات
قسم بعنوان “المشكلة في الانتباه لا في البايتات”يسجّل Control Center نحو 126 أداة. إن أُرسلت تعريفاتها كاملة كلفت نحو 23,000 رمز في كل طلب، وهي كلفة لا يطالها الضغط، لأن تعريفات الأدوات تسير في جزء من الطلب منفصل عن المحادثة.
فاتورة الرموز هي الشكوى الظاهرة، ومع تخزين المطالبات مؤقتًا تصير الشكوى الأصغر أيضًا. الكلفة الحقيقية هي دقة الاختيار. تتفق التقييمات المنشورة لاستدعاء الأدوات على أن النماذج تختار الأداة الصحيحة بثبات حتى نحو 30–50 أداة في السياق، ثم يضعف أداؤها تدريجيًا بعد ذلك. السبب الذي تسمّيه هذه التقييمات ليس عدد الرموز بل التداخل الدلالي: متى ضمّ الفهرس عدة أدوات تُقرأ أوصافها متشابهة، صار النموذج يختار بين أشباه لا يستحضر قدرة.
ومع 126 أداة يكون الوكيل قد جاوز ذلك النطاق بمسافة في كل جولة بلا استثناء، ومنها جولات كثيرة لم يحتج فيها إلا إلى قراءة ملف.
السطح ذو الطبقتين
قسم بعنوان “السطح ذو الطبقتين”لذلك يُعرض على التشغيل شيئان:
- مجموعة مقيمة: نحو عشرين أداة، تُرسل بمخططاتها الكاملة في كل طلب؛
- فهرس أسماء لكل ما عداها، يُجمَّع تحت عناوين مثل “Tickets and projects” أو “Memory and knowledge”، بكلفة بضع مئات من الرموز للفهرس كله.
والقياس على فهرس الأدوات الحالي يهبط بكتلة الأدوات من نحو 23.1k رمز إلى نحو 5.0k، أي أصغر بنحو 78%، ويُدخل المجموعة الظاهرة دائمًا في النطاق الذي يكون فيه الاختيار موثوقًا.
المجموعة المقيمة هي ما يستخدمه التشغيل في معظم التشغيلات: مفردات الملفات والصدفة (read وwrite وedit وsearch وbash، …)، وأدوات الاكتشاف، وقائمة المهام، والبحث في الذاكرة، وفعل الإخراج الذي يجب أن يستدعيه الوضع الحالي ليسلّم ناتجه. فعل الإخراج الخاص بالوضع مقيم دائمًا، فلا يُضطَر التشغيل إلى البحث عن الاستدعاء الوحيد الذي يُخرج ما يسلّمه.
التأجيل لا يعني عدم الإتاحة
قسم بعنوان “التأجيل لا يعني عدم الإتاحة”هذا الجزء هو ما يجعل التصميم آمنًا لا رخيصًا وحسب. الأداة المؤجَّلة قابلة للاستدعاء من الجولة الأولى. ما يُحجب هو مخططها لا غير.
يرى الوكيل الاسم في مطالبته. إن استدعى ذلك الاسم مباشرة، حمّل الإطار المخطط وشغّل الأداة في الخطوة نفسها، بلا خطأ وبلا جولة زائدة. لا يحتاج النموذج إلى أن يعرف أن الأداة كانت «غير محمّلة» يومًا.
وحين يعرف الوكيل المهمة ويجهل الاسم، يأخذ search_tools وصفًا بلغة عادية («أسند تذكرة إلى شخص»)، ويرتّب سطح التشغيل كله، ويعيد المطابقات مع مخططاتها محمّلة سلفًا، فتستطيع الجولة التالية أن تستدعي إحداها. إن لم يجد البحث شيئًا، قال ذلك بصراحة واقترح صياغة أخرى أو بحثًا أوسع، عن قصد: الوكيل الذي يقرأ نتيجة فارغة على أنها «هذه القدرة غير موجودة» يخترع بديلًا بدل أن يبحث من جديد.
search_tools موجود في الإطار المضمّن وحده. ولدى عملاء MCP الخارجيين search_tool_bm25 بدلًا منه، يرتّب الفهرس نفسه ويكتفي بوصف المطابقات. هؤلاء العملاء تلقّوا كل المخططات من tools/list، فلا شيء يُحمَّل.
ما لا يفعله التأجيل
قسم بعنوان “ما لا يفعله التأجيل”يُطبَّق التأجيل بعد مرشّح أدوات الوضع، لا بدلًا منه. يخفي مخططًا، ولا يستطيع كشف أداة منعها الوضع. والأداة المفعَّلة تمرّ بطلب الموافقة وبضوابط الإجراء كما تمرّ بهما الأداة المقيمة تمامًا، ولا تستطيع أداة أن تحمّل اسمًا لم يكن على سطح التشغيل من الأصل.
سطح MCP الذي يراه العملاء الخارجيون لا يتأثر. وما زال tools/list يعيد فهرس الأدوات كاملًا. محاولة سابقة لقصّه عطّلت الوكلاء تمامًا: عملاء MCP يطابقون أسماء الأدوات مع قائمتهم المخزَّنة، ويرفضون ما ليس في القائمة من غير أن يسألوا الخادم، فكانت الأداة «المخفية والقابلة للاستدعاء» بعيدة المنال. التأجيل مكانه الإطار، وتحميل أداة في منتصف التشغيل شيء يستطيع الإطار أن يفعله فعلًا.
إيقاف التأجيل
قسم بعنوان “إيقاف التأجيل”--tool-deferral=off (أو CC_SERVER_TOOL_DEFERRAL=off) يعيد كل أداة قُبلت إلى المجموعة المقيمة، ويُنتج الطلبات عينها التي كان الخادم يرسلها قبل وجود التأجيل. انظر مرجع واجهة سطر أوامر cc_server.
تخزين المطالبات مؤقتًا
قسم بعنوان “تخزين المطالبات مؤقتًا”أحمال الوكلاء مائلة: مطالبة ضخمة في الإرسال وإجابة صغيرة في العودة، جولة بعد جولة، بالبادئة نفسها كل مرة. يخزّن المزوّدون تلك البادئة، وقراءة المخزَّن تكلف نحو عُشر القراءة الجديدة. معدّل الإصابة إذن خاصية من خصائص الإطار، لا تحسين يُلحق به. وعلى Anthropic يرفع ذلك الإنتاجية أيضًا، لأن الرموز المخزَّنة مؤقتًا لا تُحتسب ضمن حد الإدخال في الدقيقة.
يعمل التخزين المؤقت على مطابقة تامة للبادئة، ومن ذلك تخرج قاعدة واحدة تحكم الباقي.
لا تُعِد كتابة ما أُرسل
قسم بعنوان “لا تُعِد كتابة ما أُرسل”أي بايت يتغيّر يُبطل الذاكرة المؤقتة من تلك النقطة فصاعدًا. لذلك لا يفعل الإطار إلا الإلحاق: رسائل جديدة في آخر الطلب، ومخططات الأدوات التي فُعّلت للتو تُوضع بعد كتلة الأدوات المخزَّنة ولا تُدمج فيها. هذا الترتيب هو سبب رخص التفعيل: تبقى البادئة المخزَّنة على حالها، ولا يدفع التشغيل إلا ثمن المخططات التي حمّلها للتو.
وتغفل الحلقة أيضًا مخرجات الأدوات البالية من الجولات الأقدم لتسترد سعة من السياق. تنتظر حتى يبلغ ما يُسترد حدًا يستحق إعادة الكتابة، فيصير الإغفال إعادة كتابة عميقة نادرة، لا إخفاقًا متواصلًا في الذاكرة المؤقتة.
أين تُوضع نقاط القطع
قسم بعنوان “أين تُوضع نقاط القطع”يسمح المزوّد بعدد محدود من علامات التخزين المؤقت، وينفقها Control Center عن قصد:
| العلامة | تغطي | مدة البقاء |
|---|---|---|
| آخر أداة مقيمة | كتلة الأدوات | ساعة واحدة |
| آخر كتلة نظام | الأدوات + موجّه النظام | ساعة واحدة |
| ذيل الجولة السابقة | السجل حتى آخر طلب | 5 دقائق |
| ذيل الجولة الحالية | السجل كاملًا | 5 دقائق |
العلامتان الأخيرتان زوج متحرّك، وعلّة الزوج خفية: البحث في الذاكرة المؤقتة يرجع إلى الوراء عددًا محدودًا من الكتل، بحثًا عما خزّنه طلب سابق. جولة واحدة تشغّل أدوات كثيرة بالتوازي قد تُخرج كتلًا أكثر من تلك النافذة، فتخفق عندها علامة ذيل واحدة في صمت، ويدفع الطلب السعر كاملًا، ولا شيء في الاستجابة يقول ذلك. وسم الموضع الذي توقف عنده الطلب السابق يجعل الإصابة بنيوية لا حالة تسابق.
تأخذ بادئة الأدوات وموجّه النظام المدة الطويلة لأنها ثابتة طوال التشغيل، ويشترك فيها كل تشغيل وكل وكيل فرعي من الشكل نفسه، ولأن الساعة تبدأ حين يبدأ الطلب. جولة تبث عدة دقائق تكون قد أنفقت معظم النافذة القصيرة قبل أن يتكوّن الطلب التالي.
الوكلاء الفرعيون يشتركون في بادئة واحدة
قسم بعنوان “الوكلاء الفرعيون يشتركون في بادئة واحدة”الوكلاء الفرعيون من النوع نفسه يُنتجون بادئات مطالبة متطابقة بايتًا ببايت، فيُفترض أن يقرأوا مدخلًا واحدًا في الذاكرة المؤقتة، لا أن يكتب كل منهم مدخله. لكن المدخل لا يصير مقروءًا إلا حين يبدأ الطلب الذي كتبه بالاستجابة، فالتفريع الذي ينطلق دفعة واحدة يجعل كل ابن يدفع السعر الكامل لبادئة تجمعهم جميعًا.
يدع الإطار الابن الأول من شكل معيّن يبدأ، ثم يُطلق أشقاءه ما إن يبدأ ذلك الابن البث. والانتظار محدود: ابن أول بطيء يضيّع إصابة الذاكرة المؤقتة، ولا يوقف التفريع نفسه. وللسبب نفسه يحصل كل وكيل فرعي على مجموعة الأدوات المقيمة ذاتها، أيًا كان ملف تعريفه. تغييرها بحسب الملف يفتّت البادئة المشتركة بلا كسب، فالملف قد حسم ما يجوز للابن أن يستدعيه.
مراقبته أثناء العمل
قسم بعنوان “مراقبته أثناء العمل”الشقان مرصودان، لا مفترضان:
- يعرض السياق في المحادثة الأدوات المقيمة، وفهرس المؤجَّل، وما كان سيكلّفه كل مخطط محجوب، وهو مبني من مسار الشفرة نفسه الذي يستخدمه التشغيل الحقيقي.
- يسجّل كل تشغيل الأدوات المؤجَّلة التي حمّلها وما الذي أطلق التحميل، فيبقى البحث الذي لا يجد شيئًا ظاهرًا بوصفه إخفاق استرجاع، ولا يختفي داخل وكيل يمضي بهدوء إلى عمل مجاور.
- تعرض قابلية الملاحظة معدل الذاكرة المؤقتة على أنه قراءات الذاكرة المؤقتة منسوبة إلى كل رموز المطالبة التي عُولجت، وكتابات الذاكرة المؤقتة داخلة في الحساب. التشغيل الذي يواصل إعادة بناء بادئته يسجّل معدّلًا منخفضًا، لا معدّل تشغيل لم يحتج إلى الذاكرة المؤقتة أصلًا.