تخطَّ إلى المحتوى
kazma.
EN نجمة 7 ابدأ الآن

الذاكرة وRAG

مصدر الحقيقة الحي (2026-08). V2 هي مكدّس الذاكرة الوحيد للدردشة.

  • الذاكرة الشخصية — معتقدات ثنائية الزمن، حلقات من 4 طبقات، PPR، FTS5 + dense (‏sqlite-vec على عقدة واحدة؛ pgvector عند تفعيل Postgres)، طابور دائم.
  • مكتبة المعرفة — مخزن منفصل؛ دمج منتجي عبر حقن موسوم + بحث موحّد (وليس جدولًا واحدًا).
  • محوّلات التوسّع — pgvector يُختار تلقائيًا من Postgres DSN؛ Qdrant إن ضبطته؛ كتابة مزدوجة إلى Neo4j؛ مرآة حالة Postgres / دور primary.
  • ‏V1 رباعي الطبقات RRF (Chroma / مفاهيم L1–L4) أُزيل. لا تُحيه في الوثائق أو نصوص الواجهة. الملاحظات القديمة التي تذكر UnifiedMemoryAdapter / VectorMemory باتت ملغاة.

قائمة تشغيل المشغّل: Memory best path. سجل التوسّع: docs/plans/MEMORY_REMAINING.md. تدقيق النظام (2026-08-24، النتائج مغلقة): AUDIT_MEMORY_SYSTEM_2026-08-24.md.


User turn
→ recall() (beliefs + episodes FTS/dense + PPR + session bias)
→ optional federated KB hits (if merge_knowledge_into_chat)
→ format_untrusted_block (<kazma:data untrusted>)
→ LLM
→ post-turn: mirror episode, heuristic beliefs, enqueue micro_consolidation
قاعدة البياناتالدور
memory_state.dbالساخنة: المعتقدات، الحلقات، الكيانات، entity_merges (+ الأرشيف)، رسومات الإجراءات DAGs
memory_ops.dbالباردة: طابور المهام، سجل التدقيق

لا تدمجهما — يجب ألا يتنازع التوحيد الخلفي مع قراءات الدردشة على WAL.

المخازن تبقى منفصلة (تميّز منتجي)

Section titled “المخازن تبقى منفصلة (تميّز منتجي)”
المخزنالدورالافتراضي
V2 المعرفيمن أنا / ما قلناهSQLite مصدر الحقيقة على عقدة واحدة
مكتبة المعرفةمستندات + استشهاداتفهارس KB منفصلة
Neo4jكتابة مزدوجة اختيارية لثلاثيات المعتقداتمطفأ ما لم يُضبط
حالة Postgresمرآة مزدوجة أو state.role=primaryمطفأ ما لم يُضبط
المتجهات densesqlite-vec (عقدة واحدة) / pgvector (Postgres DSN) / Qdrantpgvector تلقائيًا عند مغادرة عقدة واحدة

