Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
sift-kg — Превратите любую коллекцию документов в граф знаний. Извлекайте сущности и отношения через LLM, дедуплицируйте с вашего одобрения. Отображайте домены, находите скрытые связи, выявляйте паттерны в документах — знания, которые сохраняются и накапливаются для вас и ваших AI-агентов. Всё из CLI. | Kitploit
Инструменты/GitHubGitHub/juanceresa/sift-kg
OSINT (Разведка открытых источников)ФорензикаСбор информацииВосстановление ДанныхЦифровая криминалистикаСтатьи и ИсследованияОбучение и Образование
GitHubjuanceresa/sift-kg

sift-kg

Репозиторий
667583 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →

Описание

Превратите любую коллекцию документов в граф знаний. Извлекайте сущности и отношения через LLM, дедуплицируйте с вашего одобрения. Отображайте домены, находите скрытые связи, выявляйте паттерны в документах — знания, которые сохраняются и накапливаются для вас и ваших AI-агентов. Всё из CLI.

Поделиться

sift-kg

Превратите любую коллекцию документов в граф знаний.

Никакого кода, никакой базы данных, никакой инфраструктуры — только CLI и ваши документы. Загрузите PDF, статьи, публикации или записи — получите интерактивный граф знаний, показывающий, как всё связано, за считанные минуты. sift-kg извлекает сущности и связи через LLM, дедублицирует с вашего одобрения и генерирует интерактивное представление, которое можно просматривать в браузере. Концептуальные карты для чего угодно — под рукой.

Тот же граф, который лежит в основе ваших визуализаций, также работает как второй мозг для ИИ. Многие тратят месяцы на построение баз знаний в Notion и Obsidian. У кого есть на это время? sift-kg — это структурированная память, которую вы строите за 2 минуты, а не за 2 года. Просто укажите на свои документы, и ваш ИИ получит структурированное понимание того, как всё связано.

Живые демо → графы, полностью созданные с помощью 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.

root@kitploit:~
## Как это работает```
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 в ваш проект для постоянных настроек
  • Любой LLM-провайдер — OpenAI, Anthropic, Mistral, Ollama (локальный/частный) или любой провайдер, совместимый с LiteLLM
  • Без схемы по умолчанию — один вызов LLM анализирует ваши документы и разрабатывает схему, адаптированную к корпусу, сохраняемую как discovered_domain.yaml для повторного использования и редактирования. Или используйте структурированную предметную область (general, osint, academic) для фиксированных схем, или определите свою в YAML
  • Человек в цикле — sift предлагает слияния сущностей, вы одобряете или отклоняете в интерактивном терминальном интерфейсе
  • CLI-поиск — sift search "SBF" находит сущности по имени или псевдониму, с возможным выводом связей и описаний
  • Интерактивный просмотрщик — исследуйте свой граф в браузере с областями сообществ (цветные зоны, показывающие структуру графа), предварительным просмотром при наведении, режимом фокуса (двойной клик для изоляции окрестностей), навигацией с клавиатуры (стрелки для перемещения по связям), хлебными крошками (постоянный путь, отслеживающий ваше исследование — возвращайтесь по каждому посещенному узлу), поиском, переключателями типа/сообщества/связи, фильтром по исходному документу и фильтрацией по степени. Предварительная фильтрация с помощью флагов CLI: --neighborhood, --top, , ,

Варианты использования

  • Исследования и образование — отобразите, как теории, методы и результаты связаны в массиве литературы. Создавайте концептуальные карты для курсов, обзоров литературы или самостоятельного изучения
  • Бизнес-аналитика — загрузите белые книги конкурентов, рыночные отчеты или внутренние документы и увидьте ландшафт
  • Расследовательская работа — анализируйте выпуски FOIA, судебные документы, публичные записи и утечки документов
  • Юридическая проверка — извлекайте и связывайте сущности в коллекциях документов
  • Генеалогия — прослеживайте семейные связи по записям актов гражданского состояния

База знаний ИИ

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)

root@kitploit:~
Граф сохраняется между сеансами и растет постепенно — извлекайте новые документы в ту же выходную директорию и выполняйте перестроение. Дедупликация сущностей обеспечивает согласованность графа по мере его роста.

**Что это дает вашему агенту:**
- **Структура** — не просто текстовые фрагменты, а сущности, отношения, сообщества и то, как они связаны
- **Топология** — какие кластеры знаний существуют, что их соединяет, что изолировано
- **Долговечность** — граф переживает сбросы контекстного окна. Ваш агент перестает начинать с нуля каждый сеанс

**Встроенный навык агента:** 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

