
حوّل أي مجموعة من المستندات إلى رسم بياني للمعرفة. استخرج الكيانات والعلاقات عبر LLM، وأزل التكرار بموافقتك. حدد المجالات، واكتشف الروابط المخفية، وابحث عن الأنماط عبر المستندات — معرفة تدوم وتتراكم، لك ولعوامل الذكاء الاصطناعي الخاصة بك. كل ذلك من CLI.
حول أي مجموعة من المستندات إلى رسم بياني معرفي.
لا كود، لا قاعدة بيانات، لا بنية تحتية — فقط واجهة سطر أوامر و مستنداتك. أسقط ملفات PDF، أوراق بحثية، مقالات، أو سجلات — احصل على رسم بياني معرفي قابل للتصفح يوضح كيف يتصل كل شيء، في دقائق. sift-kg يستخرج الكيانات والعلاقات عبر LLM، ويزيل التكرار بموافقتك، ويولد عارضًا تفاعليًا يمكنك استكشافه في متصفحك. خرائط مفاهيم لأي شيء، في متناول يدك.
نفس الرسم البياني الذي يدعم تصوراتك يعمل أيضًا كـ دماغ ثانٍ للذكاء الاصطناعي. الجميع يقضون شهورًا في بناء قواعد معرفية في Notion و Obsidian. من لديه وقت لذلك؟ sift-kg هي الذاكرة المهيكلة التي تبنيها في دقيقتين بدلاً من عامين. فقط أشر إلى مستنداتك وسيحصل ذكاؤك الاصطناعي على فهم مهيكل لكيفية اتصال كل شيء.
عروض توضيحية حية → رسوم بيانية تم إنشاؤها بالكامل بواسطة sift-kg```bash pip install sift-kg
sift init # create sift.yaml + .env.example sift extract ./documents/ # extract entities & relations sift build # build knowledge graph sift resolve # find duplicate entities sift review # approve/reject merges interactively sift apply-merges # apply your decisions sift narrate # generate narrative summary sift view # interactive graph in your browser sift export graphml # export to Gephi, yEd, Cytoscape, SQLite, etc.
## كيف يعمل```
Documents (PDF, DOCX, text, HTML, and 75+ formats)
↓
Text Extraction (Kreuzberg, local) — with optional OCR (Tesseract, EasyOCR, PaddleOCR, or Google Cloud Vision)
↓
Schema Discovery (LLM designs entity/relation types from your data — or use a predefined domain)
↓
Entity & Relation Extraction (LLM, using discovered or predefined schema)
↓
Knowledge Graph (NetworkX, JSON)
↓
Entity Resolution (LLM proposes → you review)
↓
Narrative Generation (LLM)
↓
Interactive Viewer (browser) / Export (GraphML, GEXF, CSV, SQLite)
كل كيان وعلاقة يرتبط بالمستند والمقطع المصدر. أنت تتحكم فيما يتم دمجه. الرسم البياني ملكك.
sift.yaml في مشروعك للإعدادات الدائمةdiscovered_domain.yaml لإعادة الاستخدام والتحرير. أو استخدم نطاقًا منظمًا (general, osint, academic) لمخططات ثابتة، أو حدد الخاص بك في YAMLsift search "SBF" يجد الكيانات بالاسم أو الاسم المستعار، مع إخراج اختياري للعلاقة والوصف--neighborhood, --top, --community, --source-doc, يقوم sift-kg بتوليد معرفة منظمة يمكن لوكلاء الذكاء الاصطناعي العمل منها مباشرة.
وجه sift إلى مستنداتك، ملاحظاتك، أو ملفات مشروعك. الناتج — رسم بياني معرفي بصيغة JSON — يمنح أي وكيل ذكاء اصطناعي فهمًا دائمًا ومنظمًا لكيفية اتصال كل شيء في عالمك. لا تنظيم يدوي، لا وسم، لا روابط ويكي. الهيكل ينبثق من المحتوى.```bash sift extract ./my-stuff/ sift build sift topology # structural overview (JSON, for agents) sift query "topic" # entity neighborhood subgraph (JSON, for agents) sift search "X" --json # entity lookup (JSON, for agents) sift info --json # project stats (JSON, for agents)
الرسم البياني يستمر عبر الجلسات وينمو بشكل تدريجي — استخرج مستندات جديدة في نفس دليل الإخراج وأعد البناء. يضمن إلغاء تكرار الكيانات بقاء الرسم البياني متماسكًا مع نموه.
**ما يمنحه ذلك لعامل الذكاء الاصطناعي الخاص بك:**
- **البنية** — ليس فقط أجزاء النص، بل الكيانات والعلاقات والمجتمعات وكيفية اتصالها
- **الطوبولوجيا** — أي عناقيد المعرفة موجودة، وما يربطها، وما هو معزول
- **المتانة** — الرسم البياني ينجو من إعادة تعيين نافذة السياق. يتوقف عامل الذكاء الاصطناعي الخاص بك عن البدء من الصفر في كل جلسة
**مهارة العامل المرفقة:** يأتي sift-kg مع مهارة في `.agents/skills/sift-kg/SKILL.md` تعلم الوكلاء كيفية استخدام الرسم البياني للمعرفة كذاكرة دائمة — التوجيه في الجلسة، استكشاف الكيانات، التفكير في ربط جزر المعرفة، وتوليد الاقتراحات المدعومة.
## المجالات المرفقة
يأتي sift-kg مع مجالات متخصصة يمكنك استخدامها فورًا:```bash
sift domains # list available domains
sift extract ./docs/ --domain-name osint # use a bundled domain
اضبط نطاقًا في ملف sift.yaml حتى لا تحتاج إلى العلامة في كل مرة:```yaml
domain: academic
يعمل مع الأسماء المضمنة (`schema-free`, `general`, `osint`, `academic`) أو مسار إلى ملف YAML مخصص.
| المجال | التركيز | أنواع الكيانات الرئيسية | أنواع العلاقات الرئيسية |
|--------|---------|------------------------|------------------------|
| `schema-free` | يُكتشف تلقائيًا من بياناتك (افتراضي) | *(يُصممها LLM لكل مجموعة)* | *(يُصممها LLM لكل مجموعة)* |
| `general` | تحليل عام للمستندات | PERSON, ORGANIZATION, LOCATION, EVENT, DOCUMENT | ASSOCIATED_WITH, MEMBER_OF, LOCATED_IN |
| `osint` | التحقيقات وطلبات حرية المعلومات | SHELL_COMPANY, FINANCIAL_ACCOUNT | BENEFICIAL_OWNER_OF, TRANSACTED_WITH, SIGNATORY_OF |
| `academic` | مراجعة الأدبيات ورسم خرائط الموضوعات | CONCEPT, THEORY, METHOD, SYSTEM, FINDING, PHENOMENON, RESEARCHER, PUBLICATION, FIELD, DATASET | SUPPORTS, CONTRADICTS, EXTENDS, IMPLEMENTS, EXPLAINS, PROPOSED_BY, USES_METHOD, APPLIED_TO, INVESTIGATES |
يقوم مجال **academic** برسم الخريطة الفكرية لمنطقة بحثية — قم بإدخال الأوراق واحصل على رسم بياني لكيفية ترابط النظريات والطرق والأنظمة والنتائج والمفاهيم. يميز بين الأفكار المجردة (THEORY, METHOD) والتحف الملموسة (SYSTEM — مثل GPT-2, BERT, GLUE). مصمم لمراجعات الأدبيات ورسم خرائط الموضوعات وفهم أين تتفق الأفكار أو تتعارض أو تبني على بعضها البعض.
مجال **schema-free** (الافتراضي) يقوم بتشغيل خطوة **اكتشاف المخطط** قبل الاستخراج — استدعاء LLM واحد يأخذ عينات من مستنداتك ويصمم أنواع الكيانات والعلاقات المخصصة للمجموعة. يتم حفظ المخطط المكتشف في `output/discovered_domain.yaml` ويتم إعادة استخدامه في التشغيلات اللاحقة، بحيث تظل الأنواع متسقة عبر جميع الأجزاء والمستندات. يمكنك فحص الملف أو تحريره يدويًا أو نسخه كنقطة بداية لمجال مخصص. استخدم `--force` لإعادة الاكتشاف. بدلاً من فرض العلاقات في فئات محددة مسبقًا مثل ASSOCIATED_WITH، فإنه ينتج أنواعًا محددة مثل FUNDED, TESTIFIED_AGAINST, أو ENROLLED_AT. استخدم مجالًا منظمًا مثل `general` أو `osint` عندما تريد مخططًا ثابتًا تحدده مسبقًا.
يوفر مجال **general** مخططًا ثابتًا بأنواع كيانات PERSON, ORGANIZATION, LOCATION, EVENT, DOCUMENT بالإضافة إلى أنواع العلاقات الشائعة. مفيد عندما تريد أنواعًا متوقعة ومتسقة عبر المستندات.
يضيف مجال **osint** أنواع كيانات للشركات الوهمية والحسابات المالية والولايات القضائية الخارجية، بالإضافة إلى أنواع علاقات لتتبع الملكية المستفيدة والتدفقات المالية.
لا يتم دمج أي شيء دون موافقتك — يقترح LLM، وتتحقق أنت. كل استخراج يرتبط بالمستند والمقطع المصدر.
انظر [`examples/transformers/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/transformers/) لـ 12 ورقة أساسية في الذكاء الاصطناعي تم رسمها كرسم بياني للمفاهيم (425 كيانًا، ~0.72 دولار)، و [`examples/ftx/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/ftx/) لانهيار FTX (431 كيانًا من 9 مقالات). [**استكشف العروض التوضيحية المباشرة**](https://juanceresa.github.io/sift-kg/) — بدون تثبيت، بدون مفتاح API.
## Civic Table
هل تبحث عن منصة مستضافة مع تحليل قانوني جنائي وتحقق من قبل المحللين؟
[**Civic Table**](https://github.com/juanceresa/forensic_analysis_platform) هي منصة استخبارات جنائية مبنية على خط أنابيب sift-kg. تضيف نظام تحقق من 4 مستويات حيث يقوم المحللون وخبراء القانون (JDs) بالتحقق من الحقائق المستخرجة بواسطة الذكاء الاصطناعي قبل معاملتها كأدلة، وتوليد ملفات LaTeX للتقديمات القانونية، وواجهة ويب لمشاركة النتائج مع العملاء والعائلات. مصممة لاستعادة الممتلكات والصحافة الاستقصائية وأي سياق تكون فيه سلسلة مصدر الوثائق مهمة.
sift-kg هي واجهة سطر الأوامر مفتوحة المصدر. Civic Table هي المنصة الكاملة — وحيث يتم تدقيق المخرجات من قبل المحللين وخبراء القانون قبل أن تحمل وزنًا إثباتيًا.
## التثبيت
يتطلب Python 3.11+.```bash
pip install sift-kg
لدعم التعرف البصري على الأحرف (OCR) (ملفات PDF ممسوحة ضوئيًا، صور):```bash
brew install tesseract # macOS sudo apt install tesseract-ocr # Ubuntu/Debian
بالنسبة لـ Google Cloud Vision OCR كواجهة خلفية بديلة (اختياري):```bash
pip install sift-kg[ocr]
# Then use: sift extract ./docs/ --ocr --ocr-backend gcv
للتجميع الدلالي أثناء حل الكيان (اختياري، ~2GB لـ PyTorch):```bash pip install sift-kg[embeddings]
للتطوير:```bash
git clone https://github.com/juanceresa/sift-kg.git
cd sift-kg
pip install -e ".[dev]"
sift init # creates sift.yaml + .env.example cp .env.example .env # copy and add your API key
`يُولد `sift init` ملف إعدادات المشروع `sift.yaml` بحيث لا تحتاج إلى وسوم في كل أمر:````yaml
# sift.yaml
domain: domain.yaml # or a bundled name like "osint"
model: openai/gpt-4o-mini
ocr: true # enable OCR for scanned PDFs
# extraction:
# backend: kreuzberg # kreuzberg (default, 75+ formats) | pdfplumber
# ocr_backend: tesseract # tesseract | easyocr | paddleocr | gcv
# ocr_language: eng
قم بتعيين مفتاح API الخاص بك في .env:```
SIFT_OPENAI_API_KEY=sk-...
أو استخدم Anthropic أو Mistral أو Ollama أو أي مزود LiteLLM:```
SIFT_ANTHROPIC_API_KEY=sk-ant-...
SIFT_MISTRAL_API_KEY=...
Settings priority: CLI flags > env vars > .env > sift.yaml > defaults. You can override anything from sift.yaml with a flag on any command.
sift extract ./my-documents/ sift extract ./my-documents/ --ocr # local OCR via Tesseract sift extract ./my-documents/ --ocr --ocr-backend gcv # Google Cloud Vision OCR sift extract ./my-documents/ --extractor pdfplumber # legacy pdfplumber backend
يدعم قراءة أكثر من 75 تنسيقًا للمستندات — PDFs، DOCX، XLSX، PPTX، HTML، EPUB، الصور، والمزيد. يستخرج الكيانات والعلاقات باستخدام نموذج اللغة الكبير (LLM) الذي قمت بتكوينه. يتم حفظ النتائج بصيغة JSON في `output/extractions/`.
العلامة `--ocr` تمكن OCR محلي عبر Tesseract لملفات PDF الممسوحة ضوئيًا — لا حاجة لمفاتيح API أو خدمات سحابية. يمكنك تبديل محركات OCR باستخدام `--ocr-backend`:```bash
sift extract ./docs/ --ocr # Tesseract (default, local)
sift extract ./docs/ --ocr --ocr-backend easyocr # EasyOCR (local)
sift extract ./docs/ --ocr --ocr-backend paddleocr # PaddleOCR (local)
sift extract ./docs/ --ocr --ocr-backend gcv # Google Cloud Vision (requires credentials)
يتم الكشف تلقائيًا عن ملفات PDF التي تحتاج إلى OCR — ملفات PDF الغنية بالنصوص تستخدم الاستخراج القياسي، فقط الصفحات شبه الفارغة تلجأ إلى OCR. آمن للمجلدات المختلطة. بدون --ocr، سيقوم sift بالتحذير إذا بدا أن ملف PDF ممسوح ضوئيًا.
يمكنك أيضًا تبديل محرك الاستخراج بالكامل باستخدام --extractor pdfplumber لمحرك pdfplumber القديم (PDF/DOCX/TXT/HTML فقط).
sift build
ينشئ رسمًا بيانيًا NetworkX من جميع الاستخراجات. يقوم تلقائيًا بإزالة التكرارات لأسماء الكيانات المتطابقة تقريبًا (الجمع، متغيرات Unicode، اختلافات حالة الأحرف) قبل أن تصبح عقدًا في الرسم البياني. يصلح اتجاهات الحواف المعكوسة عندما يقوم LLM بتبديل أنواع المصدر/الهدف مقابل مخطط المجال. يضع علامات على العلاقات منخفضة الثقة للمراجعة. يحفظ في `output/graph_data.json`.
### 4. حل الكيانات المكررة
انظر [سير عمل حل الكيانات](#entity-resolution-workflow) أدناه للحصول على الدليل الكامل — مهم بشكل خاص لحالات استخدام علم الأنساب والقانون والتحقيقات حيث تكون الدقة مهمة.
### 5. استكشاف وتصدير
**عارض تفاعلي** — استكشف خريطة المفاهيم الخاصة بك في المتصفح:```bash
sift view # full graph
sift view --neighborhood "Palantir Technologies" # 1-hop ego graph around an entity
sift view --neighborhood "Palantir" --depth 3 # 3-hop neighborhood
sift view --top 10 # top 10 hubs + their neighbors
sift view --community "Community 1" # focus on a specific community
sift view --source-doc palantir_nsa_surveillance # entities from one document
sift view --min-confidence 0.8 # hide low-confidence nodes/edges
يفتح رسمًا بيانيًا موجهًا بالقوة في متصفحك. تُظهر النظرة العامة مناطق المجتمع — مجموعات محدبة ملونة تجمع الكيانات ذات الصلة — حتى تتمكن من رؤية هيكل الرسم البياني في لمحة دون فوضى التسميات. مرر فوق أي عقدة لمعاينة اسمها واتصالاتها. يتضمن البحث، ومفاتيح تبديل النوع/المجتمع/العلاقة، وفلتر المستند المصدر، وفلتر الدرجة، وشريط جانبي للتفاصيل.
تعمل علامات التصفية المسبقة (--top, --neighborhood, --source-doc, --min-confidence) على تقليل الرسم البياني قبل التقديم. --community يحدد مسبقًا مجتمعًا في الشريط الجانبي. --neighborhood يقبل معرفات الكيانات (person:alice) أو أسماء العرض (غير حساسة لحالة الأحرف).
وضع التركيز: انقر نقرًا مزدوجًا فوق أي كيان لعزل جيرانه. استخدم مفاتيح الأسهم للتنقل عبر الاتصالات واحدًا تلو الآخر — يتم عرض كل زوج في عزلة مع حواف موسومة. اضغط على Enter/يمين لتحويل التركيز إلى جار، Backspace/يسار للعودة على طول مسارك، Escape للخروج. يتم تتبع استكشافك كـ أثر فتات الخبز في الشريط الجانبي — مسار مستمر يظهر كل عقدة زرتها والعلاقات بينها. تظل حواف الأثر مظللة على اللوحة حتى تتمكن من رؤية مسارك عبر الرسم البياني. هذه هي الطريقة المقصودة لاستكشاف الرسوم البيانية الكثيفة — قم بالتكبير على ما يهم، تتبع الاتصالات، اقرأ الأدلة.
بحث CLI — استعلام عن الكيانات مباشرة من الطرفية:```bash sift search "Sam Bankman" # search by name sift search "SBF" # search by alias sift search "Caroline" -r # show relations sift search "FTX" -d -t ORGANIZATION # descriptions + type filter
**الصادرات الثابتة** — لأدوات التحليل حيث تريد تخطيطًا مخصصًا أو تصفية أو تنسيقًا:```bash
sift export graphml # → output/graph.graphml (Gephi, yEd, Cytoscape)
sift export gexf # → output/graph.gexf (Gephi native)
sift export sqlite # → output/graph.sqlite (SQL queries, DuckDB, Datasette)
sift export csv # → output/csv/entities.csv + relations.csv
sift export json # → output/graph.json
استخدم GraphML/GEXF عندما تريد التحكم في تحجيم العقد، وزن الحواف، مخططات الألوان المخصصة، أو تطبيق خوارزميات الرسم البياني (المركزية، اكتشاف المجتمعات) في أدوات مخصصة. SQLite مفيد لاستعلامات SQL المخصصة، نشر Datasette، أو التحميل إلى DuckDB.
sift narrate sift narrate --communities-only # regenerate community labels only (~$0.01)
يُنتج `output/narrative.md` — تقريرًا نثريًا يتضمن نظرة عامة، وسلاسل علاقات رئيسية بين الكيانات العليا، وجدولًا زمنيًا (عند وجود تواريخ في البيانات)، وملفات تعريف الكيانات مجمعة حسب المجتمع الموضوعي (الذي تم اكتشافه عبر اكتشاف المجتمع بلوفان). تصاغ أوصاف الكيانات بصيغة الفعل المعلوم مع أفعال محددة، وليس ملخصات للأدوار.
## تكوين المجال
يحتوي sift-kg على أربعة مجالات مرفقة (انظر [المجالات المرفقة](#bundled-domains) أعلاه للتفاصيل). الافتراضي هو `schema-free`.
استخدم مجالًا مرفقًا:```bash
sift extract ./docs/ --domain-name osint
أو أنشئ ملف domain.yaml الخاص بك:```yaml
name: My Domain
fallback_relation: RELATED_TO # optional — catch-all for relations that don't fit defined types
entity_types:
PERSON:
description: People and individuals
extraction_hints:
- Look for full names with titles
COMPANY:
description: Business entities
DEPARTMENT:
description: Named departments within a company
canonical_names: # closed vocabulary — only these values allowed
- Engineering
- Sales
- Legal
- Marketing
canonical_fallback_type: ORGANIZATION # non-canonical names get retyped
relation_types:
EMPLOYED_BY:
description: Employment relationship
source_types: [PERSON]
target_types: [COMPANY]
OWNS:
description: Ownership relationship
symmetric: false
review_required: true
RELATED_TO: # define the fallback type if you use one
description: General relationship
**فرض المخطط:** يتم التعامل مع أنواع الكيانات وأنواع العلاقات المحددة في نطاقك كمجموعة مغلقة — يُوجه نموذج اللغة الكبير (LLM) لاستخدام هذه الأنواع فقط ولن يخترع أنواعًا جديدة. إذا تم تعيين `fallback_relation`، فسيتم تعيين العلاقات التي لا تتوافق مع أي نوع محدد إلى النوع الاحتياطي. إذا تم حذفه، يستخدم النموذج (LLM) أقرب نوع مطابق محدد بثقة أقل. إذا رأيت العديد من العلاقات تصل إلى النوع الاحتياطي الخاص بك، فمن المحتمل أن مخططك يفتقر إلى نوع علاقة تحتاجه البيانات — قم بإضافته وأعد الاستخراج.
أنواع الكيانات مع `canonical_names` تفرض مفردات مغلقة. يتم حقن الأسماء المسموح بها في موجه استخراج النموذج (LLM) بحيث يُخرج مطابقات تامة. كشبكة أمان، يتم إعادة تصنيف أي اسم مستخرج غير موجود في القائمة إلى `canonical_fallback_type` أثناء بناء الرسم البياني (أو يُحتفظ به كما هو إذا لم يتم تعيين احتياطي). مفيد للتصنيفات الخاضعة للرقابة — الأقسام، النطاقات القضائية، التصنيفات المحددة مسبقًا.```bash
sift extract ./docs/ --domain path/to/domain.yaml
استخدم sift-kg من بايثون — دفاتر Jupyter، النصوص، تطبيقات الويب:```python from sift_kg import load_domain, run_extract, run_build, run_narrate, run_resolve, run_export, run_view from sift_kg import KnowledgeGraph from pathlib import Path
domain = load_domain() # or load_domain(bundled_name="osint")
results = run_extract( Path("./docs"), "openai/gpt-4o-mini", domain, Path("./output"), ocr=True, ocr_backend="tesseract", # enable OCR for scanned PDFs extractor="kreuzberg", # or "pdfplumber" concurrency=4, chunk_size=10000, )
kg = run_build(Path("./output"), domain) print(f"{kg.entity_count} entities, {kg.relation_count} relations")
merges = run_resolve(Path("./output"), "openai/gpt-4o-mini", domain=domain, use_embeddings=True)
run_export(Path("./output"), "sqlite")
run_narrate(Path("./output"), "openai/gpt-4o-mini", communities_only=True)
run_view(Path("./output")) # full graph run_view(Path("./output"), neighborhood="person:alice", depth=2) # ego graph run_view(Path("./output"), top_n=10) # top hubs
from sift_kg import run_pipeline run_pipeline(Path("./docs"), "openai/gpt-4o-mini", domain, Path("./output"))
## هيكل المشروع
بعد تشغيل المسار، يحتوي دليل الإخراج الخاص بك على:```
output/
├── extractions/ # Per-document extraction JSON
│ ├── document1.json
│ └── document2.json
├── discovered_domain.yaml # Auto-discovered schema (schema-free mode)
├── graph_data.json # Knowledge graph (native format)
├── merge_proposals.yaml # Entity merge proposals (DRAFT/CONFIRMED/REJECTED)
├── relation_review.yaml # Flagged relations for review
├── narrative.md # Generated narrative summary
├── entity_descriptions.json # Entity descriptions (loaded by viewer)
├── communities.json # Community assignments (shared by narrate + viewer)
├── graph.html # Interactive graph visualization
├── graph.graphml # GraphML export (if exported)
├── graph.gexf # GEXF export (if exported)
├── graph.sqlite # SQLite export (if exported)
└── csv/ # CSV export (if exported)
├── entities.csv
└── relations.csv
عندما تقوم ببناء رسم بياني معرفي من سجلات العائلة، أو الملفات القانونية، أو أي مستندات حيث تكون الدقة مهمة، فإنك تريد السيطرة الكاملة على أي الكيانات يتم دمجها. لا يقوم sift-kg أبدًا بدمج أي شيء دون موافقتك.
يحتوي سير العمل على ثلاث طبقات، كل منها يكتشف أنواعًا مختلفة من التكرارات:
sift build)قبل أن تصبح الكيانات عُقدًا في الرسم البياني، يقوم sift بشكل حتمي بتجميع الأسماء المتطابقة بشكل واضح. لا حاجة إلى LLM، لا تكلفة، لا مراجعة مطلوبة:
يحدث هذا تلقائيًا في كل مرة تشغل فيها sift build. هذه هي الحالات التافهة — المتغيرات الإملائية التي من شأنها أن تزحم الرسم البياني دون إضافة معلومات.
sift resolve)يرى LLM دفعات من الكيانات (جميع الأنواع باستثناء DOCUMENT) ويحدد تلك التي من المحتمل أن تشير إلى نفس الشيء في العالم الحقيقي. كما يكتشف التكرارات عبر الأنواع (نفس الاسم، نوع كيان مختلف) ويقترح علاقات متغيرة (EXTENDS) عندما يجد أنماط أب/ابن. النتائج تذهب إلى merge_proposals.yaml (دمج الكيانات) و relation_review.yaml (العلاقات المتغيرة)، جميعها تبدأ كـ DRAFT:```bash
sift resolve # uses domain from sift.yaml
sift resolve --domain osint # or specify explicitly
إذا كان لديك نطاق مهيأ، فإن LLM يستخدم هذا السياق لاتخاذ أحكام أفضل حول أسماء الكيانات الخاصة بمجالك.
يؤدي هذا إلى توليد مقترحات مثل:```yaml
proposals:
- canonical_id: person:samuel_benjamin_bankman_fried
canonical_name: Samuel Benjamin Bankman-Fried
entity_type: PERSON
status: DRAFT # ← you decide
members:
- id: person:bankman_fried
name: Bankman-Fried
confidence: 0.99
reason: Same person referenced with full name vs. surname only.
- canonical_id: person:stephen_curry
canonical_name: Stephen Curry
entity_type: PERSON
status: DRAFT # ← you decide
members:
- id: person:steph_curry
name: Steph Curry
confidence: 0.99
reason: Same basketball player referenced with nickname 'Steph' and full name 'Stephen'.
لم يتم دمج أي شيء بعد. تقوم LLM بالاقتراح، وليس اتخاذ القرار.
لديك خياران لمراجعة الاقتراحات:
الخيار أ: مراجعة تفاعلية عبر الطرفية```bash sift review
يمر عبر كل اقتراح `DRAFT` واحدًا تلو الآخر. لكل منها، ترى الكيان الأساسي، وأعضاء الدمج المقترحين، وثقة LLM والمنطق. توافق أو ترفض أو تتخطى.
يتم الموافقة تلقائيًا على الاقتراحات عالية الثقة (أكبر من 0.85 افتراضيًا)، ويتم رفض العلاقات منخفضة الثقة (أقل من أو يساوي 0.5 افتراضيًا) تلقائيًا:```bash
sift review # uses defaults: --auto-approve 0.85, --auto-reject 0.5
sift review --auto-approve 0.90 # raise the auto-approve threshold
sift review --auto-reject 0.3 # lower the auto-reject threshold
sift review --auto-approve 1.0 # disable auto-approve, review everything manually
الخيار ب: تعديل ملف YAML مباشرةً
افتح output/merge_proposals.yaml في أي محرر نصوص. غيّر status: DRAFT إلى CONFIRMED أو REJECTED:```yaml
canonical_id: person:stephen_curry canonical_name: Stephen Curry entity_type: PERSON status: CONFIRMED # ← approve this merge members:
canonical_id: person:winklevoss_twins canonical_name: Winklevoss twins entity_type: PERSON status: REJECTED # ← these are distinct people, don't merge members:
**بالنسبة لحالات الاستخدام عالية الدقة** (علم الأنساب، المراجعة القانونية)، نوصي بتحرير ملف YAML مباشرةً حتى تتمكن من دراسة كل اقتراح بعناية. الملف مصمم ليكون قابلًا للقراءة البشرية.
### الطبقة 3ب: مراجعة العلاقات
أثناء `sift build`، يتم الإبلاغ عن العلاقات التي تقل عن حد الثقة (الافتراضي 0.7) أو من الأنواع المُعلَّمة بأنها `review_required` في إعدادات نطاقك، في ملف `output/relation_review.yaml`:```yaml
review_threshold: 0.7
relations:
- source_name: Alice Smith
target_name: Acme Corp
relation_type: WORKS_FOR
confidence: 0.45
evidence: "Alice mentioned she used to work near the Acme building."
status: DRAFT # ← you decide: CONFIRMED or REJECTED
flag_reason: Low confidence (0.45 < 0.7)
نفس سير العمل: راجع باستخدام sift review أو حرّر ملف YAML، ثم طبّق.
بمجرد مراجعة كل شيء:```bash sift apply-merges
يقوم هذا بثلاثة أمور:
1. **دمج الكيانات المؤكد** — يتم استيعاب الكيانات الأعضاء في الكيان الأساسي. يتم إعادة توصيل جميع علاقاتها. يتم دمج المستندات المصدر. تتم إزالة العقد الأعضاء.
2. **العلاقات المرفوضة** — يتم إزالتها بالكامل من الرسم البياني.
3. **مقترحات DRAFT** — تُترك كما هي دون تغيير. يمكنك العودة إليها لاحقًا.
يتم حفظ الرسم البياني مرة أخرى إلى `output/graph_data.json`. يمكنك إعادة التصدير، أو السرد، أو تصور الرسم البياني المنظف.
### التكرار
حل الكيانات ليس دائمًا عملية واحدة. بعد الدمج، قد تصبح نسخ مكررة جديدة واضحة. يمكنك إعادة التشغيل:```bash
sift resolve # find new duplicates in the cleaned graph
sift review # review the new proposals
sift apply-merges # apply again
كل تشغيل هو عملية إضافية — يتم الاحتفاظ بالقرارات السابقة CONFIRMED/REJECTED في ملف merge_proposals.yaml.
تقنيات ما قبل إزالة التكرار وتجميع LLM مستوحاة من KGGen (NeurIPS 2025) بواسطة @stochastic-sisyphus. يستخدم KGGen SemHash لإزالة التكرار الحتمي للكيانات والتجميع القائم على التضمينات لتجميع الكيانات قبل مقارنة LLM. يقوم sift-kg بتكييف هذه التقنيات في سير عمل المراجعة الذي يتضمن العنصر البشري.
افتراضيًا، يقوم sift resolve بترتيب الكيانات أبجديًا وتقسيمها إلى دفعات متداخلة لمقارنة LLM. يعمل هذا بشكل جيد عندما تحتوي التكرارات على تهجئة متشابهة — ولكن "Robert Smith" (R) و "Bob Smith" (B) ينتهيان في دفعات مختلفة ولا يتم مقارنتهما أبدًا.```bash
pip install sift-kg[embeddings] # sentence-transformers + scikit-learn (~2GB, pulls PyTorch)
sift resolve --embeddings
تستبدل هذه الميزة التجميع الأبجدي بتجميع KMeans على تضمينات الجمل (all-MiniLM-L6-v2). الأسماء المتشابهة دلاليًا تتجمع معًا بغض النظر عن التهجئة.
| | الافتراضي (أبجدي) | `--embeddings` |
|---|---|---|
| حجم التثبيت | مضمّن | ~2GB (PyTorch) |
| الحمل الزائد للتشغيل الأول | لا شيء | تنزيل نموذج بحجم ~90MB |
| الحمل الزائد لكل تشغيل | الفرز فقط | الترميز (<1s لمئات الكيانات) |
| التكرارات عبر الأبجديات | تفوتها إذا كانت في دفعات مختلفة | تُكتشف |
| الرسوم البيانية الصغيرة (<100/نوع) | نفس النتيجة | نفس النتيجة |
يتراجع إلى التجميع الأبجدي إذا لم يتم تثبيت التبعيات أو فشل التجميع.
## License
MIT
--min-confidence--ocr)، مع خيار احتياطي Google Cloud Vision (علامة --ocr-backend gcv)--max-cost لتحديد إنفاق LLM| حالة الاستخدام | النهج المقترح |
|---|
| الاستكشاف السريع | sift review --auto-approve 0.85 — اعتماد عالي الثقة، مراجعة الباقي |
| سجلات الأنساب / العائلية | تعديل YAML يدويًا، --auto-approve 1.0 — مراجعة كل اندماج على حدة |
| قانوني / تحقيقي | sift resolve --embeddings، تعديل YAML يدويًا، استخدام sift view للفحص بين الجولات |
| مجموعة كبيرة (أكثر من 1000 كيان) | sift resolve --embeddings للحصول على تجميع أفضل، ثم مراجعة تفاعلية |