الدمج الفيزيائي بجدول واحد للـ KB + المعتقدات wontfix (#79). الدردشة توحّد عبر الحقن؛ المخازن لا.


‏Settings → Memory (/settings?tab=memory) — العزل، مفاتيح المعرفة + الدردشة، المحوّلات (vector / state / graph)، اختبار/مزامنة Neo4j، والمُغلِّف embeddings (مُدمج في هذا التبويب).

عنصر التحكمالأثر
وضع المستأجرshared / per_platform / per_user
حقن المعرفة في الدردشةmerge_knowledge_into_chat (مفعّل افتراضيًا)
ترقية نتائج KB إلى حلقاتpromote_kb_to_episodes (نسخة ناعمة موسومة)
مخزن الرسمsqlite (افتراضي) أو كتابة مزدوجة neo4j
المتجهات / المُغلِّفsqlite-vec على عقدة واحدة؛ pgvector عند ضبط KAZMA_DATABASE_URL / state URL ‏(KAZMA_PGVECTOR=0 للبقاء المحلي)

روابط عميقة قديمة: ?tab=embedder → Memory (تمرير إلى المُغلِّف)؛ ?tab=connectors → LLM Providers → Platform Connectors.

حارس تنزيل المُغلِّف (2026-08-19): المُغلِّف local المُعدّ عمدًا قد ينزّل نموذجه عند أول استخدام، لكن المُغلِّفات الاحتياطية (مزوّد مجهول / إعداد remote معطوب) لا تفعل أبدًا — تتفقد خزنة HuggingFace المحلية وتتدهور إلى “بلا embeddings” مع تحذير قابل للتنفيذ بدل تعليق العملية على تنزيل bge-m3 بحجم ~2GB حيًّا. للسماح قسرًا: KAZMA_EMBED_ALLOW_DOWNLOAD=1.


الاستدعاء وما بعد الدور

Section titled “الاستدعاء وما بعد الدور”
  1. المعتقدات السارية (جسر الكيانات + مطابقة نصية + dense)
  2. بحث هجين في الحلقات (FTS5 + dense)
  3. تعزيز PPR لرسم الإيغو المحلي
  4. RRF / اقتطاع بالميزانية
  5. السياج: format_untrusted_block(..., source="memory_v2_recall")

**محرك dense:**‏ sqlite-vec ما دمت على عقدة SQLite واحدة. وعندما تمتلك العملية Postgres DSN بالفعل، يستخدم الاستدعاء pgvector (كتابة مزدوجة هجينة، أو remote-first إذا KAZMA_MEMORY_STATE_ROLE=primary). ‏Postgres-primary هو ILIKE متناثر + pgvector dense مدموجان بـ RRF — وليس ILIKE فقط. Qdrant الصريح في الإعدادات لا يُتجاوز أبدًا. مفتاح الإيقاف: KAZMA_PGVECTOR=0. فعّل CREATE EXTENSION vector على قاعدة البيانات.

  • مرآة حلقة working/recall
  • استخراج معتقدات استدلالي (+ طابور LLM اختياري) → mutate_belief
  • النظافة ترفض مواضيع المكدّس/الإصدارات (مثل kazma_v2_4_0 الخطأ في قراءتها كإصدار منتج)
  • كتابة مزدوجة: مرآة حالة Postgres الاختيارية + رفع حواف Neo4j
  • مرساة الإيغو — كل موضوع غير مركزي لا يصل أصلًا إلى user يحصل على user → related_to → <subject> وقت الكتابة (أوراق الحِمل والعناقيد العائمة). كائنات الحِمل (fully_clean، المسارات) لا تُسكك ككيانات مفاهيمية (ذلك السكّ كان يتخطى حافة المركز). إعادة ملء Idempotent على الـ sweep كل 6 ساعات.
  • الإبطال / الإحلال / مسح الرسم يضعون شواهد القبور في مرآة Postgres ويحذفون حواف Neo4j بجدية محدودة (المسح الشامل يستخدم clear_tenant_edges).
الإيقاعالعمل
~6 ساعاتmacro_sleep (الاضمحلال / نقل الطبقات) + إعادة ملء مراسى الإيغو + عدّ انحراف FTS ‏(*_docsize مقابل الأساس؛ إعادة بناء عند عدم التطابق)
~24 ساعةالنسخ الاحتياطي الأصلي + تصدير JSONL/GraphML/الحلقات/الدموجات/التدقيق + تحذير انحراف المرآة
~24 ساعةglobal_reconsolidation (إزالة تكرار + إعادة تضمين؛ مُقسَّم للجسام الكبيرة؛ يعيد حساب عدّادات الكيانات)
~15 دقيقةتنظيف commitment

جسام ضخمة: تقسيم بتجزئة الموضوع + مهام طابور متسلسلة (انظر global_reconsolidation.py).

يكتب التصدير الليلي kazma_beliefs_latest.jsonl وGraphML، إضافة إلى الحلقات وbeliefs_archive وentity_merges (+ الأرشيف) و memory_audit_log (أسماء ملفات لكل مستأجر عندما لا يكون default). تبقى نسخ .db الأصلية مصدر الحقيقة للاستعادة.

انحراف مرآة Postgres (وقائع ميتة ما تزال حية في kazma_beliefs): يسجّل معالج الـ24 ساعة تحذيرًا. صالحح بـ:

Terminal window
python scripts/reconcile_memory_mirror.py --dry-run
python scripts/reconcile_memory_mirror.py

لا تضبط KAZMA_MEMORY_STATE_ROLE=primary حتى ينجح هذا الفحص — القصّ الواصل سيعيد إحياء الوقائع الموبَّقة.


مكتبة المعرفة + الدردشة (الدمج المنتجي)

Section titled “مكتبة المعرفة + الدردشة (الدمج المنتجي)”
  • الحقن — يستطيع المُنسّق إضافة كتل ملاحظات KB موسومة بجوار ذاكرة V2.
  • البحث الموحّدPOST /api/memory/v2/federated-search و”ابحث في كل المعرفة” بلوحة التحكم (رقاقات MEM / KB).
  • الترقية — نسخة ناعمة اختيارية لأبرز نتائج KB في الحلقات (وليس SPO ثلاثي بلا أصل).

تعمّق: قاعدة المعرفة وRAG.


‏Neo4j (كتابة مزدوجة اختيارية)

Section titled “‏Neo4j (كتابة مزدوجة اختيارية)”
  • مصدر الحقيقة للمعتقدات يبقى SQLite (ثنائي الزمن، scrub، فلاتر اللوحة).
  • طوبولوجيا اللوحة تُرسم من SQLite عند تهيئة Neo4j (الأنواع + ثنائية الزمن).
  • يتلقى Neo4j كتابة مزدوجة عند كل تغيير؛ وSync beliefs → Neo4j يملأ الصفوف القائمة.
  • الإبطال الناعم / الإحلال / مسح الرسم يحذفون حواف Neo4j بجدية محدودة (بنطاق المستأجر). لا ينبغي أن تحتاج مزامنة يدوية بعد Clear graph.
  1. شغّل Neo4j (مثلًا docker compose -f deploy/docker-compose.neo4j.yml up -d).
  2. Settings → Memory → Graph store Neo4j، العنوان bolt://localhost:7687، كلمة السر، Save.
  3. Test Neo4j (كلمات السر المقنّعة *** لا تطغى على سر الخزنة).
  4. Sync beliefs → Neo4j.

افتراضي تثبيت البيئة (فاشل-منفتح)

Section titled “افتراضي تثبيت البيئة (فاشل-منفتح)”
Terminal window
export KAZMA_NEO4J_DEFAULT=1
export KAZMA_NEO4J_PASSWORD=...
# optional: KAZMA_NEO4J_URL=bolt://localhost:7687

إن لم يُضبط، يبقى مزوّد الرسم الافتراضي sqlite. وسقوط الخادم → تعود الطوبولوجيا إلى SQLite.


اللوحةالدور
الذاكرة والحوكمةصحة المكوّنات (مكدّس V2، Neo4j، حقن KB، الحزم)
المحرك المعرفي V2المؤشرات، probe/federated، الطابور، لوحة الطوبولوجيا
الطوبولوجيارسم من SQLite؛ تلوين واجهة؛ مسار-من-استعلام؛ طبقة الحلقات؛ PNG/SVG

واجهة إدارة الذاكرة (/memory)

Section titled “واجهة إدارة الذاكرة (/memory)”

سطح مشغّل واحد لطوبولوجيا + كيانات + معتقدات + نظافة (memory.html + memory_console.js + memory.js + memory_api.py).

  1. الرسم والصحة (أعلى) — لوحة معتقدات V2، المؤشرات، probe، النسخ الاحتياطية.
  2. تبويبات العمليات — الكيانات، المعتقدات، الدموجات المعلّقة، النظافة.

قدرات المشغّل (تحديث 2026-08)

Section titled “قدرات المشغّل (تحديث 2026-08)”
القدرةأينملاحظات
ترقيم صفحات + عدّادات حقيقيةكل تبويبات القوائم”يعرض 1–150 من 3,412” + Load more. يبلّغ الرسم عن total_nodes/truncated بلافتة كهرمانية عند الاقتطاع — متضمنة الوصلات المخفية بالتقطيع. لا المزيد من سقف 200 صف الصامت.
بحث غير حساس للتشكيلصناديق بحث الكيانات والمعتقداتيمر عبر beliefs_fts / entities_fts ‏(FTS5) — ‏francais يطابق Français، والأسماء البديلة قابلة للبحث. يعود إلى LIKE إذا غاب FTS.
”لماذا استُدعي”درج المعتقدانقر معتقدًا → ترى recalled N× · last <date> · via <method> · from <episode>، مع زر Probe from this belief →. نقطة النهاية: GET /beliefs/{id}/recall-trail.
تراجعتوست الإجراءإبطال الدُفعات، الربط، التحرير، حذف الكيان تعيد إيصالًا + رمز تراجع للاستخدام الواحد لمدة 60 ثانية؛ التوست فيه زر [Undo]. الدموج يظهر إيصال “N معتقدات أعيد توصيلها” (غير قابل للتراجع — استعد من نسخة احتياطية).
تحرير معتقد مفردزر Edit في صف المعتقدنموذج واحد منبثق (subject/predicate/object)، لا موجّه متعدد الخطوات.
شريط عمليات واحدشريط Ops بالرسمأُزيلت بطاقة Link/merge المكررة — شريط Ops في الرسم هو مصدر الحقيقة الوحيد؛ زرا Src/Tgt في الصف + Shift-click يتزامنان معه.
تعدد المستأجرينمتغير بيئةKAZMA_MEMORY_ENFORCE_TENANT=1 يقيّد القراءات وتغييرات المعرّف ورموز التراجع ومسح الرسم بالمستأجر المطلوب. مطفأ افتراضيًا (default أحادي المستأجر). لا يوجد مسح لكل المستأجرين. ملاحظة: entities.id مفتاح أساسي عام، لا لكل مستأجر.
تجميع / فك تجميعفحص الرسمعنقودية للعرض فقط (POST/DELETE /api/memory/v2/graph/groups*). لا تغيّر المعتقدات. واستقصاء اللوحة كل 30 ثانية يستخدم المجموعات الموجودة أصلًا في GET /api/memory/v2/graph (بلا جلب إضافي).

**الأداء:**‏ belief_count / graph_degree للكيان أعمدة مجسَّدة (تُصان على كل كتابة، وتشفى ذاتيًا من قيمة -1 الحارسة)، فتقرأ الصفحة عدّادات محسوبة مسبقًا بدل استعلامات مترابطة O(entities×beliefs) عند كل تحميل — تسريع ~10× لفتح الصفحة عند التوسع.

ثوابت الرسم (مصدر حقيقة اللوحة)

Section titled “ثوابت الرسم (مصدر حقيقة اللوحة)”
القاعدةلماذا
معرّفات عقد فريدة في الحِمل_v2gIds[id] في اللوحة last-write-wins؛ المعرّفات المكررة تُيتُم عقدة (خطأ “shipx المزدوج” القديم).
الكيان يتغلب على الواقعة الافتراضيةعندما يساوي نص كائن المعتقد معرّف كيان (user → has_project → shipx)، تُصدَّر عقدة كيان حقيقية واحدة — لا توأم isVirtual ثانٍ بنفس المعرّف.
لا وصلات معلّقةمصدر وهدف الوصلة يجب أن ينجوا من الفلاتر (entity_type، الحد).
المركز دائمًا id=userتنسيق “أنت” في الوسط؛ واسم العرض من entities.user.name (مثل Mubder).
مواضيع الحِمل تلتصق بالمركزالواقعة التي كائنها حرفي (لا كيان آخر) تحصل مع ذلك على user → related_to → <subject> حتى لا يصبح المفهوم مكوّنًا عائمًا.

إعادة التسمية للعرض (لا إعادة كتابة للمعرّف)

Section titled “إعادة التسمية للعرض (لا إعادة كتابة للمعرّف)”
  • الـ API:POST /api/memory/v2/entities/{id}/rename بجسم { "name": "ShipX" }.
  • المعرّف الكانوني يبقى ثابتًا فتبقى مواضيع/أهداف المعتقدات موصولة.
  • التسميات السابقة تلج aliases_json (الحل يجد الأسماء القديمة أيضًا).
  • الواجهة: فحص الرسم Rename، وجدول الكيانات Rename.
  • تحدّث اللوحة التسميات ناعمًا عند تغيّر الأسماء فقط (لا تُصفّر التخطيط).

هوية الذات / المركز (User → Mubder)

Section titled “هوية الذات / المركز (User → Mubder)”

غالبًا ما ينشئ الإعادة-الملء والمستخرجات قشرة شخص (ent_<hash> اسمها User) منفصلة عن المركز التخليقي user. وكلاهما هوية المشغّل نفسها للواجهة:

المفهومالسلوك
memory/self_hub.pyيكشف تسميات الذات (user / you / الأسماء البديلة) وقشور الأشخاص
إعادة تسمية قشرة الذات → العلامةيرفع أيضًا entities.id=user بذلك الاسم
صف القائمةis_self: true وgraph_id: "user" — النقر يركّز المركز
رسم اللوحةيطوي معرّفات الذات على عقدة مركز واحدة؛ التسمية = اسم عرض المركز

فإعادة تسمية User → Mubder على ent_… تجعل مركز اللوحة يعرض Mubder، لا “You” مبرمجة.

منإلى
النقر على صف كيان / معتقدتحديد + تقريب على اللوحة (_v2gSelectEntity / _v2gSelectBelief)
النقر المزدوج على عقدة الرسمإبراز صف القائمة المطابق + تمرير العمليات (kazma:memory-graph-select)
النقر المفرد / سحب العقدةتحديد + فحص فقط — لا تقفز الصفحة (استكشاف حر)
سحب العقدة ثم إفلاتهاتُثبَّت العقدة في موضعها (ينجو عبر التحديث / تغيير الفلاتر)
فحص In listقفزة صريحة إلى القائمة (كالنقر المزدوج)
دموج / ربط / إبطال / إعادة تسميةتحديث حِمل الرسم؛ المواضع المثبتة تُستعاد من خزنة العميل
  • الـ API:PATCH /api/memory/v2/beliefs/{id} بأيٍّ من subject / predicate / object / predicate_type.
  • المعتقدات النشطة فقط (لا المبطَلة/المُحلّاة).
  • يضبط extraction_method=user_explicit؛ ويمسح الـ embedding عند تغيّر نص الكائن (محقّنات FTS تبقي البحث متزامنًا).
  • الواجهة: تبويب Beliefs → Edit (موجّهات للكائن ثم predicate ثم subject).

بقية عمليات الكيانات (العقد نفسها)

Section titled “بقية عمليات الكيانات (العقد نفسها)”
الإجراءالمسار
قائمة / فلترةGET /api/memory/v2/entities
دموج القشورPOST /api/memory/v2/entities/merge
ربط كيانينPOST /api/memory/v2/entities/link
حذف قشرة فارغةDELETE /api/memory/v2/entities/{id} (ليس معرّفات المراكز المحمية). تنسخ صفوف entity_merges إلى entity_merges_archive أولًا (يُسقط FK صفوف السجل الحية).
إبطال معتقدPOST /api/memory/v2/beliefs/{id}/invalidate (+ دفعات)

الوحدةالغرض
memory/recall.pyالاستدعاء الموحّد
memory/belief_mutation.py / belief_extractor.pyمسار الكتابة + السياج/النظافة؛ INSERT OR IGNORE مع عدّ الصفوف + rollback
memory/hygiene.pyالمواضيع المحجوبة، شفاء FTS الذاتي، الإبطال + حذف الرسم
memory/ego_anchor.pyحواف المركز لمواضيع الأوراق ذات كائنات الحِمل
memory/fts_health.pyعدّ دوري لـ *_docsize في FTS مقابل الأساس + إعادة بناء
memory/entity_counts.pyمصدر حقيقة وحيد لـ SQL ‏belief_count / graph_degree
memory/self_hub.pyاسم عرض المركز + طيّ قشور أشخاص الذات
memory/graph_backend.pySQLite افتراضي + كتابة Neo4j المزدوجة + مسح حواف بنطاق المستأجر
memory/backends.pyمصنع المتجهات / الحالة / الرسم؛ الاختيار التلقائي لـ pgvector؛ افتراضيات Neo4j من البيئة
memory/federated_search.pyبحث موسوم للذاكرة + KB
memory/global_reconsolidation.pyإزالة تكرار + إعادة تضمين (مقسّمة)
memory/worker_bootstrap.pyمعالجات الطابور + المُجدوِلات
memory/v2_health.py / health.pyواجهات الصحة للوحة التحكم / الحزم
kazma_ui/memory_api.pyمسارات إدارة /memory (إعادة تسمية، تحرير، دموج، نظافة)
kazma_ui/static/js/memory_console.jsلوحة V2 + إعادة تسمية الفحص
kazma_ui/static/js/memory.jsقوائم الكيانات/المعتقدات + جسر القائمة↔الرسم

التوسّع (عند الحاجة فقط)

Section titled “التوسّع (عند الحاجة فقط)”
الاحتياجالتتبّع
استدعاء كامل بـ Postgres-primary#76 — المحوّل صدر؛ فعّله فقط بعد نظافة reconcile_memory_mirror.py
تعدد المناطق + التعارضات#77
أسطول تضمين مُستضاف#78

المرآة المزدوجة لـ Postgres والمساعدة المتناثرة ILIKE موجودتان أصلًا كأساسين اختياريين. شواهد القبور تنتشر الآن؛ والانحراف الليلي يحذّر إن كانت المرآة ما تزال تحمل وقائع ميتة.


تراجع استدعاء المحادثات السابقة (2026-08)

Section titled “تراجع استدعاء المحادثات السابقة (2026-08)”

الوقائع التي تعيش فقط في نصوص محادثات سابقة (قائمة أسماء مختصرة، جدول قرارات) تكون خفية عن استدعاء V2 — فالاستدعاء يقرأ المعتقدات/الحلقات، لا نص الجلسات الخام. وحتى 2026-08-27 عوّض الوكيل ذلك بكتابة SQL يدويًا ضد chat_sessions.db (مهمة واحدة حرق 21 دورة وبوابة YOLO للإجابة على “ماذا قررنا سابقًا؟”).

الآن، عندما يعيد استدعاء V2 لا شيئًا لاستعلام ما، يبحث المُنسّق تلقائيًا في جلسات الدردشة السابقة (العنوان + نص الرسالة؛ أطول المصطلحات وأكثرها تحديدًا تربح، مطابقات العنوان تتصدر، والعربية مدعومة) ويحقن أبرز النتائج كتلةً مسوَّرة غير موثوقة في الـ prompt (بمصدر chat_history) بجوار كتلة الذاكرة — صفر دورات إضافية، بلا أدوات خطرة، بلا صلاحيات. ودورات استدعاء-مكبوت تتخطاه أيضًا.

  • قراءة فقط، يفتح kazma-data/chat_sessions.db بالمسار، ولا يرفع استثناء أبدًا (غياب المخزن = لا شيء بصمت).
  • مفتاح الإيقاف: KAZMA_TRANSCRIPT_RECALL=0 في البيئة أو memory.transcript_fallback=false في ConfigStore (يُقرأ حيًّا، مفعّل افتراضيًا).
  • الوحدة: kazma_core/memory/transcript_recall.py؛ موصولة في graph_supervisor.py (سطر السجل: [Supervisor] transcript fallback: N past-session hit(s)).
  • نصيحة للوقائع الدائمة: بعد أن يجدها الوكيل، قل له تذكّرها نهائيًا — تخزين المستخدم الصريح يصبح معتقدًا عالي الثقة يستدعيه الاستدعاء أولًا، بلا حاجة للتراجع.