root@kitploit:~
Работает со встроенными именами (`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 предлагает, вы проверяете. Каждое извлечение ссылается на исходный документ и отрывок.

Смотрите [`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 — это CLI с открытым исходным кодом. Civic Table — это полноценная платформа, где результат проверяется аналитиками и JDs, прежде чем приобрести доказательственную силу.

## Установка

Требуется Python 3.11+.```bash
pip install sift-kg

Для поддержки OCR (отсканированные PDF, изображения):```bash

Local OCR — install Tesseract on your system

brew install tesseract # macOS sudo apt install tesseract-ocr # Ubuntu/Debian

Then use: sift extract ./docs/ --ocr

root@kitploit:~
Для 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]

root@kitploit:~
Для разработки:```bash
git clone https://github.com/juanceresa/sift-kg.git
cd sift-kg
pip install -e ".[dev]"

Быстрый старт

1. Инициализация и настройка```bash

sift init # creates sift.yaml + .env.example cp .env.example .env # copy and add your API key

root@kitploit:~
`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-...

root@kitploit:~
Или используйте Anthropic, Mistral, Ollama, или любого провайдера LiteLLM:```
SIFT_ANTHROPIC_API_KEY=sk-ant-...
SIFT_MISTRAL_API_KEY=...

Приоритет настроек: флаги CLI > переменные окружения > .env > sift.yaml > значения по умолчанию. Вы можете переопределить что угодно из sift.yaml с помощью флага в любой команде.

2. Извлечение сущностей и отношений```bash

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

root@kitploit:~
Читает 75+ форматов документов — PDF, 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).

3. Построение графа знаний```bash

sift build

root@kitploit:~
Строит граф NetworkX из всех извлечений. Автоматически удаляет дубликаты почти идентичных названий сущностей (множественное число, варианты Unicode, различия в регистре) перед тем, как они становятся узлами графа. Исправляет обратные направления рёбер, когда LLM путает типы источника/цели относительно схемы предметной области. Помечает связи с низкой уверенностью для проверки. Сохраняет в `output/graph_data.json`.

### 4. Разрешение дублированных сущностей

Полное руководство см. в разделе [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

root@kitploit:~
**Static exports** — для инструментов анализа, где нужна настраиваемая компоновка, фильтрация или стилизация:```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 удобен для ad-hoc SQL-запросов, публикации через Datasette или загрузки в DuckDB.

6. Создание повествования```bash

sift narrate sift narrate --communities-only # regenerate community labels only (~$0.01)

root@kitploit:~
Produces `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

root@kitploit:~
**Принудительное применение схемы:** типы сущностей и типы отношений, определенные в вашем домене, рассматриваются как закрытое множество — LLM инструктируется использовать только эти типы и не будет изобретать новые. Если задан `fallback_relation`, отношения, не соответствующие ни одному из определенных типов, сопоставляются с запасным. Если он опущен, LLM использует наиболее близкий соответствующий определенный тип с более низкой уверенностью. Если вы видите множество отношений, попадающих на ваш запасной тип, ваша схема, скорее всего, не имеет типа отношения, который требуют данные — добавьте его и выполните повторное извлечение.

Типы сущностей с `canonical_names` обеспечивают закрытый словарь. Допустимые имена внедряются в подсказку извлечения LLM, чтобы она выдавала точные совпадения. В качестве подстраховки любое извлеченное имя, отсутствующее в списке, перетипизируется в `canonical_fallback_type` во время построения графа (или сохраняется как есть, если запасной вариант не задан). Полезно для контролируемых таксономий — отделы, юрисдикции, предопределенные классификации.```bash
sift extract ./docs/ --domain path/to/domain.yaml

API библиотеки

Используйте sift-kg из Python — 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")

Extract — supports OCR, backend selection, concurrency

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, )

Build graph

kg = run_build(Path("./output"), domain) print(f"{kg.entity_count} entities, {kg.relation_count} relations")

Resolve duplicates — with optional semantic clustering

merges = run_resolve(Path("./output"), "openai/gpt-4o-mini", domain=domain, use_embeddings=True)

Export — json, graphml, gexf, csv, sqlite

run_export(Path("./output"), "sqlite")

Narrate — or just regenerate community labels cheaply

run_narrate(Path("./output"), "openai/gpt-4o-mini", communities_only=True)

View — with optional pre-filters

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

Or run the full pipeline (extract → build → narrate)

from sift_kg import run_pipeline run_pipeline(Path("./docs"), "openai/gpt-4o-mini", domain, Path("./output"))

root@kitploit:~
## Структура проекта

