Graphiti - رسوم البيانات الزمنية للمعرفة للوكلاء
Graphiti (من قبل Zep) هو إطار عمل مفتوح المصدر لبناء والاستعلام رسوم بيانات المعرفة الزمنية للوكلاء AI. بخلاف رسم بياني ثابت، يتتبع Graphiti كيفية تغير الحقائق بمرور الوقت: كل حافة تحمل فترات صلاحية، لذا يعرف الرسم البياني ليس فقط ما هو صحيح بل متى كان صحيحاً والحفاظ على الأصل والتاريخ. يستقبل البيانات بشكل إضافي — يتم إضافة الحلقات بدون إعادة حساب الرسم البياني الكامل — مما يجعله مناسباً للذاكرة التي يجب أن تستدل عن الحقائق المتطورة.
المتطلبات
- قاعدة بيانات رسم بياني: Neo4j أو FalkorDB
- مزود LLM (OpenAI أو Anthropic وغيرها) لاستخراج الكيانات/العلاقات
- Python 3.10+
التثبيت
| الطريقة | الأمر |
|---|
| pip | pip install graphiti-core |
| مع FalkorDB | pip install "graphiti-core[falkordb]" |
| تعيين المفاتيح | export OPENAI_API_KEY=... ومتغيرات بيئة قاعدة بيانات الرسم البياني |
| التحقق | python -c "import graphiti_core; print('ok')" |
المفاهيم الأساسية
| المصطلح | المعنى |
|---|
| الحلقة | وحدة من البيانات المستقبلة (رسالة أو نص أو JSON) |
| العقدة | كيان تم استخراجه من الحلقات |
| الحافة (الحقيقة) | علاقة مع صلاحية الوقت (valid_at/invalid_at) |
| ثنائي الزمن | يتتبع كلاً من وقت الحدث ووقت الاستقبال |
| المجتمع | مجموعات من الكيانات المرتبطة |
تهيئة وإضافة الحلقات
from graphiti_core import Graphiti
from graphiti_core.nodes import EpisodeType
import asyncio
async def main():
graphiti = Graphiti("bolt://localhost:7687", "neo4j", "password")
await graphiti.build_indices_and_constraints()
await graphiti.add_episode(
name="msg1",
episode_body="Nick joined Acme as CTO in 2024.",
source=EpisodeType.text,
reference_time=datetime.now(),
source_description="chat",
)
asyncio.run(main())
| الاستدعاء | الوصف |
|---|
Graphiti(uri, user, pass) | الاتصال بقاعدة بيانات الرسم البياني |
build_indices_and_constraints() | إعداد المخطط لمرة واحدة |
add_episode(...) | استقبال البيانات؛ الكيانات/الحواف تم استخراجها تلقائياً |
add_episode_bulk(...) | استقبال الدفعات |
البحث في الذاكرة
# بحث هجين: دلالي + BM25 + رسم بياني أعاد تصنيفه
results = await graphiti.search("Where does Nick work?")
for r in results:
print(r.fact, r.valid_at)
| البحث | السلوك |
|---|
search(query) | بحث الحافة الهجين (دلالي + كلمة رئيسية + رسم بياني) |
| البحث عن العقدة | استرجاع الكيانات |
| إعادة التصنيف | خيارات RRF / مسافة الرسم البياني / encoder عبر |
| عقدة المركز | نتائج الانحياز حول كيان معين |
المنطق الزمني
المختلف: عندما تتغير حقيقة ما، لا يقوم Graphiti بحذف القديم — بدلاً من ذلك يحدد الحافة السابقة غير صالحة ويضيف الجديدة، لذا يتم الحفاظ على التاريخ والاستعلامات في نقطة زمنية محددة ممكنة.
| الإمكانية | الاستخدام |
|---|
| إبطال الحقيقة | الحقائق القديمة تحصل على invalid_at تعيين عند التناقض |
| الاستعلامات في نقطة زمنية | ”ما كان صحيحاً اعتباراً من تاريخ X؟“ |
| الأصل | تتبع حقيقة إلى حلقة مصدرها |
| أنواع الكيانات المخصصة | تحديد نماذج Pydantic لاستخراج مكتوب |
التكامل
| الهدف | كيفية |
|---|
| Zep | Graphiti هو المحرك تحت خدمة ذاكرة Zep |
| أطر عمل الوكيل | الاستخدام كأداة ذاكرة/استرجاع |
| MCP | خادم Graphiti MCP يكشف الذاكرة للوكلاء |
| مخصص | الاستعلام الرسم البياني مباشرة للسياق |
سير العمل الشائع
# ذاكرة الوكيل التي تنجو من تغيير الحقائق
await graphiti.add_episode(name="e1", episode_body="Nick uses Postgres.", ...)
# لاحقاً تتغير الحقيقة:
await graphiti.add_episode(name="e2", episode_body="Nick migrated to SQLite.", ...)
# يقوم Graphiti بإبطال حقيقة Postgres وتسجيل حقيقة SQLite مع الوقت
ctx = await graphiti.search("What database does Nick use now?")
Graphiti مقابل أطر عمل الذاكرة الأخرى
| الجانب | Graphiti | Cognee | Mem0 |
|---|
| قوة الأساس | الحقائق الزمنية/ثنائية الزمن | رسم بياني أصلي ECL | التخصيص |
| التاريخ | محفوظ مع أوقات الصلاحية | لقطات الرسم البياني | مركز حديث |
| الواجهة الخلفية | Neo4j / FalkorDB | متجر متعدد | متجه/رسم بياني/KV |
| الأفضل لـ | الحقائق التي تتغير بمرور الوقت | منطق الرسم البياني المحلي أولاً | ذاكرة المحادثة |
موارد