
किसी भी दस्तावेज़ों के संग्रह को नॉलेज ग्राफ में बदलें। LLM के माध्यम से संस्थाओं और संबंधों को निकालें, आपकी स्वीकृति पर डुप्लिकेट हटाएं। डोमेन मैप करें, छिपे हुए कनेक्शन खोजें, दस्तावेज़ों में पैटर्न देखें — वह ज्ञान जो बना रहता है और बढ़ता है, आपके और आपके AI एजेंटों के लिए। सब कुछ CLI से।
किसी भी दस्तावेज़ों के संग्रह को नॉलेज ग्राफ में बदलें.
कोई कोड नहीं, कोई डेटाबेस नहीं, कोई इंफ्रास्ट्रक्चर नहीं — बस एक CLI और आपके दस्तावेज़। PDFs, पेपर, लेख, या रिकॉर्ड डालें — एक ब्राउज़ करने योग्य नॉलेज ग्राफ प्राप्त करें जो दिखाता है कि सब कुछ कैसे जुड़ता है, मिनटों में। sift-kg LLM के माध्यम से संस्थाओं और संबंधों को निकालता है, आपकी मंजूरी के साथ डुप्लिकेट हटाता है, और एक इंटरैक्टिव व्यूअर उत्पन्न करता है जिसे आप अपने ब्राउज़र में एक्सप्लोर कर सकते हैं। किसी भी चीज़ के लिए कॉन्सेप्ट मैप, आपकी उंगलियों पर।
वही ग्राफ जो आपके विज़ुअलाइज़ेशन को शक्ति देता है, एक AI सेकंड ब्रेन के रूप में भी काम करता है। हर कोई Notion और Obsidian में नॉलेज बेस बनाने में महीनों बिता रहा है। उसके लिए किसके पास समय है? sift-kg वह संरचित मेमोरी है जिसे आप 2 साल के बजाय 2 मिनट में बनाते हैं। बस अपने दस्तावेज़ों की ओर इशारा करें और आपका AI समझता है कि सब कुछ कैसे जुड़ता है।
लाइव डेमो → 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)
Every entity and relation links back to the source document and passage. You control what gets merged. The graph is yours.
sift.yaml in your project for persistent settingsdiscovered_domain.yaml for reuse and editing. Or use a structured domain (general, osint, academic) for fixed schemas, or define your own in YAMLsift search "SBF" finds entities by name or alias, with optional relation and description output--neighborhood, --top, --community, , sift-kg generates structured knowledge that AI agents can operate from directly.
Point sift at your documents, notes, or project files. The output — a JSON knowledge graph — gives any AI agent a persistent, structured understanding of how everything in your world connects. No manual organization, no tagging, no wiki links. The structure emerges from the content.```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` | जाँच और FOIA | 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 प्रस्ताव करता है, आप सत्यापित करते हैं। प्रत्येक निष्कर्षण स्रोत दस्तावेज़ और अनुच्छेद से वापस लिंक होता है।
अवधारणा ग्राफ़ (425 इकाइयाँ, ~$0.72) के रूप में मैप किए गए 12 मौलिक AI पेपरों के लिए [`examples/transformers/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/transformers/) देखें, और FTX पतन के लिए [`examples/ftx/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/ftx/) (9 लेखों से 431 इकाइयाँ) देखें। [**लाइव डेमो देखें**](https://juanceresa.github.io/sift-kg/) — कोई इंस्टॉल नहीं, कोई API कुंजी नहीं।
## सिविक टेबल
फोरेंसिक कानूनी विश्लेषण और विश्लेषक सत्यापन वाले होस्ट किए गए प्लेटफ़ॉर्म की तलाश है?
[**सिविक टेबल**](https://github.com/juanceresa/forensic_analysis_platform) एक फोरेंसिक इंटेलिजेंस प्लेटफ़ॉर्म है जो sift-kg पाइपलाइन पर बनाया गया है। यह एक 4-स्तरीय सत्यापन प्रणाली जोड़ता है जहाँ विश्लेषक और JD AI-निकाले गए तथ्यों को साक्ष्य के रूप में व्यवहार करने से पहले सत्यापित करते हैं, कानूनी प्रस्तुतियों के लिए LaTeX डोजियर जनरेशन, और ग्राहकों और परिवारों के साथ परिणाम साझा करने के लिए एक वेब इंटरफ़ेस। संपत्ति वापसी, जांच पत्रकारिता, और किसी भी संदर्भ के लिए बनाया गया जहाँ दस्तावेज़ी उत्पत्ति मायने रखती है।
sift-kg ओपन-सोर्स CLI है। सिविक टेबल पूरा प्लेटफ़ॉर्म है — और जहाँ आउटपुट को साक्ष्यात्मक भार ले जाने से पहले विश्लेषकों और JDs द्वारा जाँचा जाता है।
## स्थापना
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
इकाई समाधान के दौरान अर्थपूर्ण क्लस्टरिंग के लिए (वैकल्पिक, PyTorch के लिए ~2GB):```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 key .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. आप किसी भी कमांड पर एक फ्लैग के साथ sift.yaml से कुछ भी ओवरराइड कर सकते हैं।
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 का उपयोग करके संस्थाओं और संबंधों को निकालता है। परिणाम `output/extractions/` में JSON के रूप में सहेजे जाते हैं।
`--ocr` फ़्लैग स्कैन किए गए PDFs के लिए स्थानीय OCR को Tesseract के माध्यम से सक्षम करता है — कोई API कुंजी या क्लाउड सेवाओं की आवश्यकता नहीं है। आप `--ocr-backend` के साथ OCR इंजन बदल सकते हैं:```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 ग्राफ बनाता है। ग्राफ नोड बनने से पहले स्वचालित रूप से लगभग समान इकाई नामों (बहुवचन, यूनिकोड वेरिएंट, केस अंतर) को डिडुप्लिकेट करता है। जब LLM डोमेन स्कीमा के विपरीत स्रोत/लक्ष्य प्रकारों को बदलता है तो उल्टे किनारे की दिशाओं को ठीक करता है। समीक्षा के लिए कम-विश्वास संबंधों को फ्लैग करता है। `output/graph_data.json` में सहेजता है।
### 4. डुप्लिकेट इकाइयों का समाधान करें
पूर्ण गाइड के लिए नीचे [Entity Resolution Workflow](#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` उत्पन्न करता है — एक सारांश रिपोर्ट जिसमें एक अवलोकन, शीर्ष संस्थाओं के बीच प्रमुख संबंध श्रृंखलाएँ, एक समयरेखा (जब डेटा में तिथियाँ मौजूद हों), और विषयगत समुदाय द्वारा समूहित संस्था प्रोफाइल (Louvain समुदाय पहचान के माध्यम से खोजे गए) शामिल हैं। संस्था विवरण सक्रिय आवाज़ में विशिष्ट कार्यों के साथ लिखे गए हैं, भूमिका सारांश नहीं।
## डोमेन कॉन्फ़िगरेशन
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
Python से sift-kg का उपयोग करें — Jupyter notebooks, स्क्रिप्ट्स, वेब ऐप्स:```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
जब आप पारिवारिक रिकॉर्ड, कानूनी फाइलिंग, या ऐसे किसी भी दस्तावेज़ से एक ज्ञान ग्राफ (knowledge graph) बना रहे हैं जहाँ सटीकता मायने रखती है, तो आप पूर्ण नियंत्रण चाहते हैं कि कौन सी एंटिटी (entities) मर्ज हों। sift-kg आपकी स्वीकृति के बिना कभी कुछ मर्ज नहीं करता।
वर्कफ़्लो में तीन परतें हैं, प्रत्येक विभिन्न प्रकार के डुप्लिकेट (duplicates) को पकड़ती है:
sift build के दौरान)एंटिटी ग्राफ नोड बनने से पहले, sift निर्धारित रूप से (deterministically) उन नामों को संक्षिप्त करता है जो स्पष्ट रूप से समान हैं। कोई 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 प्रस्तावित कर रहा है, निर्णय नहीं ले रहा।
प्रस्तावों की समीक्षा के लिए आपके पास दो विकल्प हैं:
विकल्प A: इंटरैक्टिव टर्मिनल समीक्षा```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
विकल्प B: 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 संपादित करने की सलाह देते हैं ताकि आप प्रत्येक प्रस्ताव का ध्यानपूर्वक अध्ययन कर सकें। फ़ाइल मानव-पठनीय बनाई गई है।
### परत 3b: संबंध समीक्षा
`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. **ड्राफ्ट प्रस्ताव** — अछूते छोड़ दिए जाते हैं। आप बाद में उन पर वापस आ सकते हैं।
ग्राफ़ को वापस `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
प्रत्येक रन संचयी होता है — merge_proposals.yaml में पिछले CONFIRMED/REJECTED निर्णय संरक्षित रहते हैं।
प्री-डिडुप और LLM बैचिंग तकनीकें KGGen (NeurIPS 2025) द्वारा @stochastic-sisyphus से प्रेरित हैं। KGGen निर्धारितात्मक संस्था डिडुप्लीकेशन और LLM तुलना से पहले संस्थाओं को समूहित करने के लिए एम्बेडिंग-आधारित क्लस्टरिंग के लिए SemHash का उपयोग करता है। 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
यह वर्णमाला क्रम बैचिंग को सभी-MiniLM-L6-v2 सेंटेंस एम्बेडिंग पर KMeans क्लस्टरिंग से बदल देता है। समानार्थी नाम वर्तनी की परवाह किए बिना एक साथ क्लस्टर हो जाते हैं।
| | Default (alphabetical) | `--embeddings` |
|---|---|---|
| इंस्टॉल आकार | Included | ~2GB (PyTorch) |
| पहले रन का ओवरहेड | None | ~90MB मॉडल डाउनलोड |
| प्रति रन ओवरहेड | Sorting only | Encoding (<1s for hundreds of entities) |
| क्रॉस-वर्णमाला डुप्लिकेट | Missed if in different batches | Caught |
| छोटे ग्राफ (<100/type) | Same result | Same result |
यदि निर्भरताएँ स्थापित न हों या क्लस्टरिंग विफल हो, तो वर्णमाला क्रम बैचिंग पर वापस आ जाता है।
## License
MIT
--source-doc--min-confidence--ocr flag), with optional Google Cloud Vision fallback (--ocr-backend gcv)--max-cost to cap LLM spending| उपयोग का मामला | सुझाया गया दृष्टिकोण |
|---|
| त्वरित अन्वेषण | sift review --auto-approve 0.85 — उच्च-विश्वास वाले को स्वीकृत करें, बाकी की समीक्षा करें |
| वंशावली / पारिवारिक रिकॉर्ड | YAML को मैन्युअल रूप से संपादित करें, --auto-approve 1.0 — प्रत्येक मर्ज की अलग से समीक्षा करें |
| कानूनी / जाँच-पड़ताल | sift resolve --embeddings, YAML को मैन्युअल रूप से संपादित करें, राउंड के बीच निरीक्षण के लिए sift view का उपयोग करें |
| बड़ा कॉर्पस (1000+ संस्थाएँ) | बेहतर बैचिंग के लिए sift resolve --embeddings, फिर इंटरैक्टिव समीक्षा |