تخطَّ إلى المحتوى

Graphiti - رسوم البيانات الزمنية للمعرفة للوكلاء

Graphiti - رسوم البيانات الزمنية للمعرفة للوكلاء

Graphiti (من قبل Zep) هو إطار عمل مفتوح المصدر لبناء والاستعلام رسوم بيانات المعرفة الزمنية للوكلاء AI. بخلاف رسم بياني ثابت، يتتبع Graphiti كيفية تغير الحقائق بمرور الوقت: كل حافة تحمل فترات صلاحية، لذا يعرف الرسم البياني ليس فقط ما هو صحيح بل متى كان صحيحاً والحفاظ على الأصل والتاريخ. يستقبل البيانات بشكل إضافي — يتم إضافة الحلقات بدون إعادة حساب الرسم البياني الكامل — مما يجعله مناسباً للذاكرة التي يجب أن تستدل عن الحقائق المتطورة.

المتطلبات

  • قاعدة بيانات رسم بياني: Neo4j أو FalkorDB
  • مزود LLM (OpenAI أو Anthropic وغيرها) لاستخراج الكيانات/العلاقات
  • Python 3.10+

التثبيت

الطريقةالأمر
pippip install graphiti-core
مع FalkorDBpip 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 لاستخراج مكتوب

التكامل

الهدفكيفية
ZepGraphiti هو المحرك تحت خدمة ذاكرة 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 مقابل أطر عمل الذاكرة الأخرى

الجانبGraphitiCogneeMem0
قوة الأساسالحقائق الزمنية/ثنائية الزمنرسم بياني أصلي ECLالتخصيص
التاريخمحفوظ مع أوقات الصلاحيةلقطات الرسم البيانيمركز حديث
الواجهة الخلفيةNeo4j / FalkorDBمتجر متعددمتجه/رسم بياني/KV
الأفضل لـالحقائق التي تتغير بمرور الوقتمنطق الرسم البياني المحلي أولاًذاكرة المحادثة

موارد