trustgraph/docs/tech-specs/extraction-provenance-subgraph.es.md
Alex Jenkins 8954fa3ad7 Feat: TrustGraph i18n & Documentation Translation Updates (#781)
Native CLI i18n: The TrustGraph CLI has built-in translation support
that dynamically loads language strings. You can test and use
different languages by simply passing the --lang flag (e.g., --lang
es for Spanish, --lang ru for Russian) or by configuring your
environment's LANG variable.

Automated Docs Translations: This PR introduces autonomously
translated Markdown documentation into several target languages,
including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew,
Arabic, Simplified Chinese, and Russian.
2026-04-14 12:08:32 +01:00

7.1 KiB

layout title parent
default Origen de la extracción: Modelo de subgrafo Spanish (Beta)

Origen de la extracción: Modelo de subgrafo

Beta Translation: This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.

Problema

Actualmente, la generación de la procedencia en tiempo de extracción crea una reificación completa por cada triple extraído: un stmt_uri, activity_uri y metadatos PROV-O asociados para cada hecho de conocimiento. El procesamiento de un bloque que produce 20 relaciones genera aproximadamente 220 triples de procedencia además de los aproximadamente 20 triples de conocimiento, lo que supone una sobrecarga de aproximadamente 10:1.

Esto es costoso (almacenamiento, indexación, transmisión) y semánticamente inexacto. Cada bloque se procesa mediante una única llamada a un LLM que produce todos sus triples en una sola transacción. El modelo actual, que es por triple, oscurece esto al crear la ilusión de 20 eventos de extracción independientes.

Además, dos de los cuatro procesadores de extracción (kg-extract-ontology, kg-extract-agent) no tienen ninguna procedencia, lo que deja lagunas en el registro de auditoría.

Solución

Reemplazar la reificación por triple con un modelo de subgrafo: un único registro de procedencia por extracción de bloque, compartido entre todos los triples producidos a partir de ese bloque.

Cambio de terminología

Antiguo Nuevo
stmt_uri (https://trustgraph.ai/stmt/{uuid}) subgraph_uri (https://trustgraph.ai/subgraph/{uuid})
statement_uri() subgraph_uri()
tg:reifies (1:1, identidad) tg:contains (1:muchos, contención)

Estructura objetivo

Todos los triples de procedencia se almacenan en el grafo con nombre urn:graph:source.

# Subgraph contains each extracted triple (RDF-star quoted triples)
<subgraph> tg:contains <<s1 p1 o1>> .
<subgraph> tg:contains <<s2 p2 o2>> .
<subgraph> tg:contains <<s3 p3 o3>> .

# Derivation from source chunk
<subgraph> prov:wasDerivedFrom <chunk_uri> .
<subgraph> prov:wasGeneratedBy <activity> .

# Activity: one per chunk extraction
<activity> rdf:type          prov:Activity .
<activity> rdfs:label        "{component_name} extraction" .
<activity> prov:used         <chunk_uri> .
<activity> prov:wasAssociatedWith <agent> .
<activity> prov:startedAtTime "2026-03-13T10:00:00Z" .
<activity> tg:componentVersion "0.25.0" .
<activity> tg:llmModel       "gpt-4" .          # if available
<activity> tg:ontology        <ontology_uri> .   # if available

# Agent: stable per component
<agent> rdf:type   prov:Agent .
<agent> rdfs:label "{component_name}" .

Comparación de volúmenes

Para un bloque que produce N triples extraídos:

Viejo (por triple) Nuevo (subgrafo)
tg:contains / tg:reifies N N
Triples de actividad ~9 x N ~9
Triples de agente 2 x N 2
Metadatos de declaración/subgrafo 2 x N 2
Total de triples de procedencia ~13N N + 13
Ejemplo (N=20) ~260 33

Alcance

Procesadores a Actualizar (procedencia existente, por triple)

kg-extract-definitions (trustgraph-flow/trustgraph/extract/kg/definitions/extract.py)

Actualmente llama a statement_uri() + triple_provenance_triples() dentro del bucle por definición.

Cambios: Mover la creación de subgraph_uri() y activity_uri() antes del bucle Recolectar los triples tg:contains dentro del bucle Emitir el bloque compartido de actividad/agente una vez después del bucle

kg-extract-relationships (trustgraph-flow/trustgraph/extract/kg/relationships/extract.py)

Mismo patrón que definiciones. Mismos cambios.

Procesadores a Agregar Procedencia (actualmente ausente)

kg-extract-ontology (trustgraph-flow/trustgraph/extract/kg/ontology/extract.py)

Actualmente emite triples sin procedencia. Agregar procedencia de subgrafo utilizando el mismo patrón: un subgrafo por bloque, tg:contains para cada triple extraído.

kg-extract-agent (trustgraph-flow/trustgraph/extract/kg/agent/extract.py)

Actualmente emite triples sin procedencia. Agregar procedencia de subgrafo utilizando el mismo patrón.

Cambios en la Biblioteca Compartida de Procedencia

trustgraph-base/trustgraph/provenance/triples.py

Reemplazar triple_provenance_triples() con subgraph_provenance_triples() Nueva función acepta una lista de triples extraídos en lugar de uno solo Genera un tg:contains por triple, bloque compartido de actividad/agente Eliminar el triple_provenance_triples() antiguo

trustgraph-base/trustgraph/provenance/uris.py

Reemplazar statement_uri() con subgraph_uri()

trustgraph-base/trustgraph/provenance/namespaces.py

Reemplazar TG_REIFIES con TG_CONTAINS

No Incluido en el Alcance

kg-extract-topics: procesador de estilo antiguo, no se utiliza actualmente en flujos estándar kg-extract-rows: produce filas no triples, modelo de procedencia diferente Procedencia en tiempo de consulta (urn:graph:retrieval): preocupación separada, ya utiliza un patrón diferente (pregunta/exploración/énfasis/síntesis) Procedencia de documento/página/bloque (decodificador de PDF, segmentador): ya utiliza derived_entity_triples() que es por entidad, no por triple — no hay problema de redundancia

Notas de Implementación

Reestructuración del Bucle del Procesador

Antes (por triple, en relaciones):

for rel in rels:
    # ... build relationship_triple ...
    stmt_uri = statement_uri()
    prov_triples = triple_provenance_triples(
        stmt_uri=stmt_uri,
        extracted_triple=relationship_triple,
        ...
    )
    triples.extend(set_graph(prov_triples, GRAPH_SOURCE))

Después (subgrafo):

sg_uri = subgraph_uri()

for rel in rels:
    # ... build relationship_triple ...
    extracted_triples.append(relationship_triple)

prov_triples = subgraph_provenance_triples(
    subgraph_uri=sg_uri,
    extracted_triples=extracted_triples,
    chunk_uri=chunk_uri,
    component_name=default_ident,
    component_version=COMPONENT_VERSION,
    llm_model=llm_model,
    ontology_uri=ontology_uri,
)
triples.extend(set_graph(prov_triples, GRAPH_SOURCE))

Nueva Firma de Asistente

def subgraph_provenance_triples(
    subgraph_uri: str,
    extracted_triples: List[Triple],
    chunk_uri: str,
    component_name: str,
    component_version: str,
    llm_model: Optional[str] = None,
    ontology_uri: Optional[str] = None,
    timestamp: Optional[str] = None,
) -> List[Triple]:
    """
    Build provenance triples for a subgraph of extracted knowledge.

    Creates:
    - tg:contains link for each extracted triple (RDF-star quoted)
    - One prov:wasDerivedFrom link to source chunk
    - One activity with agent metadata
    """

Cambio importante

Este es un cambio importante en el modelo de trazabilidad. La trazabilidad no se ha publicado, por lo que no se necesita ninguna migración. El código antiguo tg:reifies / statement_uri se puede eliminar por completo.