将任何文档集合转化为知识图谱。
无需代码,无需数据库,无需基础设施——只需要一个命令行工具和你的文档。放入PDF、论文、文章或记录——几分钟内即可获得一个可浏览的知识图谱,展示所有内容之间的关联。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)
每个实体和关系都链接回源文档和段落。你控制哪些内容被合并。这张图是你的。
sift.yaml 以持久化设置discovered_domain.yaml 供复用和编辑。或者使用结构化领域(general、osint、academic)获得固定模式,也可在YAML中自行定义sift search "SBF" 按名称或别名查找实体,可选择输出关系和描述--neighborhood、--top、--community、--source-doc、--min-confidencesift-kg 生成结构化知识,AI代理可以直接基于此进行操作。
将 sift 指向你的文档、笔记或项目文件。输出——一个JSON知识图谱——为任何AI代理提供持久化、结构化的理解,展示你世界中一切事物之间的联系。无需手动组织、无需标签、无需维基链接。结构从内容中自然涌现。```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
Works with bundled names (`schema-free`, `general`, `osint`, `academic`) or a path to a custom YAML file.
| Domain | Focus | Key Entity Types | Key Relation Types |
|--------|-------|------------------|--------------------|
| `schema-free` | Auto-discovered from your data (default) | *(LLM designs per corpus)* | *(LLM designs per corpus)* |
| `general` | General document analysis | PERSON, ORGANIZATION, LOCATION, EVENT, DOCUMENT | ASSOCIATED_WITH, MEMBER_OF, LOCATED_IN |
| `osint` | Investigations & FOIA | SHELL_COMPANY, FINANCIAL_ACCOUNT | BENEFICIAL_OWNER_OF, TRANSACTED_WITH, SIGNATORY_OF |
| `academic` | Literature review & topic mapping | 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 提出建议,您进行验证。每次提取都会链接回源文档和段落。
See [`examples/transformers/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/transformers/) for 12 foundational AI papers mapped as a concept graph (425 entities, ~$0.72), and [`examples/ftx/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/ftx/) for the FTX collapse (431 entities from 9 articles). [**Explore the live demos**](https://juanceresa.github.io/sift-kg/) — no install, no API key.
## Civic Table
Looking for a hosted platform with forensic legal analysis and analyst verification?
[**Civic Table**](https://github.com/juanceresa/forensic_analysis_platform) is a forensic intelligence platform built on the sift-kg pipeline. It adds a 4-tier verification system where analysts and JDs validate AI-extracted facts before they're treated as evidence, LaTeX dossier generation for legal submissions, and a web interface for sharing results with clients and families. Built for property restitution, investigative journalism, and any context where documentary provenance matters.
sift-kg is the open-source CLI. Civic Table is the full platform — and where the output gets vetted by analysts and JDs before it carries evidentiary weight.
## Installation
Requires 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
在 .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 中的任何设置。
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进行的本地OCR,用于扫描的PDF——无需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 图。自动去重近乎相同的实体名称(复数、Unicode 变体、大小写差异),使它们成为图节点。当 LLM 交换源/目标类型与域模式时,修复反转的边方向。标记低置信度关系以供审查。保存至 `output/graph_data.json`。
### 4. 解析重复实体
请参见下方的[实体解析工作流程](#entity-resolution-workflow)了解完整指南——这对于家谱、法律和调查用例尤为重要,因为准确性至关重要。
### 5. 探索与导出
**交互式查看器**——在浏览器中探索你的概念图:```bash
sift view # full graph
sift view --neighborhood "Palantir Technologies" # 1-hop ego graph around an entity
sift view --neighborhood "Palantir" --depth 3 # 3-hop neighborhood
sift view --top 10 # top 10 hubs + their neighbors
sift view --community "Community 1" # focus on a specific community
sift view --source-doc palantir_nsa_surveillance # entities from one document
sift view --min-confidence 0.8 # hide low-confidence nodes/edges
打开浏览器中的力导向图。概览显示社区区域——彩色凸包将相关实体分组——因此无需标签杂乱即可一目了然地看到图结构。悬停任意节点可预览其名称和连接。包含搜索、类型/社区/关系切换、源文档过滤器、度过滤器以及详细侧边栏。
预过滤标志(--top、--neighborhood、--source-doc、--min-confidence)可在渲染前缩减图。--community 在侧边栏中预选一个社区。--neighborhood 接受实体 ID(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
使用 sift-kg 从 Python — Jupyter notebooks, scripts, web apps:```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:```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文件,以便仔细研究每个提案。该文件设计为人类可读。
### Layer 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
每次运行都是累加的——之前 CONFIRMED/REJECTED 决策在 merge_proposals.yaml 中会被保留。
预去重和 LLM 批处理技术受到了 @stochastic-sisyphus 的 KGGen(NeurIPS 2025)的启发。KGGen 使用 SemHash 进行确定性实体去重,并使用基于嵌入的聚类在 LLM 比较之前对实体进行分组。sift-kg 将这些技术适应到其人在回路审查工作流程中。
默认情况下,sift resolve 按字母顺序对实体进行排序,并将它们拆分成重叠的批次以进行 LLM 比较。这在重复项拼写相似时效果很好——但“Robert Smith”(R)和“Bob Smith”(B)最终进入不同的批次而永远不会被比较。```bash
pip install sift-kg[embeddings] # sentence-transformers + scikit-learn (~2GB, pulls PyTorch)
sift resolve --embeddings
这用KMeans聚类对句子嵌入(all-MiniLM-L6-v2)替代了按字母顺序分批。语义相似的名称无论拼写如何都会聚类在一起。
| | 默认(按字母顺序) | `--embeddings` |
|---|---|---|
| 安装大小 | 包含 | ~2GB(PyTorch) |
| 首次运行开销 | 无 | ~90MB模型下载 |
| 每次运行开销 | 仅排序 | 编码(数百个实体<1秒) |
| 跨字母表重复项 | 不同批次中遗漏 | 捕获 |
| 小图(每种<100个) | 相同结果 | 相同结果 |
如果依赖项未安装或聚类失败,则回退到按字母顺序分批。
## 许可证
MIT
--ocr 标志),可选 Google Cloud Vision 作为备用(--ocr-backend gcv)--max-cost 以限制LLM花费| 使用场景 | 建议方法 |
|---|
| 快速探索 | sift review --auto-approve 0.85 — 批准高置信度结果,审查其余部分 |
| 家谱/家族记录 | 手动编辑 YAML,--auto-approve 1.0 — 审查每一次合并 |
| 法律/调查 | sift resolve --embeddings,手动编辑 YAML,使用 sift view 在轮次之间检查 |
| 大型语料库(1000+ 实体) | 使用 sift resolve --embeddings 进行更好的批处理,然后进行交互式审查 |