كم مقدار الذاكرة التي يحتاجها وكيلك فعليًا؟

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

القراءة الصوتية غير متاحة في هذا المتصفح
كم مقدار الذاكرة التي يحتاجها وكيلك فعليًا؟

الوسوم

ملخص سريع

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

بعد عامٍ من تحوّل الوكلاء الذين يستخدمون الأدوات إلى الطريقة الافتراضية للبناء على نماذج اللغات الكبيرة، ما زال سؤال واحد يُجاب عليه بالعادة لا بالقياس: كم من الذاكرة ينبغي أن يحتفظ بها الوكيل؟ تبدأ معظم الفرق بقرارٍ واحد يناسب الجميع — "امنحه المحادثة كاملة" أو "خزّن كل شيء في فهرس متجهي" — ولا يكتشفون الكلفة إلا بعد أن تبدأ نافذة السياق في إملاء سلوك الوكيل. الذاكرة ليست موردًا تضيفه في مرحلة متأخرة من المشروع؛ بل هي ميزانية تخصصها منذ المطالبة الأولى. السؤال العملي ليس ما إذا كان وكيلك يمتلك ذاكرة، بل كم يحتاج من كل نوعٍ منها، وكيف ستعرف ذلك.

هرم الذاكرة: لماذا السعة ليست موحّدة

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

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

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

أربعة أعباء على الميزانية نفسها

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

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

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

العبء العرضي هو ذاكرة الوكيل لما جرّبه بالفعل وما كانت النتيجة. بعضه ضروري — لا تريد أن يكرر الوكيل نهجًا فاشلًا. لكن معظمه يمكن ضغطه في سطر واحد: "جرّب SSH مباشرة، فشل بسبب خطأ صلاحيات، تحوّل إلى API".

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

عندما يسأل الممارسون "كم ذاكرة يحتاج وكيلي؟"، فإنهم يسألون عادةً عن مجموع هذه الأعباء. الجواب المفيد هو تفصيل، لا إجمالي.

ما تخبرنا به ALTK-Evolve من IBM Research

السؤال ليس مجرد مصدر قلق نظري. في 18 أغسطس 2026، نشرت IBM Research منشورًا بعنوان "كم ذاكرة يحتاج وكيلك فعلًا؟" على مدونة Hugging Face، ضمن مبادرة ALTK-Evolve. العنوان وحده جدير بالملاحظة: مجموعة بحثية صناعية سألت صراحةً عن مقدار أهمية الذاكرة، بدلًا من افتراض أن الأكثر هو الأفضل.

لن أُلخّص هنا ادعاءات منشور المدونة واحدًا تلو الآخر، لأن الغرض من هذا المقال هو إعطائك أداة عملية، لا ملخصًا. الخلاصة ذات الصلة، كما قرأتها، هي أن متطلبات الذاكرة ليست ثابتة. الوكيل الذي يفتح أدوات جديدة أو يحصل على إمكانية الوصول إلى مستودعات جديدة سيغيّر نسبة عبء مخرجات الأدوات إلى العبء المحادثي. إعداد الذاكرة السخي وقت النشر يصبح مُبذّرًا بعد تطوّر أدوات الوكيل. اسم المشروع "ALTK-Evolve" يوحي بالضبط بهذه النظرة التطورية: يجب ضبط الذاكرة باستمرار، لا ضبطها مرة واحدة.

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

المتطلبات

قبل أن تتمكن من قياس ذاكرة وكيلك، تحتاج إلى أربعة أشياء:

  1. الوصول إلى تدفق طلبات الوكيل — يجب أن تكون قادرًا على تسجيل كل تبادل بين الوكيل وأدواته والنموذج. عمليًا، هذا يعني غلافًا صغيرًا حول حلقة الوكيل الحالية، أو خطاف تسجيل إذا كان إطار العمل يوفر واحدًا.
  2. طريقة لتقدير عدد الرموز — عادةً ما يكشف SDK الخاص بموفر LLM عن بيانات usage في كائن الاستجابة. إذا لم يكن كذلك، استخدم قاعدة تقريبية: احسب الأحرف واقسم على أربعة للنصوص الإنجليزية، أو استخدم مُرمِّز موفرك.
  3. بيئة Python — أداة القياس أدناه تستخدم المكتبة القياسية فقط بالإضافة إلى حزمة تحقق صغيرة واحدة، لذا تعمل في أي إعداد Python 3.9+.
  4. أعباء عمل ممثلة — قِس عبر مهام حقيقية، لا اصطناعية. تدقيق ذاكرة وكيل الإجابة على الأسئلة لن يبدو أبدًا مثل تدقيق وكيل برمجة.

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

التركيب خطوة بخطوة: بناء عداد ذاكرة

الأداة التي سنبنيها صغيرة عمدًا: مسجّل يوثّق كل حدث متعلق بالذاكرة في دورة حياة الوكيل ويطبع ملخصًا عن أين ذهبت الرموز. إنه لا يستبدل ذاكرة وكيلك الحالية؛ بل يراقبها.

أولًا، أنشئ مجلدًا مخصصًا لتبقى أداة القياس معزولة عن الوكيل الذي تدقّقه.

mkdir agent-memory-meter && cd agent-memory-meter

بعد ذلك، أنشئ بيئة افتراضية لإبقاء تبعيات Python بعيدة عن مترجم النظام.

python -m venv .venv

فعّل البيئة. على macOS و Linux، استخدم الأمر source.

source .venv/bin/activate

إذا كنت على Windows، يختلف الأمر قليلًا؛ استخدم سكربت التفعيل داخل مجلد Scripts بدلًا من ذلك. بمجرد تفعيل البيئة، ثبّت تبعية واحدة للتحقق من البيانات.

