mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 08:26:21 +02:00
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.
267 lines
9.4 KiB
Markdown
267 lines
9.4 KiB
Markdown
---
|
||
layout: default
|
||
title: "提取来源:子图模型"
|
||
parent: "Chinese (Beta)"
|
||
---
|
||
|
||
# 提取来源:子图模型
|
||
|
||
> **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.
|
||
|
||
## 问题
|
||
|
||
<<<<<<< HEAD
|
||
提取时 provenance 目前为每个提取的三元组生成完整的重构:一个唯一的 ⟦CODE_0⟧、⟦CODE_1⟧,以及与每个知识事实相关的 PROV-O 元数据。处理一个块
|
||
提取时 provenance 目前为每个提取的三元组生成完整的重构:一个唯一的 `stmt_uri`、`activity_uri`,以及与每个知识事实相关的 PROV-O 元数据。处理一个块
|
||
提取时 provenance 目前为每个提取的三元组生成完整的重构:一个唯一的 ⟦CODE_0⟧、⟦CODE_1⟧,以及与每个知识事实相关的 PROV-O 元数据。处理一个块
|
||
这会产生 20 个关系,并在其基础上产生约 220 个溯源三元组,而知识三元组约为 20 个,这导致了大约 10:1 的开销。
|
||
|
||
|
||
这既成本高昂(存储、索引、传输),又在语义上
|
||
不准确。每个片段都由单个 LLM 调用处理,该调用在一个事务中生成
|
||
所有其三元组。当前的每个三元组模型
|
||
通过制造 20 个独立提取
|
||
事件的假象来掩盖这一点。
|
||
=======
|
||
提取时段的溯源信息目前会生成完整的实体化表示。
|
||
提取的三元组:一个唯一的 `stmt_uri`,`activity_uri`,以及与之相关的
|
||
PROV-O 元数据,用于每个知识事实。处理一个块
|
||
这会产生 20 个关系,并在其基础上产生约 220 个溯源三元组,而知识三元组约为 20 个,这导致了大约 10:1 的开销。
|
||
|
||
|
||
这既昂贵(存储、索引、传输),又在语义上
|
||
不准确。每个片段都由单个 LLM 调用处理,该调用在一个事务中生成
|
||
所有三元组。当前的每个三元组模型
|
||
通过产生 20 个独立提取
|
||
事件的幻觉来掩盖这一点。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
|
||
此外,四个提取处理器中的两个(kg-extract-ontology、
|
||
kg-extract-agent)完全没有来源信息,这在审计
|
||
跟踪中留下了空白。
|
||
|
||
## 解决方案
|
||
|
||
<<<<<<< HEAD
|
||
将每个三元组的显式化替换为**子图模型**:每个数据块提取一个溯源记录,该记录在从该数据块生成的所有三元组中共享。
|
||
=======
|
||
用 **子图模型** 替换三元组级别的显式化:每个数据块提取一个溯源记录,该记录与从该数据块生成的所有三元组共享。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
|
||
|
||
|
||
### 术语变更
|
||
|
||
| 旧术语 | 新术语 |
|
||
|-----|-----|
|
||
| `stmt_uri` (`https://trustgraph.ai/stmt/{uuid}`) | `subgraph_uri` (`https://trustgraph.ai/subgraph/{uuid}`) |
|
||
| `statement_uri()` | `subgraph_uri()` |
|
||
<<<<<<< HEAD
|
||
| `tg:reifies` (1:1, 相同) | `tg:contains` (1:多, 包含) |
|
||
|
||
### 目标结构
|
||
|
||
所有溯源三元组都放入名为 `urn:graph:source` 的命名图中。
|
||
=======
|
||
| `tg:reifies` (1:1, 身份) | `tg:contains` (1:多, 包含) |
|
||
|
||
### 目标结构
|
||
|
||
所有溯源三元组都存储在名为 `urn:graph:source` 的图中。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
|
||
```
|
||
# 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}" .
|
||
```
|
||
|
||
### 比较数据量
|
||
|
||
对于一个产生 N 个提取三元组的模块:
|
||
|
||
| | 旧方式(每个三元组) | 新方式(子图) |
|
||
|---|---|---|
|
||
| `tg:contains` / `tg:reifies` | N | N |
|
||
| 活动三元组 | ~9 x N | ~9 |
|
||
| 代理三元组 | 2 x N | 2 |
|
||
| 语句/子图元数据 | 2 x N | 2 |
|
||
| **总的溯源三元组** | **~13N** | **N + 13** |
|
||
| **示例(N=20)** | **~260** | **33** |
|
||
|
||
## 范围
|
||
|
||
### 需要更新的处理器(现有溯源,每个三元组)
|
||
|
||
**kg-extract-definitions**
|
||
(`trustgraph-flow/trustgraph/extract/kg/definitions/extract.py`)
|
||
|
||
<<<<<<< HEAD
|
||
目前,它在每个定义的循环内部调用 `statement_uri()` + `triple_provenance_triples()`。
|
||
=======
|
||
当前,它在每个定义的循环内部调用 `statement_uri()` + `triple_provenance_triples()`。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
|
||
|
||
更改:
|
||
将 `subgraph_uri()` 和 `activity_uri()` 的创建移到循环之前。
|
||
在循环内部收集 `tg:contains` 三元组。
|
||
循环结束后,一次性输出共享的活动/主体/推导块。
|
||
|
||
**kg-extract-relationships**
|
||
(`trustgraph-flow/trustgraph/extract/kg/relationships/extract.py`)
|
||
|
||
模式与定义相同。 更改也相同。
|
||
|
||
<<<<<<< HEAD
|
||
### 需要添加的处理器,用于添加来源信息(目前缺失)
|
||
=======
|
||
### 需要添加的处理器,用于添加来源信息(当前缺失)
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
|
||
**kg-extract-ontology**
|
||
(`trustgraph-flow/trustgraph/extract/kg/ontology/extract.py`)
|
||
|
||
<<<<<<< HEAD
|
||
目前会生成不带来源信息的三元组。添加子图来源信息。
|
||
=======
|
||
目前会输出不带来源信息的三元组。添加子图来源信息。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
使用相同的模式:每个块一个子图,对于每个提取的三元组使用 `tg:contains`。
|
||
|
||
|
||
**kg-extract-agent**
|
||
(`trustgraph-flow/trustgraph/extract/kg/agent/extract.py`)
|
||
|
||
<<<<<<< HEAD
|
||
目前会生成不带来源信息的三元组。添加子图来源信息。
|
||
=======
|
||
目前会输出不带来源信息的三元组。添加子图来源信息。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
使用相同的模式。
|
||
|
||
### 共享来源库的更改
|
||
|
||
**`trustgraph-base/trustgraph/provenance/triples.py`**
|
||
|
||
将 `triple_provenance_triples()` 替换为 `subgraph_provenance_triples()`
|
||
<<<<<<< HEAD
|
||
新函数接受一个提取的三元组列表,而不是单个三元组。
|
||
=======
|
||
新函数接受提取的三元组列表,而不是单个三元组。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
为每个三元组生成一个 `tg:contains`,共享活动/代理块。
|
||
移除旧的 `triple_provenance_triples()`
|
||
|
||
**`trustgraph-base/trustgraph/provenance/uris.py`**
|
||
|
||
将 `statement_uri()` 替换为 `subgraph_uri()`
|
||
|
||
**`trustgraph-base/trustgraph/provenance/namespaces.py`**
|
||
|
||
将 `TG_REIFIES` 替换为 `TG_CONTAINS`
|
||
|
||
### 不在范围之内
|
||
|
||
**kg-extract-topics**: 较旧的处理器,目前未在标准流程中使用。
|
||
**kg-extract-rows**: 生成的是行,而不是三元组,具有不同的数据来源模型。
|
||
**查询时的数据来源** (⟦CODE_0⟧): 独立的关注点。
|
||
模型
|
||
<<<<<<< HEAD
|
||
**查询时的数据来源信息** (`urn:graph:retrieval`):独立的关注点,
|
||
已经使用了不同的模式(提问/探索/聚焦/综合)。
|
||
**文档/页面/块的来源**(PDF解码器,分块器):已经使用了。
|
||
`derived_entity_triples()`,这对于每个实体而言,而不是每个三元组而言,因此没有
|
||
重复的问题。
|
||
=======
|
||
**查询时的数据来源信息** (`urn:graph:retrieval`): 独立的关注点,
|
||
已经使用了不同的模式(问题/探索/重点/综合)。
|
||
**文档/页面/块的来源**(PDF解码器,分块器):已经使用了。
|
||
`derived_entity_triples()`,这对于每个实体而言,而不是每个三元组而言——没有。
|
||
重复问题。
|
||
>>>>>>> 82edf2d (New md files from RunPod)
|
||
|
||
## 实现说明
|
||
|
||
### 处理器循环重构
|
||
|
||
之前(每个三元组,在关系中):
|
||
```python
|
||
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))
|
||
```
|
||
|
||
在 (子图) 之后:
|
||
```python
|
||
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))
|
||
```
|
||
|
||
### 新的辅助签名
|
||
|
||
```python
|
||
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
|
||
"""
|
||
```
|
||
|
||
### 破坏性变更
|
||
|
||
这是一个对溯源模型的重大更改。
|
||
溯源功能尚未发布,因此无需迁移。旧的 `tg:reifies` / `tg:reifies` 代码可以直接删除。
|
||
`statement_uri` 代码可以直接删除。
|