أهلاً بك مجدداً في رحلتنا لبناء وكيل ذكاء اصطناعي متكامل.
في الدرس السابق، تعلمنا كيف نجعل وكيلنا يدير محادثات متعددة الخطوات، فينتقل من مجرد مجيب آلي إلى مساعد ذكي يجمع المعلومات خطوة بخطوة. لكننا لاحظنا أن ذاكرته كانت "قصيرة المدى"، فهو يتذكر سياق المحادثة الحالية فقط. بمجرد أن تبدأ محادثة جديدة، فإنه ينسى كل شيء عنك.
في هذا الدرس، سنقوم بترقية ذاكرة وكيلنا. هدفنا هو ربط ذاكرة الوكيل طويلة المدى لتذكر تفاصيل العملاء بين المحادثات. سنتعلم كيف يمكن للوكيل أن يحتفظ بمعلومات مهمة عن عملائه (مثل تفضيلاتهم، تاريخ مشترياتهم، أو أي تفاصيل شخصية يشاركونها) ويستخدمها في محادثات مستقبلية لتقديم تجربة مخصصة وشخصية حقًا. هذا هو ما يجعل العميل يشعر بأنه يتعامل مع مساعد شخصي يعرفه ويفهمه.
1. الذاكرة قصيرة المدى مقابل الذاكرة طويلة المدى
قبل أن نبدأ، من المهم أن نميز بوضوح بين نوعي الذاكرة اللذين سنتعامل معهما:
-
الذاكرة قصيرة المدى (Short-Term Memory): هي ذاكرة المحادثة الحالية. إنها تساعد الوكيل على فهم سياق الحوار الجاري. على سبيل المثال، إذا قلت "أبحث عن حذاء للجري"، ثم سألت "ما هي الألوان المتوفرة؟"، فإن الذاكرة قصيرة المدى تجعل الوكيل يفهم أنك تسأل عن ألوان حذاء الجري وليس أي منتج آخر. لكن هذه الذاكرة تُمحى بمجرد انتهاء المحادثة.
-
الذاكرة طويلة المدى (Long-Term Memory): هي أرشيف دائم للمعلومات الهامة. إنها تشبه "دفتر ملاحظات" يحتفظ به الوكيل عن كل عميل. إذا ذكرت اليوم أن "اسم كلبي هو روبي"، فإن الذاكرة طويلة المدى تسمح للوكيل بتذكر هذه المعلومة في محادثة أخرى بعد أسبوع.
الفيديو التالي يشرح هذا الفرق بشكل ممتاز ويوضح لماذا نحتاج إلى ذاكرة طويلة المدى لتجاوز قيود سجل المحادثات المؤقت.
Build an AI Agent That Actually Remembers You (n8n Tutorial)
يقدم هذا المقطع من قناة Leon van Zyl شرحاً مبسطاً وممتازاً للفرق بين ذاكرة المحادثة (قصيرة المدى) والذاكرة طويلة المدى التي تمتد عبر جميع المحادثات.
شاهد من بداية الفيديو حتى الدقيقة 03:45. ركز على التشبيه الذي يستخدمه لشرح كيف أن ذاكرة المحادثة تُنسى عند بدء محادثة جديدة، بينما الذاكرة طويلة المدى تظل باقية.
كما رأيت، تتيح الذاكرة طويلة المدى للوكيل بناء علاقة مع المستخدم بمرور الوقت، مما يجعل التفاعلات المستقبلية أكثر فعالية وتخصيصًا. انظر إلى الصورة التالية التي توضح الفكرة: الوكيل يتذكر التفضيلات المختلفة لكل مستخدم على حدة، حتى في جلسات مختلفة.
2. كيف تعمل الذاكرة طويلة المدى؟ (الهيكل العام)
لتنفيذ ذاكرة طويلة المدى، نحتاج إلى ثلاثة مكونات رئيسية تعمل معًا:
-
قاعدة بيانات خارجية (External Database): مكان لتخزين الذكريات بشكل دائم. في الدروس السابقة (الوحدة 7)، تعرفنا على قواعد بيانات بسيطة مثل SQLite. يمكننا استخدامها لتكون بمثابة "مخزن الذاكرة" لوكيلنا.
-
أداة لحفظ الذكريات (Save Memory Tool): وظيفة أو "أداة" خاصة يستدعيها الوكيل عندما يكتشف معلومة جديدة ومهمة تستحق التذكر. يقرر "العقل المدبر" (LLM) ما هي المعلومة الجديرة بالحفظ (مثل "أنا أفضل التواصل عبر واتساب") ثم يمررها لهذه الأداة لتخزينها في قاعدة البيانات مع معرّف المستخدم.
-
آلية لاسترجاع الذكريات (Retrieve Memory Mechanism): في بداية كل محادثة جديدة مع مستخدم، يقوم الوكيل أولاً بالبحث في قاعدة البيانات عن أي ذكريات سابقة مرتبطة بهذا المستخدم.
-
حقن الذاكرة في السياق (Inject Memory into Context): يتم إدراج الذكريات المسترجعة في "رسالة النظام" (System Prompt) الخاصة بالوكيل. بهذه الطريقة، يبدأ الـ LLM المحادثة وهو على دراية كاملة بتاريخ المستخدم وتفضيلاته.
الصورة التالية توضح موقع هذه المكونات في البنية العامة للوكيل. لاحظ كيف أن "الذاكرة العرضية" (Episodic Memory) - التي تسجل التفاعلات السابقة - يتم تخزينها واسترجاعها من قاعدة بيانات خارجية.
3. تطبيق عملي: خطوة بخطوة
لفهم الآلية بشكل عملي، سنعود إلى الفيديو الذي شاهدنا جزءاً منه. هذه المرة، سنتابع كيف يقوم ببناء نظام ذاكرة طويلة المدى خطوة بخطوة باستخدام أدوات مرئية (n8n و Airtable). حتى لو لم نكن نستخدم هذه الأدوات تحديدًا، فإن المنطق والخطوات هي نفسها تمامًا التي سنتبعها عند كتابة الكود الخاص بنا بلغة بايثون.
الخطوة 1: إعداد قاعدة البيانات لتخزين الذكريات
أولاً، نحتاج إلى مكان لتخزين الذكريات. في الفيديو، سيتم استخدام Airtable لإنشاء جدول بسيط يحتوي على ثلاثة أعمدة رئيسية:
Memory: نص المعلومة التي نريد تذكرها (مثال: "يحب الطعام الإيطالي").User: معرّف فريد للمستخدم (مثال: رقم هاتفه على واتساب).Created: تاريخ ووقت تسجيل المعلومة (مهم لمعرفة أحدث التفضيلات).
Build an AI Agent That Actually Remembers You (n8n Tutorial)
يشرح هذا الجزء كيفية إعداد قاعدة البيانات (في هذه الحالة، Airtable) التي ستعمل كمخزن لذاكرة الوكيل طويلة المدى.
شاهد من الدقيقة 07:02 إلى 09:38. ركز على بنية الجدول والأعمدة التي يتم إنشاؤها. هذا يماثل تمامًا إنشاء جدول في قاعدة بيانات SQLite التي تعلمناها.
الخطوة 2: بناء أداة لحفظ الذكريات
الآن بعد أن أصبح لدينا قاعدة بيانات، نحتاج إلى طريقة ليتمكن الوكيل من "الكتابة" فيها. سنقوم بإنشاء "أداة" تسمح للـ LLM بحفظ معلومة جديدة. الـ LLM ذكي بما يكفي لاستخلاص جوهر المعلومة من كلام المستخدم وحفظها.
Build an AI Agent That Actually Remembers You (n8n Tutorial)
يوضح هذا المقطع كيف يتم تكوين أداة "حفظ الذاكرة" (Save Memory) وكيف يقرر الوكيل بشكل ذكي استخدامها لتخزين تفاصيل جديدة من محادثة المستخدم.
شاهد من الدقيقة 09:38 إلى 11:23. لاحظ كيف أنه عندما يقول المستخدم "My dog's name is Ruby"، يقوم الوكيل باستدعاء أداة حفظ الذاكرة وتخزين هذه المعلومة في قاعدة البيانات.
الخطوة 3: استرجاع الذكريات وحقنها في السياق
هذه هي الخطوة الأهم. في بداية أي محادثة جديدة، يجب على نظامنا أن:
- يستعلم من قاعدة البيانات عن كل الذكريات المحفوظة لهذا المستخدم المحدد.
- يجمع هذه الذكريات في نص واحد.
- يضيف هذا النص إلى "رسالة النظام" (System Prompt) مع توجيه واضح للـ LLM لاستخدام هذه المعلومات.
Build an AI Agent That Actually Remembers You (n8n Tutorial)
هذا هو الجزء المحوري الذي يربط كل شيء معًا. ستشاهد كيف يتم استرجاع الذكريات المخزنة في بداية المحادثة ودمجها في سياق الوكيل ليتمكن من استخدامها.
شاهد من الدقيقة 11:23 إلى 16:27. ركز بشكل خاص على كيفية تعديل رسالة النظام (System Prompt) لتشمل قسماً جديداً بعنوان "Memories" وكيف يتم حقن الذكريات المسترجعة فيه.
الخطوة 4: الاختبار النهائي
الآن، حان وقت اختبار النتيجة النهائية. هل سيتذكر الوكيل التفاصيل التي تم حفظها في محادثة جديدة تمامًا؟
Build an AI Agent That Actually Remembers You (n8n Tutorial)
هنا نرى ثمرة عملنا. يتم اختبار الوكيل بسؤاله عن معلومة تم تقديمها في محادثة سابقة ومنفصلة.
شاهد من الدقيقة 16:27 إلى 17:14. لاحظ كيف أن الوكيل، في محادثة جديدة تمامًا، كان قادرًا على تذكر اسم الكلب "Ruby" بنجاح.
4. من الفكرة إلى كود بايثون
ما رأيناه في الفيديو هو تمثيل مرئي للمنطق الذي سنبنيه باستخدام بايثون. المقال التالي يحتوي على أمثلة برمجية لكيفية بناء أدوات store_episodic_memory و retrieve_episodic_memories باستخدام بايثون وقاعدة بيانات (في مثاله يستخدم MongoDB، لكن المبدأ واحد).
Beyond the Basics: Giving Your AI Agents a Brain | Medium
لربط ما شاهدناه بالكود الفعلي، سنلقي نظرة على مقال "Beyond the Basics: Giving Your AI Agents a Brain" من كتابة Siva Gollapalli. لن تحتاج لقراءة المقال بالكامل، ولكن سأعرض لك المفاهيم الأساسية من الكود الذي يقترحه.
يمكنك إلقاء نظرة سريعة على قسم الكود الموجود تحت عنوان "Representing Episodic Memory (Experiences)". ركز على أسماء الدوال: store_episodic_memory و retrieve_episodic_memories. هذه هي الوظائف التي سنحتاج إلى بنائها في مشروعنا.
بناءً على هذا المفهوم، يمكننا تخيل كيف سيبدو الكود المبدئي في مشروعنا بلغة بايثون، باستخدام قاعدة بيانات SQLite التي نعرفها:
# كود مفاهيمي لتوضيح الفكرة
import sqlite3
from datetime import datetime
# هذه الدالة تماثل أداة "حفظ الذاكرة"
def save_customer_detail(user_id, detail):
"""تحفظ معلومة جديدة عن العميل في قاعدة البيانات"""
conn = sqlite3.connect('agent_memory.db')
cursor = conn.cursor()
# تأكد من أن الجدول موجود
cursor.execute('''
CREATE TABLE IF NOT EXISTS memories (
id INTEGER PRIMARY KEY,
user_id TEXT NOT NULL,
detail TEXT NOT NULL,
created_at TEXT NOT NULL
)
''')
# إضافة الذاكرة الجديدة
cursor.execute(
"INSERT INTO memories (user_id, detail, created_at) VALUES (?, ?, ?)",
(user_id, detail, datetime.now().isoformat())
)
conn.commit()
conn.close()
print(f"تم حفظ الذاكرة للمستخدم {user_id}: '{detail}'")
# هذه الدالة تماثل آلية "استرجاع الذاكرة"
def get_customer_details(user_id):
"""تسترجع كل الذكريات السابقة لعميل معين"""
conn = sqlite3.connect('agent_memory.db')
cursor = conn.cursor()
cursor.execute(
"SELECT detail FROM memories WHERE user_id = ? ORDER BY created_at ASC",
(user_id,)
)
rows = cursor.fetchall()
conn.close()
# إرجاع قائمة بالذكريات كنصوص
return [row[0] for row in rows]
# --- في حلقة عمل الوكيل الرئيسية ---
user_id = "whatsapp_user_123"
user_message = "ما هي المنتجات التي تناسبني؟"
# 1. استرجاع الذاكرة طويلة المدى
memories = get_customer_details(user_id)
memories_string = ""
if memories:
# تنسيق الذكريات لإضافتها لرسالة النظام
formatted_memories = "\n- ".join(memories)
memories_string = f"""إليك بعض الحقائق التي تتذكرها عن هذا المستخدم:
- {formatted_memories}
استخدم هذه الحقائق لتخصيص ردك."""
# 2. بناء رسالة النظام الديناميكية
system_prompt = f"""أنت مساعد مبيعات خبير.
{memories_string}
كن ودودًا وقدم المساعدة.
"""
# 3. استدعاء الـ LLM مع السياق المعزز بالذاكرة
# response = call_llm(system_prompt, user_message)
# ... وهكذا
# بعد المحادثة، يمكننا أن نقرر حفظ معلومة جديدة
# new_memory = "أخبرنا العميل أن ميزانيته 500 ريال"
# save_customer_detail(user_id, new_memory)
اختبر فهمك!
لنفترض أن عميلاً جديداً (لم يتحدث مع الوكيل من قبل) بدأ محادثة. بناءً على الكود المفاهيمي أعلاه، ماذا سيحدث عند استدعاء دالة get_customer_details('new_user_456')؟ وكيف سيؤثر ذلك على system_prompt الذي سيتم إرساله إلى الـ LLM؟
Show answer
- دالة
get_customer_detailsستبحث في قاعدة البيانات عن ذكريات للمستخدمnew_user_456. - بما أن المستخدم جديد، فلن تجد أي سجلات، وستقوم بإرجاع قائمة فارغة
[]. - نتيجة لذلك، سيكون المتغير
memories_stringفارغاً. - سيكون
system_promptالمرسل إلى الـ LLM هو النسخة الأساسية بدون أي معلومات إضافية عن المستخدم: "أنت مساعد مبيعات خبير. كن ودودًا وقدم المساعدة." - سيتعامل الوكيل مع هذا المستخدم كشخص غريب تمامًا، وهذا هو السلوك الصحيح.
خلاصة الدرس
لقد قمنا اليوم بخطوة هائلة نحو بناء وكيل احترافي.
- ميزنا بين الذاكرة قصيرة المدى وطويلة المدى: فهمنا أن الذاكرة طويلة المدى ضرورية لبناء علاقات مستمرة مع العملاء.
- تعلمنا الهيكل العام للذاكرة طويلة المدى: وهي تتكون من قاعدة بيانات، وأدوات للحفظ والاسترجاع، وآلية لحقن الذكريات في سياق الـ LLM.
- شاهدنا تطبيقًا عمليًا: رأينا خطوة بخطوة كيف يمكن بناء هذا النظام، مما جعل الفكرة ملموسة وواضحة.
- ربطنا الفكرة بالكود: ترجمنا المنطق الذي تعلمناه إلى كود بايثون مفاهيمي يمكننا البناء عليه لاحقًا.
ماذا بعد؟
لقد أصبح وكيلنا الآن قادراً على إدارة حوارات معقدة ولديه ذاكرة طويلة المدى. لقد جمعنا كل المكونات الأساسية لوكيل مبيعات واتساب فعال. في الدرس القادم، سنضع كل هذه القطع معًا ونقوم بـ اختبار وكيل أتمتة المبيعات في سيناريو مبسط. سنرى كيف يتصرف وكيلنا في محادثة حقيقية من البداية إلى النهاية، وسنقوم بتقييم أدائه وتحديد نقاط القوة والضعف. استعد لرؤية وكيلك ينبض بالحياة