
Превратите любую коллекцию документов в граф знаний. Извлекайте сущности и отношения через LLM, дедуплицируйте с вашего одобрения. Отображайте домены, находите скрытые связи, выявляйте паттерны в документах — знания, которые сохраняются и накапливаются для вас и ваших AI-агентов. Всё из CLI.
Превратите любую коллекцию документов в граф знаний.
Никакого кода, никакой базы данных, никакой инфраструктуры — только 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.
## Как это работает```
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, , , 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` | Расследования и 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
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=...
Приоритет настроек: флаги CLI > переменные окружения > .env > sift.yaml > значения по умолчанию. Вы можете переопределить что угодно из 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+ форматов документов — 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).
sift build
Строит граф 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
**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.
sift narrate sift narrate --communities-only # regenerate community labels only (~$0.01)
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
**Принудительное применение схемы:** типы сущностей и типы отношений, определенные в вашем домене, рассматриваются как закрытое множество — LLM инструктируется использовать только эти типы и не будет изобретать новые. Если задан `fallback_relation`, отношения, не соответствующие ни одному из определенных типов, сопоставляются с запасным. Если он опущен, LLM использует наиболее близкий соответствующий определенный тип с более низкой уверенностью. Если вы видите множество отношений, попадающих на ваш запасной тип, ваша схема, скорее всего, не имеет типа отношения, который требуют данные — добавьте его и выполните повторное извлечение.
Типы сущностей с `canonical_names` обеспечивают закрытый словарь. Допустимые имена внедряются в подсказку извлечения LLM, чтобы она выдавала точные совпадения. В качестве подстраховки любое извлеченное имя, отсутствующее в списке, перетипизируется в `canonical_fallback_type` во время построения графа (или сохраняется как есть, если запасной вариант не задан). Полезно для контролируемых таксономий — отделы, юрисдикции, предопределенные классификации.```bash
sift extract ./docs/ --domain path/to/domain.yaml
Используйте 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")
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 предлагает, а не принимает решение.
У вас есть два варианта просмотра предложений:
Вариант 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:
- 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 напрямую, чтобы вы могли тщательно изучить каждое предложение. Файл разработан так, чтобы быть читаемым для человека.
Во время sift build связи ниже порога уверенности (по умолчанию 0.7) или типов, помеченных как review_required в вашей конфигурации домена, помечаются в output/relation_review.yaml:```yaml
review_threshold: 0.7
relations:
Тот же рабочий процесс: просмотрите с помощью `sift review` или отредактируйте YAML, затем примените.
### Слой 4: Примените ваши решения
После того как вы всё проверили:```bash
sift apply-merges
Это делает три вещи:
Граф сохраняется обратно в 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` сохраняются.
### Рекомендуемый рабочий процесс по вариантам использования
| Вариант использования | Предлагаемый подход |
|---|---|
| **Быстрое исследование** | `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--ocr), с опциональным запасным вариантом Google Cloud Vision (--ocr-backend gcv)--max-cost для ограничения расходов на LLM| По умолчанию (по алфавиту) | --embeddings |
|---|
| Размер установки | Включено | ~2 ГБ (PyTorch) |
| Накладные расходы при первом запуске | Нет | ~90 МБ загрузка модели |
| Накладные расходы на каждый запуск | Только сортировка | Кодирование (<1 с для сотен сущностей) |
| Дубликаты из разных алфавитов | Пропускаются, если в разных пакетах | Обнаруживаются |
| Небольшие графы (<100/тип) | Тот же результат | Тот же результат |