Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 35

اختبار الذاكرة ضمن الجلسة

Recommended resources

أهلاً بك في هذا الدرس الجديد!

في الدروس القليلة الماضية، قمنا بتجميع المكونات الأساسية لوكيلنا. لقد أعطيناه "عقلاً" عن طريق ربطه بنموذج لغة كبير، ثم بنينا له "ذاكرة" قصيرة المدى بسيطة لتذكر المحادثات. وأخيراً، اكتشفنا نقطة ضعف هذه الذاكرة: محدودية نافذة السياق (Context Window)، والتي تجعل الوكيل ينسى المعلومات القديمة في المحادثات الطويلة.

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


1. تجميع كود الوكيل للاختبار

حتى الآن، كنا نتحدث عن أجزاء مختلفة من كود الوكيل. الآن، دعنا نجمع كل هذه الأجزاء في ملف واحد جاهز للتشغيل. سنسميه agent_v4.py.

هذا الكود هو تتويج لما تعلمناه في هذه الوحدة:

  1. الفئة SimpleAgent: تنظم الكود الخاص بنا.
  2. دالة __init__: تقوم بإعداد العقل (LLM) والذاكرة (قائمة لتخزين الرسائل).
  3. دالة chat: هي حلقة التفاعل الرئيسية. تستقبل مدخلات المستخدم، وتضيفها إلى الذاكرة، وترسل السجل الكامل إلى النموذج اللغوي، ثم تحفظ استجابة النموذج.

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

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

Build your own AI assistant in 10 lines of code - Python

يقدم هذا المقال من منتدى مجتمع OpenAI مثالًا برمجيًا بسيطًا جدًا يوضح آلية عمل ذاكرة المحادثة. لاحظ كيف يتم استخدام قائمة conversation لتخزين الرسائل وإعادة إرسالها في كل مرة.

ألقِ نظرة سريعة على الكود البرمجي في 'Step 4: Create the Chat Assistant'. ركز على كيفية إضافة كل رسالة جديدة (من المستخدم والمساعد) إلى القائمة conversation قبل استدعاء openai.ChatCompletion.create. هذا هو بالضبط ما يفعله وكيلنا في الخلفية.

الآن، إليك الكود الكامل لوكيلنا agent_v4.py الذي سنستخدمه للاختبار. هذا الكود يفترض أنك قمت بالفعل بإعداد متغير البيئة OPENAI_API_KEY كما تعلمنا في الوحدة الثانية.

import openai
import os

# --- إعداد العميل ---
# تأكد من تعيين مفتاح API الخاص بك كمتغير بيئة
# export OPENAI_API_KEY='Your_API_Key_Here'
try:
    client = openai.OpenAI()
except openai.OpenAIError:
    print("خطأ: لم يتم العثور على مفتاح OpenAI API.")
    print("يرجى تعيين متغير البيئة OPENAI_API_KEY.")
    exit()

class SimpleAgent:
    def __init__(self, system_prompt="You are a helpful assistant."):
        """
        يقوم بإعداد الوكيل مع رسالة نظام وقائمة فارغة للذاكرة.
        """
        self.system_prompt = system_prompt
        # هذه هي ذاكرتنا قصيرة المدى. نبدأها برسالة النظام.
        self.memory = [{"role": "system", "content": self.system_prompt}]
        print("تم إنشاء وكيل بسيط. الذاكرة جاهزة.")

    def chat(self, user_input):
        """
        يدير دورة محادثة واحدة.
        """
        # 1. تذكر: أضف رسالة المستخدم الجديدة إلى الذاكرة
        self.memory.append({"role": "user", "content": user_input})
        print(f"\n[DEBUG] إرسال {len(self.memory)} رسالة إلى النموذج...")

        # 2. فكر: استدعاء النموذج اللغوي مع الذاكرة الكاملة (نافذة السياق)
        completion = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=self.memory
        )
        assistant_response = completion.choices[0].message.content

        # 3. تذكر: أضف استجابة المساعد إلى الذاكرة
        self.memory.append({"role": "assistant", "content": assistant_response})
        
        return assistant_response

# --- منطق التشغيل الرئيسي ---
if __name__ == "__main__":
    # إنشاء نسخة من الوكيل
    agent = SimpleAgent(system_prompt="أنت مساعد ذكي وموجز في إجاباتك.")
    
    print("\nمرحباً بك في جلسة الدردشة مع وكيلك!")
    print("يمكنك إنهاء المحادثة في أي وقت بكتابة 'خروج'.")
    
    # حلقة محادثة مستمرة
    while True:
        user_message = input("\nأنت: ")
        if user_message.lower() == "خروج":
            print("مساعد: مع السلامة!")
            break
        
        response = agent.chat(user_message)
        print(f"مساعد: {response}")

قم بحفظ هذا الكود في ملف باسم agent_v4.py. أنت الآن جاهز لإجراء الاختبار الأول!



