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绕过, 突变策略, 网络调试, 自动化, 逆向工具