pip install pydantic

الآن أنشئ سكربت القياس. يعرّف سجل MemoryEvent ومسجّلًا يجمع الأحداث.

# كم ذاكرة يحتاج وكيلك فعلًا؟
import json
import time
from pydantic import BaseModel


class MemoryEvent(BaseModel):
    timestamp: float
    step: int
    kind: str            # "user", "tool_output", or "assistant"
    tokens_in: int       # رموز المطالبة التقريبية التي يستهلكها هذا الحدث
    tokens_out: int      # رموز الإكمال التقريبية المنتجة
    payload_chars: int   # طول الحمولة الخام بالأحرف


class MemoryLogger:
    def __init__(self):
        self.events = []

    def record(self, step, kind, tokens_in, tokens_out, payload):
        self.events.append(MemoryEvent(
            timestamp=time.time(),
            step=step,
            kind=kind,
            tokens_in=tokens_in,
            tokens_out=tokens_out,
            payload_chars=len(payload),
        ))

    def summary(self):
        total_prompt = sum(e.tokens_in for e in self.events)
        total_completion = sum(e.tokens_out for e in self.events)
        total_chars = sum(e.payload_chars for e in self.events)
        return {
            "events": len(self.events),
            "total_prompt_tokens": total_prompt,
            "total_completion_tokens": total_completion,
            "payload_kb": round(total_chars / 1024, 2),
        }


def main():
    log = MemoryLogger()
    log.record(1, "user", 120, 0, "List all open issues assigned to me")
    log.record(2, "tool_output", 0, 0,
               '{"issues": [{"id": 12, "title": "fix login", "assignee": "ada"}]}')
    log.record(3, "assistant", 0, 240,
               "There is one open issue assigned to you: fix login.")
    print(json.dumps(log.summary(), indent=2))


if __name__ == "__main__":
    main()

يسجّل السكربت ثلاثة أنواع من الأحداث: رسالة مستخدم، ومخرج أداة، وردّ مساعد. في وكيلك الحقيقي، ستستدعي log.record عند تلك النقاط، باستخدام أعداد الرموز التي يُرجعها مزوّد النموذج الخاص بك. شغّل السكربت لتأكيد أن الأداة تعمل.

python memmeter.py

يجب أن ترى ملخص JSON بأعداد الأحداث وإجماليات الرموز وحجم الحمولة بالكيلوبايت. ستكون الأرقام صغيرة لهذا المثال التجريبي؛ القيمة تأتي عندما تصل المسجّل بوكيل حقيقي.

أمثلة الاستخدام: قراءة الأرقام

بمجرد توصيل المسجّل بوكيلك، اتركه يعمل على مجموعة ممثلة من المهام. بعد بضع جلسات، افحص الملخص واسأل أربعة أسئلة.

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

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

هل مخرجات الإكمال كبيرة؟ غالبًا ما تُعاد استجابات المساعد الكبيرة حرفيًا في خطوات لاحقة من المحادثة. إذا كانت رموز الإكمال تهيمن على الملخص، فإن وكيلك يتحدث إلى نفسه أكثر مما يتحدث إلى المستخدم. قلّم مخرجات سلسلة التفكير قبل إلحاقها بالنص.

كم من نافذة السياق ستستهلك هذه الإجماليات؟ قارن الإجماليات المقاسة بحد السياق للنموذج الذي تنشره. إذا كنت عند 10% من الحد، فلديك مساحة إضافية، ولا ينبغي إضافة مخزن ذاكرة خارجي بعد. إذا كنت عند 90%، فإن الحل هو الاختزال قبل التوسيع — اضغط مخرجات الأدوات أولًا، ثم فكّر فقط في مخزن طويل الأمد للحقائق التي تبقى عبر الجلسات.

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

لماذا الجواب الافتراضي خاطئ في العادة

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

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

لهذا السبب أيضًا المنظور الذي تقدمه ALTK-Evolve مهم. مع تطوّر الوكيل — أدوات جديدة، ومصادر بيانات جديدة، وعادات مستخدم جديدة — يتغير ملف الذاكرة. إعداد مضبوط لوكيل بأداتين سيكون خاطئًا لوكيل بعشر أدوات. الممارسة المستدامة الوحيدة هي إبقاء العداد متصلًا، وتشغيله دوريًا، والسماح للأرقام بقيادة التخصيص.

الخاتمة

حاجة وكيلك إلى الذاكرة ليست رقمًا واحدًا يمكنك البحث عنه أو قياسه مرة واحدة. إنها توزيع عبر المحادثة ومخرجات الأدوات والتاريخ العرضي والسياق الثابت — وهذا التوزيع يتحول مع تغيّر الوكيل. الجواب العملي على "كم ذاكرة يحتاج وكيلك فعلًا؟" هو: يكفي لإكمال المهمة دون إعادة جلب البيانات نفسها، ولا أكثر. الطريقة الوحيدة لإيجاد تلك النقطة هي القياس.

المسجّل الخفيف المقدَّم هنا يعطيك خطًا أساسيًا في دقائق. اربطه بوكيلك، واجمع البيانات من أعباء عمل حقيقية، وتصرّف بناءً على التفصيل: اضغط مخرجات الأدوات، وأزل تكرار الأحداث، واختزل قبل أن توسّع. وكما يوحي سؤال IBM Research على مدونة Hugging Face، تستحق الذاكرة نفس المعاملة التجريبية التي يحصل عليها أي جزء آخر من النظام. عالجها كميزانية يجب قياسها، لا كميزة يجب تعظيمها، وسيعمل وكيلك أسرع، ويكلف أقل، ويفكر فيما يهم فعلًا.

المصادر