juanceresa/sift-kg
GitHub: juanceresa/sift-kg
将任意文档集合转化为可交互探索的知识图谱,通过LLM提取实体关系并在人工审核下完成去重。
Stars: 380 | Forks: 31
# sift-kg
**将任何文档集合转化为知识图谱。**
无需代码、无需数据库、无需基础设施——仅需 CLI 和您的文档。放入 PDF、论文、文章或记录——在几分钟内获得一个可浏览的知识图谱,展示万物如何关联。sift-kg 通过 LLM 提取实体和关系,经您批准后进行去重,并生成一个可在浏览器中探索的交互式查看器。触手可及的概念图谱,适用于任何领域。
**[在线演示 →](https://juanceresa.github.io/sift-kg/)** 图谱完全由 sift-kg 生成
```
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` 以持久化设置
- **任何 LLM 提供商** —— OpenAI、Anthropic、Mistral、Ollama(本地/私有),或任何兼容 LiteLLM 的提供商
- **默认无 Schema** —— 一次 LLM 调用采样您的文档并设计一个针对语料库定制的 schema,保存为 `discovered_domain.yaml` 以便复用和编辑。或者使用结构化域(`general`、`osint`、`academic`)获取固定 schema,或在 YAML 中定义您自己的
- **人机协作 (Human-in-the-loop)** —— sift 提议实体合并,您在交互式终端 UI 中批准或拒绝
- **CLI 搜索** —— `sift search "SBF"` 按名称或别名查找实体,带有可选的关系和描述输出
- **交互式查看器** —— 在浏览器中探索您的图谱,支持社区区域(显示图谱结构的彩色区域)、悬停预览、聚焦模式(双击隔离邻域)、键盘导航(方向键逐步查看连接)、路径面包屑(跟踪您探索的持久路径——回溯您访问的每个节点)、搜索、类型/社区/关系切换、源文档过滤和度数过滤。使用 CLI 标志预过滤:`--neighborhood`、`--top`、`--community`、`--source-doc`、`--min-confidence`
- **导出到任何地方** —— GraphML (yEd, Cytoscape)、GEXF (Gephi)、SQLite、CSV 或原生 JSON,用于高级分析
- **叙述生成** —— 带有关系链、时间线和按社区分组的实体配置文件的散文报告
- **溯源** —— 每次提取都链接到其来源的文档和段落
- **多语言** —— 从任何语言的文档中提取,输出统一的英文知识图谱。专有名词保持原样,非拉丁文字自动转写
- **75+ 种文档格式** —— PDF、DOCX、XLSX、PPTX、HTML、EPUB、图像等,通过 [Kreuzberg](https://kreuzberg-dev.github.io/kreuzberg/) 提取引擎支持
- **扫描版 PDF 的 OCR** —— 通过 Tesseract(默认)、EasyOCR 或 PaddleOCR(`--ocr` 标志)进行本地 OCR,可选 Google Cloud Vision 回退(`--ocr-backend gcv`)
- **预算控制** —— 设置 `--max-cost` 以限制 LLM 支出
- **本地运行** —— 您的文档保留在您的机器上
## 使用案例
- **研究与教育** —— 映射理论、方法和发现如何在文献体系中连接。为课程、文献综述或自学生成概念图谱
- **商业智能** —— 放入竞争对手白皮书、市场报告或内部文档,查看全景
- **调查工作** —— 分析 FOIA 披露、法庭文件、公共记录和文档泄露
- **法律审查** —— 提取并连接文档集合中的实体
- **家谱学** —— 追踪人口记录中的家庭关系
## 内置域
sift-kg 附带可开箱即用的专用域:
```
sift domains # list available domains
sift extract ./docs/ --domain-name osint # use a bundled domain
```
在 `sift.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** 域(默认)在提取之前运行一个 **schema 发现**步骤——一次 LLM 调用采样您的文档并设计针对语料库定制的实体和关系类型。发现的 schema 保存到 `output/discovered_domain.yaml` 并在后续运行中复用,因此类型在所有块和文档中保持一致。您可以检查、手动编辑或复制该文件作为自定义域的起点。使用 `--force` 重新发现。它不会将关系强行塞入预定义类别(如 ASSOCIATED_WITH),而是生成特定类型,如 FUNDED、TESTIFIED_AGAINST 或 ENROLLED_AT。当您想要预先定义的固定 schema 时,请使用结构化域(如 `general` 或 `osint`)。
**general** 域提供固定 schema,包含 PERSON、ORGANIZATION、LOCATION、EVENT 和 DOCUMENT 实体类型以及常见关系类型。当您希望跨文档具有可预测、一致的类型时很有用。
**osint** 域添加了用于空壳公司、金融账户和离岸管辖区实体类型,以及用于追踪受益所有权和资金流动的关系类型。
未经您批准,任何内容都不会被合并——LLM 提议,您验证。每次提取都链接回源文档和段落。
请参阅 [`examples/transformers/`](examples/transformers/) 查看映射为概念图的 12 篇基础 AI 论文(425 个实体,约 $0.72),[`examples/ftx/`](examples/ftx/) 查看 FTX 崩溃(来自 9 篇文章的 431 个实体),以及 [`examples/epstein/`](examples/epstein/) 查看 Giuffre v. Maxwell 证词(来自扫描 PDF 的 190 个实体)。[**在线探索全部三个示例**](https://juanceresa.github.io/sift-kg/) —— 无需安装,无需 API 密钥。
## Civic Table
正在寻找具有取证法律分析和分析师验证的托管平台?
[**Civic Table**](https://github.com/juanceresa/forensic_analysis_platform) 是一个基于 sift-kg 流程构建的取证情报平台。它增加了一个 4 层验证系统,分析师和法学博士在 AI 提取的事实被视为证据之前对其进行验证,用于法律提交的 LaTeX 卷宗生成,以及用于与客户和家人分享结果的 Web 界面。专为财产归还、调查性新闻以及任何文档来源至关重要的场景而构建。
sift-kg 是开源 CLI。Civic Table 是完整平台——输出结果在具有证据效力之前会经过分析师和法学博士的审查。
## 安装
需要 Python 3.11+。
```
pip install sift-kg
```
OCR 支持(扫描版 PDF、图像):
```
# 本地 OCR — 在您的系统上安装 Tesseract
brew install tesseract # macOS
sudo apt install tesseract-ocr # Ubuntu/Debian
# 然后使用:sift extract ./docs/ --ocr
```
Google Cloud Vision OCR 作为替代后端(可选):
```
pip install sift-kg[ocr]
# 然后使用:sift extract ./docs/ --ocr --ocr-backend gcv
```
实体解析期间的语义聚类(可选,PyTorch 约 2GB):
```
pip install sift-kg[embeddings]
```
开发环境:
```
git clone https://github.com/juanceresa/sift-kg.git
cd sift-kg
pip install -e ".[dev]"
```
## 快速开始
### 1. 初始化和配置
```
sift init # creates sift.yaml + .env.example
cp .env.example .env # copy and add your API key
```
`sift init` 生成一个 `sift.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 (默认, 75+ 种格式) | pdfplumber
# ocr_backend: tesseract # tesseract | easyocr | paddleocr | gcv
# ocr_language: eng
```
在 `.env` 中设置您的 API 密钥:
```
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` 中的任何内容。
### 2. 提取实体和关系
```
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` 标志通过 Tesseract 为扫描版 PDF 启用本地 OCR——无需 API 密钥或云服务。您可以使用 `--ocr-backend` 切换 OCR 引擎:
```
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`,如果 PDF 看起来是扫描的,sift 会发出警告。
您还可以使用 `--extractor pdfplumber` 完全切换提取后端,以使用旧版 pdfplumber 后端(仅支持 PDF/DOCX/TXT/HTML)。
### 3. 构建知识图谱
```
sift build
```
从所有提取结果构建 NetworkX 图谱。在实体名称成为图节点之前,自动去重几乎相同的实体名称(复数、Unicode 变体、大小写差异)。当 LLM 颠倒源/目标类型与域 schema 的对比时,修正反向的边方向。标记低置信度关系以供审查。保存到 `output/graph_data.json`。
### 4. 解析重复实体
请参阅下文的 [实体解析工作流](#entity-resolution-workflow) 获取完整指南——对于准确性至关重要的家谱、法律和调查用例尤为重要。
### 5. 探索和导出
**交互式查看器** —— 在浏览器中探索您的概念图谱:
```
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` 接受实体 ID(`person:alice`)或显示名称(不区分大小写)。
**聚焦模式:** 双击任何实体以隔离其邻域。使用方向键逐个遍历连接——每一对都单独显示并带有标记的边。按 Enter/右方向键将焦点转移到邻居,按 Backspace/左方向键沿路径返回,按 Escape 退出。您的探索在侧边栏中作为**路径面包屑**跟踪——一条显示您访问的每个节点及其间关系的持久路径。路径边在画布上保持高亮,以便您可以看到穿过图谱的路径。这是探索密集图谱的预期方式——放大重要内容,追踪连接,阅读证据。
**CLI 搜索** —— 直接从终端查询实体:
```
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
```
**静态导出** —— 用于您想要自定义布局、过滤或样式的分析工具:
```
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](https://datasette.io/) 发布或加载到 DuckDB。
### 6. 生成叙述
```
sift narrate
sift narrate --communities-only # regenerate community labels only (~$0.01)
```
生成 `output/narrative.md`——一份散文报告,包含概述、顶级实体之间的关键关系链、时间线(当数据中存在日期时)以及按主题社区分组的实体配置文件(通过 Louvain 社区检测发现)。实体描述使用主动语态和具体动作编写,而非角色摘要。
## 域配置
sift-kg 附带四个内置域(详情请参阅上文的 [内置域](#bundled-domains))。默认值为 `schema-free`。
使用内置域:
```
sift extract ./docs/ --domain-name osint
```
或创建您自己的 `domain.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
```
**Schema 执行:** 您的域中定义的实体类型和关系类型被视为封闭集——LLM 指示仅使用这些类型,不会发明新类型。如果设置了 `fallback_relation`,则不适合任何定义类型的关系将映射到回退。如果省略,LLM 将使用最接近的匹配定义类型(置信度较低)。如果您看到许多关系落在回退类型上,您的 schema 可能缺少数据所需的关系类型——添加它并重新提取。
具有 `canonical_names` 的实体类型强制执行封闭词汇表。允许的名称被注入到 LLM 提取提示中,以便它输出精确匹配。作为安全网,任何不在列表中的提取名称在图构建期间都会重新类型化为 `canonical_fallback_type`(如果未设置回退,则保持原样)。适用于受控分类法——部门、管辖区、预定义分类。
```
sift extract ./docs/ --domain path/to/domain.yaml
```
## 库 API
从 Python 使用 sift-kg——Jupyter notebooks、脚本、Web 应用:
```
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 — 支持 OCR, backend 选择, 并发
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,
)
# 构建 graph
kg = run_build(Path("./output"), domain)
print(f"{kg.entity_count} entities, {kg.relation_count} relations")
# 解析重复项 — 带有可选的 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 — 或仅低成本地重新生成 community labels
run_narrate(Path("./output"), "openai/gpt-4o-mini", communities_only=True)
# View — 带有可选的 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
# 或运行完整 pipeline (extract → build → narrate)
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 未经您批准绝不会合并任何内容。
该工作流有三个层级,每一层捕获不同类型的重复项:
### 第 1 层:自动预去重(在 `sift build` 期间)
在实体成为图节点之前,sift 确定性地折叠明显相同的名称。不涉及 LLM,没有成本,无需审查:
- **Unicode 标准化** —— "Jose Garcia" 和 "Jose Garcia" 变为一个节点
- **头衔剥离** —— "Detective Joe Recarey" 和 "Joe Recarey" 合并(剥离约 35 个常见前缀:Dr.、Mr.、Judge、Senator 等)
- **单数化** —— "Companies" 和 "Company" 合并
- **模糊字符串匹配** —— 阈值为 0.95 的 [SemHash](https://github.com/MinishLab/semhash) 捕获几乎相同的字符串,如 "MacAulay" vs "Mac Aulay"
这会在您每次运行 `sift build` 时自动发生。这些是琐碎的情况——会弄乱图谱而不增加信息的拼写变体。
### 第 2 层:LLM 提议合并(在 `sift resolve` 期间)
LLM 查看成批的实体(除 DOCUMENT 外的所有类型)并识别可能指代同一现实世界事物的实体。它还检测跨类型重复项(名称相同,实体类型不同),并在发现父/子模式时提议变体关系(EXTENDS)。结果转到 `merge_proposals.yaml`(实体合并)和 `relation_review.yaml`(变体关系),全部以 `DRAFT` 开始:
```
sift resolve # uses domain from sift.yaml
sift resolve --domain osint # or specify explicitly
```
如果您配置了域,LLM 会使用该上下文对特定于您领域的实体名称做出更好的判断。
这会生成如下提议:
```
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:交互式终端审查**
```
sift review
```
逐个遍历每个 `DRAFT` 提议。对于每一个,您会看到规范实体、提议的合并成员、LLM 的置信度和推理。您可以批准、拒绝或跳过。
高置信度提议(默认 >0.85)自动批准,低置信度关系(默认 <=0.5)自动拒绝:
```
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`:
```
- 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` 中被标记:
```
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,然后应用。
### 第 4 层:应用您的决定
一旦您审查了所有内容:
```
sift apply-merges
```
这会做三件事:
1. **已确认的实体合并** —— 成员实体被吸收到规范实体中。它们的所有关系都被重新连接。源文档被合并。成员节点被移除。
2. **已拒绝的关系** —— 从图谱中完全移除。
3. **DRAFT 提议** —— 保持不变。您可以稍后再回来处理它们。
图谱被保存回 `output/graph_data.json`。您可以重新导出、叙述或可视化清理后的图谱。
### 迭代
实体解析并不总是一次通过的。合并后,新的重复项可能会变得明显。您可以重新运行:
```
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` 决定会被保留。
### 按用例推荐的工作流
| 用例 | 建议方法 |
|---|---|
| **快速探索** | `sift review --auto-approve 0.85` —— 批准高置信度,审查其余 |
| **家谱 / 家庭记录** | 手动编辑 YAML,`--auto-approve 1.0` —— 审查每一个合并 |
| **法律 / 调查** | `sift resolve --embeddings`,手动编辑 YAML,在轮次之间使用 `sift view` 检查 |
| **大型语料库(1000+ 实体)** | `sift resolve --embeddings` 用于更好的批处理,然后交互式审查 |
## 去重内部机制
预去重和 LLM 批处理技术灵感来自 [@stochastic-sisyphus](https://github.com/stochastic-sisyphus) 的 [KGGen](https://github.com/stochastic-sisyphus/KGGen) (NeurIPS 2025)。KGGen 使用 SemHash 进行确定性实体去重和基于嵌入的聚类,以便在 LLM 比较之前对实体进行分组。sift-kg 将这些调整到其人机协作审查工作流中。
### 基于嵌入的聚类(可选)
默认情况下,`sift resolve` 按字母顺序对实体进行排序,并将它们分成重叠的批次以进行 LLM 比较。当重复项具有相似拼写时效果很好——但 "Robert Smith" (R) 和 "Bob Smith" (B) 最终会出现在不同的批次中,永远不会被比较。
```
pip install sift-kg[embeddings] # sentence-transformers + scikit-learn (~2GB, pulls PyTorch)
sift resolve --embeddings
```
这将用基于句子嵌入 (all-MiniLM-L6-v2) 的 KMeans 聚类取代按字母顺序批处理。语义相似的名称无论拼写如何都会聚集在一起。
| | 默认(按字母顺序) | `--embeddings` |
|---|---|---|
| 安装大小 | 已包含 | ~2GB (PyTorch) |
| 首次运行开销 | 无 | ~90MB 模型下载 |
| 每次运行开销 | 仅排序 | 编码(数百个实体 <1s) |
| 跨字母表重复项 | 如果在不同批次中则遗漏 | 被捕获 |
| 小图(<100/类型) | 结果相同 | 结果相同 |
如果未安装依赖项或聚类失败,则回退到按字母顺序批处理。
## 许可证
MIT
标签:AI风险缓解, C2, DLL 劫持, DNS解析, LLM, NetworkX, NLP, OCR, PDF解析, Python, RAG, Unmanaged PE, 人工智能, 信息检索, 关系抽取, 大语言模型, 实体抽取, 实体消歧, 开源项目, 数据清洗, 文本挖掘, 文档处理, 无后门, 特权检测, 用户模式Hook绕过, 突变策略, 网络调试, 自动化, 逆向工具