ما هي تقنية Chain of Recall؟ وكيف تمنح المعرفات الثابتة وكلاء الذكاء الاصطناعي الذاكرة
ما هي تقنية Chain of Recall؟ وكيف تمنح المعرّفات الثابتة وكلاء الذكاء الاصطناعي الذاكرة تُعد تقنية "سلسلة الاسترجاع" (Chain of Recall) وسيلةً لمنح وكيل الذكاء الاصطناعي طويل الأمد ذاكرةً فعّالة دون تكديس كل شيء داخل نا
ما هي تقنية Chain of Recall؟ وكيف تمنح المعرّفات الثابتة وكلاء الذكاء الاصطناعي الذاكرة
تُعد تقنية "سلسلة الاسترجاع" (Chain of Recall) وسيلةً لمنح وكيل الذكاء الاصطناعي طويل الأمد ذاكرةً فعّالة دون تكديس كل شيء داخل نافذة السياق الخاصة به. إذ يحصل كل Trigger وThread وWorker على معرّف ثابت (stable ID)، ولا يحتفظ السياق سوى بالمعرّفات وملخصات موجزة والرسائل المجاورة، ثم يتتبع الوكيل الروابط بين هذه المعرّفات لجلب الوقائع القديمة في خطوات معدودة.
يعود هذا المصطلح إلى مقال تصميمي نشره DeepSeek Harness بعنوان "Exploring Super-agent Design" بتاريخ 01-11-2026. وتجدر الإشارة هنا إلى تنبيه مهم قبل المتابعة: يصف المقال بنية معمارية وليس ميزة مطروحة للاستخدام المباشر؛ إذ توجد أجزاء منها ضمن إضافة نموذج أولي dsh-superagent-prototype، يصفها المؤلفون بأنها "ليست منتجاً رسمياً من DeepSeek". فلا يوجد مفتاح تفعيل لـ Chain of Recall يمكنك تشغيله ببساطة، بل هو نمط تصميمي تبنيه بنفسك.
مشكلة نافذة السياق في الوكلاء طويلي الأمد
يصل الوكيل طويل الأمد سريعاً إلى الحد الأقصى لسياقه نظراً لأن تدفق المهام لا يتوقف أبداً. فالوكيل الفائق (super-agent) الذي يراقب المحادثات ومنصة GitHub وأنظمة التكامل المستمر (CI) يستقبل مئات الأحداث يومياً، ومن المستحيل أن تستوعب النافذة التي احتوت مهام الأمس مهام اليوم أيضاً.
وتأتي الحلول المعتادة بتكلفة مقابلة في كل مرة:
- الاحتفاظ بكل شيء: تمتلئ النافذة وترتفع التكلفة مع كل جولة حوار.
- تلخيص الجولات القديمة: يُسقط التلخيص تفاصيل حاسمة، مثل نص الخطأ الدقيق أو رقم طلب السحب (PR) الذي قد تحتاجه لاحقاً.
- الاسترجاع بناءً على التشابه: ينجح هذا الأسلوب حتى تصادف حقيقة تحتاجها ولكن صياغتها لا تشبه نص استعلامك.
يُعرّف دليل شركة Anthropic حول هندسة السياق لوكلاء الذكاء الاصطناعي السياقَ بأنه مورد محدود يتطلب إدارة وتنقية دقيقة. ويُعد نمط Chain of Recall إحدى الطرق العملية لتحقيق هذه التنقية، بينما يغطي مقالنا التوضيحي حول آلية عمل ذاكرة وكلاء الذكاء الاصطناعي مجموعة أوسع من الخيارات المتاحة.
التضمين المباشر مقابل الإزاحة: السياق كذاكرة تخزين مؤقت
يتعامل المقال مع نافذة السياق كذاكرة تخزين مؤقت (cache) عبر آليتين:
- التضمين المباشر (Inline): الاحتفاظ بما يُرجح أن يحتاجه الوكيل فوراً داخل السياق: المعرّفات، والملخصات القصيرة، والرسائل المجاورة.
- الإزاحة إلى الخارج (Spill): اقتطاع كل ما عدا ذلك مع ترك مؤشر يمكن للوكيل تتبعه لاحقاً عند الحاجة.
العنصر المُزاح (spilled) لا يُحذف نهائياً، بل يبقى مؤشره فقط داخل نافذة المطالبة (prompt).
إليك كيف يبدو ذلك عند وصول إشعار بفشل التكامل المستمر (CI) إلى الموجّه (Router). هذا النموذج للتوضيح فقط، وليس من شيفرة DeepSeek الأصلية:
{
"trigger_id": "trg_8f21",
"source": "github.check_run",
"thread_id": "thr_pr_412",
"summary": "CI failed on PR #412: 3 of 118 tests red in payments/",
"neighbours": ["trg_8f1c: review comment asking for retry logic"],
"spilled": {
"full_log": "GET /triggers/trg_8f21/payload (41 KB, truncated)"
}
}
إذا كان الملخص المكوّن من سطر واحد كافياً، فلن يستهلك الوكيل تكلفة سجل الأحداث البالغ حجمه 41 كيلوبايت. أما إذا احتاج إليه، فسيجلبه ببساطة باستخدام المعرّف (ID).
المعرّفات الثابتة ومخطط الإسناد المرجعي
تعتمد آلية Chain of Recall على ثبات المعرّفات وعدم تغيّرها أبداً. وفي تصميم المقال، تحمل ثلاثة أنواع من الكائنات هذه المعرّفات:
| الكائن | ما هو | مثال للمعرّف |
|---|---|---|
| Trigger | حدث وارد واحد: رسالة محادثة، أو خطاف ويب (webhook)، أو استدعاء من التكامل المستمر (CI callback) | trg_8f21 |
| Thread | سلسلة من الأحداث المرتبطة بطلب سحب (PR) محدد، أو موضوع محادثة فورية، أو سلسلة رسائل بريد إلكتروني | thr_pr_412 |
| Worker | جلسة وكيل مستقلة ومعزولة تتولى تنفيذ مهمة واحدة | wkr_77a0 |
ينتمي كل Trigger إلى Thread، وتعود ملكية الـ Thread إلى عامل واحد (Worker) أو أكثر، بينما يُشير تقرير الـ Worker إلى الـ Triggers التي تعامل معها. وتُشكّل هذه الروابط مخطط إسناد مرجعي (reference graph)، ويمثل هذا المخطط ذاكرة الوكيل الفعلية.
يتم الاسترجاع عبر تتبع الروابط خطوة بخطوة، بدلاً من تحميل سجل الأحداث كاملاً أو البحث عن نصوص متشابهة. ويشرح الدليل المكمّل حول كيفية بناء وكيل فائق موضع كل من Triggers وThreads وWorkers ضمن التصميم المتكامل للموجّه والعمال (Router and Worker).
شرح عملي للاسترجاع متعدد الخطوات
لنفترض أن زميلاً في الفريق سأل الموجّه يوم الجمعة: "لماذا أضفنا منطق إعادة المحاولة (retry logic) إلى عميل المدفوعات؟". دارت المناقشة الأصلية يوم الثلاثاء وتمت إزاحتها وتخزينها خارجياً منذ فترة طويلة. إليك كيف يتم التتبع:
-
الخطوة 1: العثور على الـ Thread. لا يزال سياق الموجّه يحتفظ بمدخل فهرس من سطر واحد:
thr_pr_412: payments retry PR, merged Wed. فيقوم باستدعاءGET /threads/thr_pr_412. -
الخطوة 2: العثور على الـ Worker. يُظهر سجل الـ Thread القائمة
owner_workers: ["wkr_77a0"]. فيستدعي الموجّهGET /workers/wkr_77a0ويقرأ تقريره النهائي. -
الخطوة 3: معرفة السبب. يُشير التقرير إلى
trg_8f21، وهو فشل التكامل المستمر (CI). فيجلب الموجّه حمولة هذا الـ Trigger ويقرأ أخطاء انتهاء المهلة (timeout) في السجل. - الإجابة: "فشل التكامل المستمر في PR #412 بسبب 3 أخطاء انتهاء مهلة في المدفوعات يوم الثلاثاء. قام العامل wkr_77a0 بإضافة منطق إعادة المحاولة مع تراجع تدريجي (backoff)، ودُمج طلب السحب يوم الأربعاء."
ثلاث عمليات جلب دقيقة ومحددة للغاية؛ لم يكن هناك أي تخمين، ولم يبقَ أي شيء شاغلاً لنافذة المطالبة لمدة ثلاثة أيام.
مقارنة بين Chain of Recall والذاكرة المتجهية والتلخيص التراكمي
لا تحل آلية Chain of Recall محل تقنيات الذاكرة الأخرى، بل تُجيب عن سؤال مختلف؛ فالاسترجاع المتجهي، الذي اشتهر بفضل ورقة التوليد المعزز بالاسترجاع (RAG)، يسأل: "ما الذي يشبه هذا؟"، في حين تسأل Chain of Recall: "ما الذي يرتبط بهذا؟".
| Chain of Recall | الذاكرة المتجهية (RAG) | التلخيصات التراكمية | خوادم MCP للذاكرة | |
|---|---|---|---|---|
| آلية الاسترجاع | تتبع روابط المعرّفات الثابتة | البحث عن التشابه عبر التضمينات (Embeddings) | قراءة سجل مضغوط وموجز | استدعاء أداة ذاكرة يوفرها الخادم |
| الدقة | سجل دقيق بالمعرّف | تقريبية، ومصنفة بحسب درجات التشابه | تفقد تفاصيل بطبيعتها | تعتمد على وحدة تخزين الخادم |
| الاستخدام الأمثل | سجلات الأحداث: طلبات السحب، التذاكر، تشغيلات CI | مجموعات المستندات الضخمة، والأسئلة التقريبية | الجلسات القصيرة، واستمرارية المحادثات | الحقائق المشتركة بين الأدوات والجلسات |
| المتطلبات | معرّفات لا تتغير أبداً، وواجهات برمجة تطبيقات للجلب بالمعرّف | نموذج تضمين وفهرس متجهي | مرحلة تلخيص دورية | خادم MCP نشط وقيد التشغيل |
| نقطة الضعف | لا تعثر على ما ليس مرتبطاً برابط | تغفل الحقائق المصاغة بأسلوب مختلف | تسقط التفاصيل الدقيقة | خدمة إضافية تتطلب تشغيلاً وتأميناً |
ستجمع بين هذه الطرق عملياً: يحدد الفهرس المتجهي معرّف Thread كبداية، ثم تتولى Chain of Recall التنقل للوصول إلى الحقائق الدقيقة. ويُعد التسلسل الهرمي للذاكرة على نمط أنظمة التشغيل المذكور في ورقة MemGPT قريباً جداً من هذا المفهوم. وإذا كنت تفضل البدء بمستودع جاهز، فراجع دليلنا حول إضافة ذاكرة دائمة لوكلاء الذكاء الاصطناعي باستخدام MCP.
وهناك قيدان ينبغي مراعاتهما: يضع المقال الذاكرة طويلة الأمد ضمن المشكلات المفتوحة التي لم تُحل بعد، ولا يدعي أن Chain of Recall تقدم حلاً نهائياً لها. وفي تجربته، أدى إلغاء التمرير المباشر للـ Thread إلى زيادة رموز قراءة الذاكرة المؤقتة من 23.2 مليون إلى 31.8 مليون رمز في كل تشغيل، أي بزيادة قدرها نحو 37%، وهي تكلفة ناتجة عن غياب ميزة وليست وفراً محققاً بفضل Chain of Recall.
الضمانات التي يجب أن توفرها واجهات برمجة التطبيقات الأساسية
كل خطوة في مسار الاسترجاع تمثل استدعاءً لواجهة برمجة التطبيقات. فإذا أرجع استدعاء واحد سجلاً مختلفاً أو لم يُرجع شيئاً، تنقطع السلسلة ويتوقف الوكيل عن العمل أو يجيب بناءً على التخمين. لذلك، تلتزم واجهات برمجة التطبيقات التي تدعم Chain of Recall بأربعة معايير أساسية:
- المعرّفات لا تتغير أبداً: المعرّف الذي يتم إرجاعه اليوم يجب أن يشير إلى الكائن نفسه في الشهر القادم؛ دون إعادة استخدام بعد الحذف، ودون إعادة ترقيم بعد عمليات ترحيل البيانات.
-
الجلب بالمعرّف دقيق ومنخفض التكلفة: الاستدعاء
GET /threads/{id}يُرجع ذلك السجل بعينه؛ فهو لا يقوم بعملية بحث، ولا يُرجع "أقرب تطابق". -
المعرّفات غير المعروفة تفشل بوضوح: يُرجع المعرّف المفقود رمز الحالة
404 Not Found، كما تحدده وثيقة RFC 9110، مع نص خطأ واضح. إن إرجاع200مع كائن فارغ يوهم الوكيل بوجود ذاكرة غير موجودة في الواقع. -
ترقيم الصفحات بالمؤشرات دون فجوات: يتنقل
GET /threads/{id}/events?cursor=عبر الـ Thread الطويل بالترتيب؛ إذ يظهر كل حدث مرة واحدة، ولا يتم تجاوز أي شيء، ويظل المؤشر صالحاً حتى مع وصول أحداث جديدة.
غالباً ما تنكسر هذه المعايير خفيةً أثناء إعادة هيكلة الشيفرة، لذا ينبغي تضمينها في اختبارات مؤتمتة. كما يجب أن تظل استجابات الأدوات صغيرة الحجم، وهو ما يغطيه دليلنا بالتفصيل حول استجابات أدوات الوكيل ونافذة السياق.
دع وكيل البرمجة يختبر واجهات برمجة تطبيقات الاسترجاع باستخدام Apidog CLI
لا تتجاوز موثوقية Chain of Recall موثوقية نقاط النهاية المخصصة للجلب بالمعرّف، ويمكن لوكيل البرمجة كتابة هذه الفحوصات وإعادة تشغيلها نيابةً عنك. وتوفر أداة Apidog CLI للوكيل أوامر لتعريف نقاط النهاية وإنشاء حالات الاختبار وتشغيلها مباشرةً من الطرفية.
قم بإعدادها مرة واحدة:
npm install -g apidog-cli@latest
apidog auth login --with-token <YOUR_TOKEN>
npx -y skills add https://apidog.com # pick your agent when prompted
بعد ذلك، وجّه إلى Claude Code أو Codex أو أي وكيل تستخدمه المطالبة التالية:
In Apidog project <projectId>, define three endpoints for our agent memory
service: GET /threads/{id}, GET /threads/{id}/events?cursor=, and
GET /workers/{id}. Then create test cases that check:
1. A thread_id returned by GET /threads/{id} resolves to the same record
on a second call, and each owner worker ID resolves via GET /workers/{id}.
2. An unknown thread ID and an unknown worker ID both return 404.
3. Paging GET /threads/{id}/events with the cursor returns every event
once, in order, with no gaps.
Run them against the staging environment and summarize any failures.
يقرأ الوكيل مخطط كل حمولة بيانات، ويتحقق من صحة ملف الـ JSON قبل كتابة أي شيء، ثم ينشئ الحالات ويشغلها:
apidog cli-schema get endpoint-create
apidog cli-schema validate endpoint-create --file thread-get.json
apidog endpoint create --project <projectId> --file thread-get.json
apidog cli-schema get test-case-create
apidog cli-schema validate test-case-create --file id-resolves.json
apidog test-case create --project <projectId> --file id-resolves.json
apidog run --test-case <caseId> --project <projectId> -e <envId> -r cli,json
يعرض تقرير cli حالات النجاح والفشل لكل تأكيد في الطرفية، بينما يمنح تقرير json الوكيلَ ملفاً يمكنه قراءته لتحديد الخطوة التي تعطلت بدقة. فإذا توقف معرّف عن الوصول إلى سجله بعد عملية ترحيل، فسترى ذلك في التقرير قبل أن يبدأ وكيلك بالإجابة اعتماداً على سلسلة معطلة. ولتشغيل الفحوصات نفسها مع كل عملية دمج، يمكنك استبدال خيار التقرير بـ -r junit؛ ويوضح دليلنا التوجيهي حول Apidog CLI في Claude Code دورة عمل الوكيل بالكامل.
المواضع المناسبة لاستخدام Chain of Recall
استخدم Chain of Recall عندما تكون ذاكرة وكيلك عبارة عن سجل من الأحداث المنفصلة والقابلة للربط: كطلبات السحب، والتذاكر، وتشغيلات التكامل المستمر، ومحادثات الدعم، وعمليات النشر. تمتلك هذه العناصر بالفعل معرّفات بطبيعتها، وتتمحور الأسئلة التي يطرحها المستخدمون حولها ("لماذا فعلنا هذا؟"، "ماذا حدث بعد ذلك؟") حول الروابط وسلاسل الأحداث.
بينما يُفضّل استخدام الاسترجاع المتجهي للمستندات غير المنظمة والأسئلة التقريبية، واستخدام التلخيص للجلسات القصيرة التي لا يضر فيها فقدان التفاصيل الدقيقة.
إن فكرة Chain of Recall مستمدة من مقال واحد ونموذج أولي واحد؛ فهي فكرة واضحة وقابلة للاختبار وليست منتجاً متكاملاً. ولمعرفة المزيد عن الأداة التي استند إليها المقال، ابدأ بالتعرف على ماهية DeepSeek Harness.
الأسئلة الشائعة
هل Chain of Recall ميزة من ميزات DeepSeek يمكنني تفعيلها؟ لا. إنه مصطلح ورد في مقال DeepSeek Harness حول الوكلاء الفائقين، وتوجد أجزاء منه في إضافة نموذج أولي يؤكد مؤلفوها أنها ليست منتجاً رسمياً من DeepSeek. وعليك تنفيذ هذا النمط بنفسك.
ما الفرق بين التضمين المباشر والإزاحة؟ يحتفظ التضمين المباشر بالمعرّفات والملخصات القصيرة والرسائل المجاورة داخل نافذة المطالبة، بينما تقوم الإزاحة باقتطاع الباقي وترك مؤشر يمكن للوكيل استخدامه لجلب البيانات عبر المعرّف عند الحاجة.
هل تحل تقنية Chain of Recall محل تقنية RAG؟ لا. تبحث RAG عن المحتوى المتشابه دلالياً، بينما تتبع Chain of Recall روابط المعرّفات المحددة بدقة. ويستخدم العديد من الوكلاء كلتا التقنيتين معاً.
هل خفّضت تقنية Chain of Recall استهلاك الرموز بنسبة 37%؟ لا، تعود نسبة الـ 37% إلى خاصية التمرير المباشر للـ Thread؛ حيث أدت إزالتها إلى زيادة رموز قراءة الذاكرة المؤقتة من 23.2 مليون إلى 31.8 مليون رمز في كل تشغيل ضمن تجربة المقال. ولا يذكر المقال أي توفير في الرموز منسوبٍ لـ Chain of Recall بحد ذاتها.
ما الذي يجب أن تُرجعه واجهة برمجة التطبيقات للجلب بالمعرّف عند تمرير معرّف غير معروف؟ يجب أن تُرجع 404 Not Found مع نص خطأ واضح؛ لأن إرجاع 200 مع كائن فارغ يجعل الوكيل يعتقد بوجود سجل في الذاكرة على خلاف الواقع، مما يقطع سلسلة الاسترجاع دون تنبيه.
كيف أتحقق من استقرار وثبات واجهات برمجة تطبيقات الذاكرة الخاصة بوكيلي؟ اكتب حالات اختبار تتحقق من أن المعرّف الناتج عن استدعاء معين يمكن الوصول إليه في الاستدعاء التالي، وأن المعرّفات غير المعروفة تُرجع 404، وأن مؤشرات الصفحات تتنقل بالترتيب ودون فجوات. ويمكن لوكيل البرمجة إنشاء هذه الاختبارات وتشغيلها باستخدام Apidog CLI مع كل عملية دمج.
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.
