
Convierte cualquier colección de documentos en un grafo de conocimiento. Extrae entidades y relaciones mediante LLM, desduplica con tu aprobación. Mapea dominios, encuentra conexiones ocultas, descubre patrones entre documentos — conocimiento que persiste y se acumula, para ti y tus agentes de IA. Todo desde la CLI.
Convierte cualquier colección de documentos en un grafo de conocimiento.
Sin código, sin base de datos, sin infraestructura — solo una CLI y tus documentos. Ingresa PDFs, artículos, papers o registros — obtén un grafo de conocimiento navegable que muestra cómo todo se conecta, en cuestión de minutos. sift-kg extrae entidades y relaciones mediante LLM, las deduplica con tu aprobación, y genera un visor interactivo que puedes explorar en tu navegador. Mapas conceptuales para todo, al alcance de tu mano.
El mismo grafo que impulsa tus visualizaciones también funciona como un segundo cerebro de IA. Todos pasan meses construyendo bases de conocimiento en Notion y Obsidian. ¿Quién tiene tiempo para eso? sift-kg es la memoria estructurada que construyes en 2 minutos en lugar de 2 años. Solo apunta a tus documentos y tu IA tendrá una comprensión estructurada de cómo todo se conecta.
Demostraciones en vivo → grafos generados completamente por 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.
## Cómo funciona```
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)
Every entity and relation links back to the source document and passage. You control what gets merged. The graph is yours.
sift.yaml en tu proyecto para configuraciones persistentesdiscovered_domain.yaml para reutilizar y editar. O usa un dominio estructurado (general, osint, academic) para esquemas fijos, o define el tuyo propio en YAMLsift search "SBF" encuentra entidades por nombre o alias, con salida opcional de relaciones y descripciones--neighborhood, --top, , , sift-kg genera conocimiento estructurado del que los agentes de IA pueden operar directamente.
Apunta sift a tus documentos, notas o archivos de proyecto. La salida — un grafo de conocimiento en JSON — le da a cualquier agente de IA una comprensión estructurada y persistente de cómo se conecta todo en tu mundo. Sin organización manual, sin etiquetado, sin enlaces wiki. La estructura surge del contenido.```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)
El gráfico persiste entre sesiones y crece incrementalmente — extrae nuevos documentos en el mismo directorio de salida y reconstruye. La deduplicación de entidades asegura que el gráfico se mantenga coherente a medida que crece.
**Lo que esto le da a tu agente:**
- **Estructura** — no solo fragmentos de texto, sino entidades, relaciones, comunidades y cómo se conectan
- **Topología** — qué clústeres de conocimiento existen, qué los conecta, qué está aislado
- **Durabilidad** — el gráfico sobrevive a los reinicios de la ventana de contexto. Tu agente deja de empezar desde cero cada sesión
**Habilidad de agente incluida:** sift-kg incluye una habilidad en `.agents/skills/sift-kg/SKILL.md` que enseña a los agentes cómo usar el gráfico de conocimiento como memoria persistente — orientación de sesión, exploración de entidades, razonamiento de islas de conocimiento enlazadas y generación de sugerencias fundamentadas.
## Dominios Incluidos
sift-kg incluye dominios especializados que puedes usar listos para usar:```bash
sift domains # list available domains
sift extract ./docs/ --domain-name osint # use a bundled domain
Establece un dominio en sift.yaml para no necesitar la bandera cada vez:```yaml
domain: academic
| Dominio | Enfoque | Tipos de Entidades Clave | Tipos de Relaciones Clave |
|--------|---------|--------------------------|---------------------------|
| `schema-free` | Descubierto automáticamente de tus datos (predeterminado) | *(Diseños de LLM por corpus)* | *(Diseños de LLM por corpus)* |
| `general` | Análisis general de documentos | PERSON, ORGANIZATION, LOCATION, EVENT, DOCUMENT | ASSOCIATED_WITH, MEMBER_OF, LOCATED_IN |
| `osint` | Investigaciones y FOIA | SHELL_COMPANY, FINANCIAL_ACCOUNT | BENEFICIAL_OWNER_OF, TRANSACTED_WITH, SIGNATORY_OF |
| `academic` | Revisión de literatura y mapeo de temas | CONCEPT, THEORY, METHOD, SYSTEM, FINDING, PHENOMENON, RESEARCHER, PUBLICATION, FIELD, DATASET | SUPPORTS, CONTRADICTS, EXTENDS, IMPLEMENTS, EXPLAINS, PROPOSED_BY, USES_METHOD, APPLIED_TO, INVESTIGATES |
El dominio **academic** mapea el panorama intelectual de un área de investigación — introduce artículos y obtén un grafo de cómo teorías, métodos, sistemas, hallazgos y conceptos se conectan. Distingue ideas abstractas (THEORY, METHOD) de artefactos concretos (SYSTEM — por ejemplo, GPT-2, BERT, GLUE). Diseñado para revisiones de literatura, mapeo de temas y comprensión de dónde las ideas concuerdan, se contradicen o se construyen unas sobre otras.
El dominio **schema-free** (el predeterminado) ejecuta un paso de **descubrimiento de esquemas** antes de la extracción — una llamada LLM muestrea tus documentos y diseña tipos de entidades y relaciones adaptados al corpus. El esquema descubierto se guarda en `output/discovered_domain.yaml` y se reutiliza en ejecuciones posteriores, por lo que los tipos se mantienen consistentes en todos los fragmentos y documentos. Puedes inspeccionar, editar manualmente o copiar el archivo como punto de partida para un dominio personalizado. Usa `--force` para redescubrir. En lugar de forzar relaciones en categorías predefinidas como ASSOCIATED_WITH, produce tipos específicos como FUNDED, TESTIFIED_AGAINST o ENROLLED_AT. Usa un dominio estructurado como `general` o `osint` cuando quieras un esquema fijo que definas de antemano.
El dominio **general** proporciona un esquema fijo con tipos de entidad PERSON, ORGANIZATION, LOCATION, EVENT y DOCUMENT, además de tipos de relación comunes. Útil cuando quieres tipos predecibles y consistentes entre documentos.
El dominio **osint** agrega tipos de entidad para empresas fantasma, cuentas financieras y jurisdicciones offshore, además de tipos de relación para rastrear la propiedad beneficiaria y los flujos financieros.
Nada se fusiona sin tu aprobación — el LLM propone, tú verificas. Cada extracción enlaza de vuelta al documento fuente y al pasaje.
Ve [`examples/transformers/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/transformers/) para 12 artículos fundamentales de IA mapeados como un grafo de conceptos (425 entidades, ~$0.72), y [`examples/ftx/`](https://github.com/juanceresa/sift-kg/blob/HEAD/examples/ftx/) para el colapso de FTX (431 entidades de 9 artículos). [**Explora las demostraciones en vivo**](https://juanceresa.github.io/sift-kg/) — sin instalación, sin clave API.
## Civic Table
¿Buscas una plataforma alojada con análisis legal forense y verificación de analistas?
[**Civic Table**](https://github.com/juanceresa/forensic_analysis_platform) es una plataforma de inteligencia forense construida sobre el pipeline sift-kg. Añade un sistema de verificación de 4 niveles donde analistas y JDs validan hechos extraídos por IA antes de que se traten como evidencia, generación de dosieres LaTeX para presentaciones legales, y una interfaz web para compartir resultados con clientes y familias. Construido para restitución de propiedades, periodismo de investigación y cualquier contexto donde la procedencia documental importe.
sift-kg es la CLI de código abierto. Civic Table es la plataforma completa — y donde la producción es examinada por analistas y JDs antes de que tenga peso probatorio.
## Instalación
Requiere Python 3.11+.```bash
pip install sift-kg
Para soporte OCR (PDFs escaneados, imágenes):```bash
brew install tesseract # macOS sudo apt install tesseract-ocr # Ubuntu/Debian
Para Google Cloud Vision OCR como backend alternativo (opcional):```bash
pip install sift-kg[ocr]
# Then use: sift extract ./docs/ --ocr --ocr-backend gcv
Para agrupación semántica durante la resolución de entidades (opcional, ~2GB para PyTorch):```bash pip install sift-kg[embeddings]
Para desarrollo:```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` genera un archivo de configuración de proyecto `sift.yaml` para que no necesites banderas en cada comando:```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
Establece tu clave de API en .env:```
SIFT_OPENAI_API_KEY=sk-...
O use Anthropic, Mistral, Ollama, o cualquier proveedor de LiteLLM:```
SIFT_ANTHROPIC_API_KEY=sk-ant-...
SIFT_MISTRAL_API_KEY=...
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
Lee más de 75 formatos de documentos — PDFs, DOCX, XLSX, PPTX, HTML, EPUB, imágenes y más. Extrae entidades y relaciones usando tu LLM configurado. Los resultados se guardan como JSON en `output/extractions/`.
La bandera `--ocr` habilita OCR local mediante Tesseract para PDFs escaneados — no se necesitan claves de API ni servicios en la nube. Puedes cambiar de motor OCR con `--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)
Detecta automáticamente qué PDFs necesitan OCR — los PDFs con mucho texto utilizan la extracción estándar, solo las páginas casi vacías recurren al OCR. Seguro para carpetas mixtas. Sin --ocr, sift advertirá si un PDF parece escaneado.
También puede cambiar completamente el backend de extracción con --extractor pdfplumber para el backend heredado de pdfplumber (solo PDF/DOCX/TXT/HTML).
sift build
Construye un grafo NetworkX a partir de todas las extracciones. Deduplica automáticamente nombres de entidades casi idénticos (plurales, variantes Unicode, diferencias de mayúsculas/minúsculas) antes de que se conviertan en nodos del grafo. Corrige direcciones de arista invertidas cuando el LLM intercambia tipos fuente/destino frente al esquema del dominio. Marca relaciones de baja confianza para revisión. Guarda en `output/graph_data.json`.
### 4. Resolver entidades duplicadas
Consulte [Flujo de trabajo de resolución de entidades](#entity-resolution-workflow) a continuación para obtener la guía completa, especialmente importante para casos de uso genealógicos, legales y de investigación donde la precisión es importante.
### 5. Explorar y exportar
**Visor interactivo** — explore su mapa conceptual en el navegador:```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
Abre un gráfico de fuerza dirigida en tu navegador. La vista general muestra regiones de comunidad — envolventes convexas de colores que agrupan entidades relacionadas — para que puedas ver la estructura del gráfico de un vistazo sin saturación de etiquetas. Pasa el cursor sobre cualquier nodo para previsualizar su nombre y conexiones. Incluye búsqueda, alternancias de tipo/comunidad/relación, filtro de documento fuente, filtro de grado y un panel lateral de detalles.
Las banderas de pre-filtrado (--top, --neighborhood, --source-doc, --min-confidence) reducen el gráfico antes de renderizarlo. --community pre-selecciona una comunidad en el panel lateral. --neighborhood acepta IDs de entidad (person:alice) o nombres mostrados (sin distinguir mayúsculas/minúsculas).
Modo enfoque: Haz doble clic en cualquier entidad para aislar su vecindario. Usa las teclas de flecha para recorrer las conexiones una por una — cada par se muestra de forma aislada con aristas etiquetadas. Presiona Enter/Flecha derecha para cambiar el enfoque a un vecino, Retroceso/Flecha izquierda para retroceder en tu camino, Escape para salir. Tu exploración se rastrea como una miga de pan de ruta en el panel lateral — un camino persistente que muestra cada nodo que has visitado y las relaciones entre ellos. Las aristas del rastro permanecen resaltadas en el lienzo para que puedas ver tu camino a través del gráfico. Esta es la forma prevista de explorar gráficos densos — acercarse a lo que importa, trazar conexiones, leer la evidencia.
Búsqueda CLI — consulta entidades directamente desde la terminal:```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** — para herramientas de análisis donde desees un diseño, filtrado o estilo personalizados:```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
Usa GraphML/GEXF cuando quieras controlar el tamaño de los nodos, la ponderación de aristas, esquemas de color personalizados o aplicar algoritmos de grafos (centralidad, detección de comunidades) en herramientas especializadas. SQLite es útil para consultas SQL ad-hoc, publicaciones en Datasette o cargar datos en DuckDB.
sift narrate sift narrate --communities-only # regenerate community labels only (~$0.01)
Produce `output/narrative.md` — un informe en prosa con un resumen, cadenas de relaciones clave entre las entidades principales, una línea de tiempo (cuando existen fechas en los datos) y perfiles de entidades agrupados por comunidad temática (descubierta mediante detección de comunidades Louvain). Las descripciones de entidades están escritas en voz activa con acciones específicas, no resúmenes de roles.
## Configuración del Dominio
sift-kg incluye cuatro dominios empaquetados (consulta [Dominios Empaquetados](#bundled-domains) arriba para más detalles). El valor predeterminado es `schema-free`.
Usar un dominio incluido:```bash
sift extract ./docs/ --domain-name osint
O crea tu propio 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
**Aplicación del esquema:** Los tipos de entidad y los tipos de relación definidos en su dominio se tratan como un conjunto cerrado — se indica al LLM que utilice solo estos tipos y que no invente otros nuevos. Si se define `fallback_relation`, las relaciones que no encajan en ningún tipo definido se asignan al fallback. Si se omite, el LLM utiliza el tipo definido que más se aproxime con menor confianza. Si ve muchas relaciones que terminan en su tipo de fallback, es probable que su esquema carezca de un tipo de relación que los datos necesitan — agréguelo y vuelva a extraer.
Los tipos de entidad con `canonical_names` aplican un vocabulario cerrado. Los nombres permitidos se inyectan en el mensaje de extracción del LLM para que genere coincidencias exactas. Como red de seguridad, cualquier nombre extraído que no esté en la lista se reclasifica a `canonical_fallback_type` durante la construcción del grafo (o se mantiene tal cual si no hay fallback definido). Útil para taxonomías controladas — departamentos, jurisdicciones, clasificaciones predefinidas.```bash
sift extract ./docs/ --domain path/to/domain.yaml
Usa sift-kg desde Python — Jupyter notebooks, scripts, aplicaciones web:```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"))
## Estructura del Proyecto
Después de ejecutar el pipeline, tu directorio de salida contiene:```
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
Cuando estás construyendo un grafo de conocimiento a partir de registros familiares, documentos legales o cualquier documento donde la precisión importa, deseas control total sobre qué entidades se fusionan. sift-kg nunca fusiona nada sin tu aprobación.
El flujo de trabajo tiene tres capas, cada una detectando diferentes tipos de duplicados:
sift build)Antes de que las entidades se conviertan en nodos del grafo, sift colapsa determinísticamente nombres que son obviamente iguales. Sin LLM involucrado, sin costo, sin necesidad de revisión:
Esto ocurre automáticamente cada vez que ejecutas sift build. Estos son los casos triviales — variantes ortográficas que saturarían tu grafo sin agregar información.
sift resolve)El LLM ve lotes de entidades (todos los tipos excepto DOCUMENT) e identifica aquellas que probablemente se refieren a la misma cosa del mundo real. También detecta duplicados entre tipos (mismo nombre, diferente tipo de entidad) y propone relaciones de variante (EXTENDS) cuando encuentra patrones padre/hijo. Los resultados van a merge_proposals.yaml (fusiones de entidades) y relation_review.yaml (relaciones de variante), todo comenzando como DRAFT:```bash
sift resolve # uses domain from sift.yaml
sift resolve --domain osint # or specify explicitly
Si tienes un dominio configurado, el LLM usa ese contexto para hacer mejores juicios sobre los nombres de entidades específicos de tu campo.
Esto genera propuestas como:```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'.
Nada se ha fusionado todavía. El LLM está proponiendo, no decidiendo.
Tienes dos opciones para revisar propuestas:
Opción A: Revisión interactiva de terminal```bash sift review
Recorre cada propuesta `DRAFT` una por una. Para cada una, ves la entidad canónica, los miembros de fusión propuestos, la confianza y el razonamiento del LLM. Apruebas, rechazas u omites.
Las propuestas de alta confianza (>0.85 por defecto) se auto-aprueban, y las relaciones de baja confianza (<=0.5 por defecto) se auto-rechazan:```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
Opción B: Editar el YAML directamente
Abre output/merge_proposals.yaml en cualquier editor de texto. Cambia status: DRAFT por CONFIRMED o 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:
**Para casos de uso de alta precisión** (genealogía, revisión legal), recomendamos editar el YAML directamente para que puedas estudiar cada propuesta cuidadosamente. El archivo está diseñado para ser legible por humanos.
### Capa 3b: Revisión de Relaciones
Durante `sift build`, las relaciones por debajo del umbral de confianza (por defecto 0.7) o de tipos marcados como `review_required` en tu configuración de dominio se marcan en `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)
Mismo flujo de trabajo: revisar con sift review o editar el YAML, luego aplicar.
Una vez que hayas revisado todo:```bash sift apply-merges
Esto hace tres cosas:
1. **Fusiones de entidades confirmadas** — las entidades miembro se absorben en la entidad canónica. Todas sus relaciones se recablean. Los documentos fuente se combinan. Los nodos miembro se eliminan.
2. **Relaciones rechazadas** — eliminadas por completo del grafo.
3. **Propuestas BORRADOR** — se dejan intactas. Puedes volver a ellas más tarde.
El grafo se guarda de nuevo en `output/graph_data.json`. Puedes reexportar, narrar o visualizar el grafo limpiado.
### Iteración
La resolución de entidades no siempre es de una sola pasada. Después de fusionar, pueden aparecer nuevos duplicados. Puedes volver a ejecutar:```bash
sift resolve # find new duplicates in the cleaned graph
sift review # review the new proposals
sift apply-merges # apply again
Cada ejecución es aditiva: las decisiones previas de CONFIRMED/REJECTED en merge_proposals.yaml se conservan.
Las técnicas de pre-dedup y agrupación por lotes con LLM están inspiradas en KGGen (NeurIPS 2025) de @stochastic-sisyphus. KGGen utiliza SemHash para la deduplicación determinista de entidades y clustering basado en embeddings para agrupar entidades antes de la comparación con LLM. sift-kg adapta estos métodos a su flujo de trabajo de revisión con intervención humana.
Por defecto, sift resolve ordena las entidades alfabéticamente y las divide en lotes superpuestos para la comparación con LLM. Esto funciona bien cuando los duplicados tienen una ortografía similar, pero "Robert Smith" (R) y "Bob Smith" (B) terminan en lotes diferentes y nunca se comparan.```bash
pip install sift-kg[embeddings] # sentence-transformers + scikit-learn (~2GB, pulls PyTorch)
sift resolve --embeddings
Esto reemplaza el agrupamiento alfabético con clustering KMeans sobre embeddings de oraciones (all-MiniLM-L6-v2). Nombres semánticamente similares se agrupan juntos independientemente de la ortografía.
| | Predeterminado (alfabético) | `--embeddings` |
|---|---|---|
| Tamaño de instalación | Incluido | ~2GB (PyTorch) |
| Sobrecarga de primera ejecución | Ninguna | ~90MB de descarga del modelo |
| Sobrecarga por ejecución | Solo ordenamiento | Codificación (<1s para cientos de entidades) |
| Duplicados entre alfabetos | No detectados si están en distintos lotes | Detectados |
| Grafos pequeños (<100/tipo) | Mismo resultado | Mismo resultado |
Vuelve al agrupamiento alfabético si las dependencias no están instaladas o el clustering falla.
## Licencia
MIT
--community--source-doc--min-confidence--ocr), con opción de fallback a Google Cloud Vision (--ocr-backend gcv)--max-cost para limitar el gasto en LLM| Caso de uso | Enfoque sugerido |
|---|
| Exploración rápida | sift review --auto-approve 0.85 — aprobar alta confianza, revisar el resto |
| Genealogía / registros familiares | Editar YAML manualmente, --auto-approve 1.0 — revisar cada fusión individualmente |
| Legal / investigación | sift resolve --embeddings, editar YAML manualmente, usar sift view para inspeccionar entre rondas |
| Corpus grande (1000+ entidades) | sift resolve --embeddings para mejor agrupación por lotes, luego revisión interactiva |