После запуска конвейера ваш выходной каталог содержит:```
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 никогда ничего не объединяет без вашего одобрения.

Рабочий процесс состоит из трех уровней, каждый из которых выявляет разные типы дубликатов:

Уровень 1: Автоматическое предварительное удаление дубликатов (во время sift build)

Прежде чем сущности станут узлами графа, sift детерминированно объединяет имена, которые явно одинаковы. Без участия LLM, без затрат, без необходимости проверки:

  • Нормализация Unicode — "Jose Garcia" и "Jose Garcia" становятся одним узлом
  • Удаление титулов — "Detective Joe Recarey" и "Joe Recarey" объединяются (удаление ~35 распространенных префиксов: Dr., Mr., Judge, Senator и т.д.)
  • Приведение к единственному числу — "Companies" и "Company" объединяются
  • Нечеткое сравнение строк — SemHash с порогом 0.95 находит почти идентичные строки, такие как "MacAulay" и "Mac Aulay"

Это происходит автоматически каждый раз, когда вы запускаете sift build. Это тривиальные случаи — варианты написания, которые захламляли бы граф, не добавляя информации.

Уровень 2: LLM предлагает объединения (во время 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

root@kitploit:~
Если у вас настроен домен, 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 предлагает, а не принимает решение.

Уровень 3: Вы просматриваете и решаете

У вас есть два варианта просмотра предложений:

Вариант A: Интерактивный просмотр в терминале```bash sift review

root@kitploit:~
Проходит по каждому предложению `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:

root@kitploit:~
- id: merge-01
  title: Merge / Feature-1 into main
  status: DRAFT
  description: "Initial merge proposal for review"
  creation_date: 2025-01-15
``````yaml
- canonical_id: person:stephen_curry
  canonical_name: Stephen Curry
  entity_type: PERSON
  status: CONFIRMED                # ← approve this merge
  members:
  - id: person:steph_curry
    name: Steph Curry
    confidence: 0.99
  reason: Same basketball player...

- canonical_id: person:winklevoss_twins
  canonical_name: Winklevoss twins
  entity_type: PERSON
  status: REJECTED                 # ← these are distinct people, don't merge
  members:
  - id: person:cameron_winklevoss
    name: Cameron Winklevoss
    confidence: 0.95
  reason: ...

Для сценариев высокой точности (генеалогия, юридическая проверка) мы рекомендуем редактировать 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)
root@kitploit:~
Тот же рабочий процесс: просмотрите с помощью `sift review` или отредактируйте YAML, затем примените.

### Слой 4: Примените ваши решения

После того как вы всё проверили:```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

root@kitploit:~
Каждый запуск является аддитивным — предыдущие решения `CONFIRMED`/`REJECTED` в `merge_proposals.yaml` сохраняются.

### Рекомендуемый рабочий процесс по вариантам использования

| Вариант использования | Предлагаемый подход |
|---|---|
| **Быстрое исследование** | `sift review --auto-approve 0.85` — одобрить с высокой уверенностью, остальные проверить |
| **Генеалогия / семейные записи** | Редактировать YAML вручную, `--auto-approve 1.0` — проверять каждое объединение |
| **Юридические / следственные** | `sift resolve --embeddings`, редактировать YAML вручную, использовать `sift view` для просмотра между раундами |
| **Большой корпус (1000+ сущностей)** | `sift resolve --embeddings` для лучшего пакетирования, затем интерактивная проверка |

## Внутренняя работа дедупликации

Методы предварительной дедупликации и пакетной обработки LLM вдохновлены [KGGen](https://github.com/stochastic-sisyphus/KGGen) (NeurIPS 2025) от [@stochastic-sisyphus](https://github.com/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). Семантически похожие имена группируются вместе независимо от написания.

Возвращается к пакетной обработке по алфавиту, если зависимости не установлены или кластеризация не удалась.

Лицензия

MIT

Скачать инструмент
--community
--source-doc
--min-confidence
  • Экспорт куда угодно — GraphML (yEd, Cytoscape), GEXF (Gephi), SQLite, CSV или нативный JSON для продвинутого анализа
  • Генерация повествования — прозаические отчеты с цепочками связей, временными линиями и профилями сущностей, сгруппированных по сообществам
  • Происхождение источника — каждое извлечение ссылается на документ и отрывок, из которого оно получено
  • Многоязычность — извлекает из документов на любом языке, выводит единый граф знаний на английском. Имена собственные остаются без изменений, нелатинские шрифты автоматически романизируются
  • 75+ форматов документов — PDF, DOCX, XLSX, PPTX, HTML, EPUB, изображения и другие через движок извлечения Kreuzberg
  • OCR для сканированных PDF — локальный OCR через Tesseract (по умолчанию), EasyOCR или PaddleOCR (флаг --ocr), с опциональным запасным вариантом Google Cloud Vision (--ocr-backend gcv)
  • Контроль бюджета — задайте --max-cost для ограничения расходов на LLM
  • Работает локально — ваши документы остаются на вашем компьютере
  • По умолчанию (по алфавиту)--embeddings
    Размер установкиВключено~2 ГБ (PyTorch)
    Накладные расходы при первом запускеНет~90 МБ загрузка модели
    Накладные расходы на каждый запускТолько сортировкаКодирование (<1 с для сотен сущностей)
    Дубликаты из разных алфавитовПропускаются, если в разных пакетахОбнаруживаются
    Небольшие графы (<100/тип)Тот же результатТот же результат