الشروع في العمل مع Mem0 وMilvus
Mem0 عبارة عن طبقة ذاكرة ذكية لتطبيقات الذكاء الاصطناعي، مصممة لتقديم تفاعلات مخصصة وفعالة من خلال الاحتفاظ بتفضيلات المستخدم والتكيف المستمر بمرور الوقت. تُعد Mem0 مثالية لروبوتات الدردشة الآلية والأدوات التي تعتمد على الذكاء الاصطناعي، فهي تُنشئ تجارب سلسة مدركة للسياق.
في هذا البرنامج التعليمي، سنغطي في هذا البرنامج التعليمي العمليات الأساسية لإدارة ذاكرة Mem0 - إضافة واسترجاع وتحديث والبحث والحذف وتتبع سجل الذاكرة - باستخدام Milvus، وهي قاعدة بيانات متجهة مفتوحة المصدر عالية الأداء ومفتوحة المصدر تعمل على تشغيل التخزين والاسترجاع الفعال. ستوجهك هذه المقدمة العملية خلال عمليات الذاكرة التأسيسية لمساعدتك في بناء تفاعلات ذكاء اصطناعي مخصصة مع Mem0 وMilvus.
التحضير
تنزيل المكتبات المطلوبة
$ pip install mem0ai pymilvus
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).
تكوين Mem0 مع ميلفوس
سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY
كمتغير بيئة.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
والآن، يمكننا تهيئة Mem0 لاستخدام Milvus كمخزن للمتجهات
# Define Config
from mem0 import Memory
config = {
"vector_store": {
"provider": "milvus",
"config": {
"collection_name": "quickstart_mem0_with_milvus",
"embedding_model_dims": "1536",
"url": "./milvus.db", # Use local vector database for demo purpose
},
},
"version": "v1.1",
}
m = Memory.from_config(config)
- إذا كنت تحتاج فقط إلى قاعدة بيانات متجهات محلية للبيانات الصغيرة الحجم أو النماذج الأولية، فإن تعيين uri كملف محلي، على سبيل المثال
./milvus.db
، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.- إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثال
http://localhost:19530
. إذا قمت بتمكين خاصية المصادقة على Milvus، استخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.- إذا كنت تستخدم Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط
uri
وtoken
، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
إدارة ذكريات المستخدم مع Mem0 و Milvus
إضافة ذاكرة
تقوم الدالة add
بتخزين نص غير منظم في ميلفوس كذاكرة، وربطه بمستخدم معين وبيانات وصفية اختيارية.
هنا، نقوم بإضافة ذاكرة أليس، "أعمل على تحسين مهاراتي في التنس"، إلى جانب البيانات الوصفية ذات الصلة بالسياق إلى ملفوس.
# Add a memory to user: Working on improving tennis skills
res = m.add(
messages="I am working on improving my tennis skills.",
user_id="alice",
metadata={"category": "hobbies"},
)
res
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Working on improving tennis skills',
'event': 'ADD'}],
'relations': []}
تحديث الذاكرة
يمكننا استخدام قيمة إرجاع الدالة add
لاسترداد معرّف الذاكرة، مما يسمح لنا بتحديث هذه الذاكرة بمعلومات جديدة عبر update
.
# Get memory_id
memory_id = res["results"][0]["id"]
# Update this memory with new information: Likes to play tennis on weekends
m.update(memory_id=memory_id, data="Likes to play tennis on weekends")
{'message': 'Memory updated successfully!'}
الحصول على كل الذاكرة لمستخدم
يمكننا استخدام الدالة get_all
لعرض جميع الذكريات المدرجة أو التصفية حسب user_id
في ميلفوس.
لاحظ أنه يمكننا أن نرى أن الذاكرة قد تغيرت الآن من "العمل على تطوير مهارات التنس" إلى "يحب لعب التنس في عطلات نهاية الأسبوع".
# Get all memory for the user Alice
m.get_all(user_id="alice")
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'}]}
عرض سجل تحديث الذاكرة
يمكننا أيضًا عرض سجل تحديث الذاكرة من خلال تحديد الذاكرة_المعرف التي نهتم بها عبر الدالة history
.
m.history(memory_id=memory_id)
[{'id': '71ed3cec-5d9a-4fa6-a009-59802450c0b9',
'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'old_memory': None,
'new_memory': 'Working on improving tennis skills',
'event': 'ADD',
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': None},
{'id': 'db2b003c-ffb7-42e4-bd8a-b9cf56a02bb9',
'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'old_memory': 'Working on improving tennis skills',
'new_memory': 'Likes to play tennis on weekends',
'event': 'UPDATE',
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00'}]
البحث في الذاكرة
يمكننا استخدام الدالة search
للبحث عن الذاكرة الأكثر ارتباطًا بالمستخدم.
لنبدأ بإضافة ذاكرة أخرى لـ أليس.
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
والآن، نتصل بـ get_all
مع تحديد user_id للتحقق من أن لدينا بالفعل إدخالات ذاكرة 2 للمستخدم أليس.
m.get_all(user_id="alice")
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'},
{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}
يمكننا إجراء search
الآن من خلال توفير query
و user_id
. لاحظ أننا نستخدم افتراضيًا مقياس L2
للبحث عن التشابه، لذا فإن أصغر score
يعني تشابهًا أكبر.
m.search(query="What are Alice's hobbies", user_id="alice")
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'score': 1.2807445526123047,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'},
{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'score': 1.728922724723816,
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}
حذف الذاكرة
يمكننا أيضًا delete
ذاكرة من خلال توفير الذاكرة المقابلة memory_id
.
سنقوم بحذف الذاكرة "يحب لعب التنس في عطلات نهاية الأسبوع" حيث تم استرجاع memory_id
الخاص بها بالفعل، واستدعاء get_all
للتحقق من نجاح عملية الحذف.
m.delete(memory_id=memory_id)
m.get_all("alice")
{'results': [{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}