2. تصميم وتنفيذ اختبار الذاكرة

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

  1. تزويد الوكيل بمعلومة محددة.
  2. طرح سؤال غير مرتبط لتغيير الموضوع قليلاً.
  3. طرح سؤال يختبر ما إذا كان الوكيل لا يزال يتذكر المعلومة الأصلية.

هذا السيناريو يحاكي محادثة طبيعية حيث قد تتغير المواضيع، ولكنه يختبر قدرة الوكيل على الاحتفاظ بالسياق.

Build AI Agent Memory From Scratch

يقدم هذا المقال مثالاً ممتازاً لاختبار الذاكرة باستخدام اسم حيوان أليف. سنستخدم فكرة مشابهة تمامًا في اختبارنا.

اقرأ قسم 'Step 4. Run and Test'. لاحظ تسلسل الحوار: المستخدم يذكر اسم القط 'Whiskers'، ثم يسأل سؤالاً آخر، وأخيراً يسأل عن اسم القط مرة أخرى. هذا هو نمط الاختبار الذي سنتبعه.

لنبدأ الاختبار!

افتح الطرفية (Terminal) في نفس المجلد الذي حفظت فيه ملف agent_v4.py وقم بتشغيل الأمر التالي:

python agent_v4.py

الآن، اتبع الحوار التالي تمامًا:

الخطوة 1: تقديم المعلومة
اكتب الرسالة التالية واضغط Enter:
مرحباً، لدي قطة اسمها "لولو". أريدك أن تتذكري هذا الاسم.

يجب أن يرد الوكيل بشيء مثل: "فهمت. سأتذكر أن اسم قطتك هو لولو."

الخطوة 2: تغيير الموضوع
الآن، اسأل سؤالاً لا علاقة له بالموضوع:
ما هي أعلى قمة جبلية في العالم؟

سيجيب الوكيل على الأرجح: "أعلى قمة جبلية في العالم هي قمة إيفرست."

الخطوة 3: اختبار الذاكرة
هذه هي لحظة الحقيقة. اسأل الوكيل:
ما هو اسم قطتي؟

إذا نجح كل شيء، يجب أن يجيب الوكيل: "اسم قطتك هو لولو."

تقنيات ذاكرة روبوت الدردشة في الذكاء الاصطناعي
هذا الرسم يوضح ما حدث للتو. تم إرسال كل رسائلك وردود الوكيل السابقة ("لولو"، "إيفرست") مع سؤالك الأخير ("ما هو اسم قطتي؟") داخل نافذة السياق، مما سمح للنموذج بربط المعلومات والإجابة بشكل صحيح.

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

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

الآن دورك. أعد تشغيل البرنامج وجرّب سيناريو اختبار مختلف من ابتكارك. على سبيل المثال:

  1. أخبر الوكيل بمدينتك المفضلة.
  2. اسأله عن وصفة طعام.
  3. اسأله مرة أخرى عن مدينتك المفضلة التي ذكرتها.

هل نجح الاختبار؟ هذا التمرين يؤكد فهمك لآلية عمل الذاكرة وكيفية اختبارها.



خلاصة الدرس

في هذا الدرس العملي، حققنا هدفاً مهماً:

  • جمعنا الكود: قمنا بدمج أجزاء العقل والذاكرة في ملف agent_v4.py متكامل وجاهز للتشغيل.
  • صممنا اختباراً: وضعنا خطة واضحة لاختبار ذاكرة الوكيل من خلال تقديم معلومة ثم استرجاعها لاحقًا.
  • أثبتنا المفهوم: نجح وكيلنا في الاختبار، مما يثبت أن استراتيجية ConversationBufferMemory تعمل بشكل فعال للمحادثات القصيرة.

لقد بنيت الآن وكيلًا بسيطًا بوظائف كاملة: لديه عقل (LLM) وقادر على التفكير، ولديه ذاكرة (قائمة رسائل) وقادر على التذكر. هذا هو أساس كل الوكلاء الأكثر تعقيدًا الذين سنبنيهم لاحقًا.


ماذا بعد؟

لقد وصلنا إلى نهاية الوحدة الخامسة. أصبح لدى وكيلنا القدرة على التحدث والتذكر. لكن قدراته لا تزال محصورة في "الكلام" فقط. ماذا لو أردنا منه أن يقوم بـ أفعال حقيقية؟

في الوحدة السادسة القادمة، سنبدأ في إعطاء وكيلنا "قدرات خارقة" من خلال تزويده بـ الأدوات (Tools). سنتعلم مفهومًا قويًا يسمى استدعاء الدوال (Function Calling)، والذي يسمح للنموذج اللغوي بتحديد متى وكيف يستخدم دالة برمجية كتبتها أنت لتنفيذ مهمة، مثل البحث في الإنترنت أو قراءة ملف. استعد لنقل وكيلك من مجرد "متحدث" إلى "فاعل" حقيقي في العالم الرقمي.