mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 16:36:21 +02:00
356 lines
12 KiB
Markdown
356 lines
12 KiB
Markdown
|
|
---
|
||
|
|
layout: default
|
||
|
|
title: "Fluxos de Extração"
|
||
|
|
parent: "Portuguese (Beta)"
|
||
|
|
---
|
||
|
|
|
||
|
|
# Fluxos de Extração
|
||
|
|
|
||
|
|
> **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.
|
||
|
|
|
||
|
|
Este documento descreve como os dados fluem através do pipeline de extração do TrustGraph, desde o envio do documento até ao armazenamento nos repositórios de conhecimento.
|
||
|
|
|
||
|
|
## Visão Geral
|
||
|
|
|
||
|
|
```
|
||
|
|
┌──────────┐ ┌─────────────┐ ┌─────────┐ ┌────────────────────┐
|
||
|
|
│ Librarian│────▶│ PDF Decoder │────▶│ Chunker │────▶│ Knowledge │
|
||
|
|
│ │ │ (PDF only) │ │ │ │ Extraction │
|
||
|
|
│ │────────────────────────▶│ │ │ │
|
||
|
|
└──────────┘ └─────────────┘ └─────────┘ └────────────────────┘
|
||
|
|
│ │
|
||
|
|
│ ├──▶ Triples
|
||
|
|
│ ├──▶ Entity Contexts
|
||
|
|
│ └──▶ Rows
|
||
|
|
│
|
||
|
|
└──▶ Document Embeddings
|
||
|
|
```
|
||
|
|
|
||
|
|
## Armazenamento de Conteúdo
|
||
|
|
|
||
|
|
### Armazenamento de Blobs (S3/Minio)
|
||
|
|
|
||
|
|
O conteúdo do documento é armazenado em armazenamento de blobs compatível com S3:
|
||
|
|
Formato do caminho: `doc/{object_id}`, onde object_id é um UUID
|
||
|
|
Todos os tipos de documentos armazenados aqui: documentos de origem, páginas, trechos
|
||
|
|
|
||
|
|
### Armazenamento de Metadados (Cassandra)
|
||
|
|
|
||
|
|
Os metadados do documento armazenados no Cassandra incluem:
|
||
|
|
ID do documento, título, tipo (MIME)
|
||
|
|
Referência ao armazenamento de blobs `object_id`
|
||
|
|
Referência `parent_id` para documentos filhos (páginas, trechos)
|
||
|
|
`document_type`: "source", "page", "chunk", "answer"
|
||
|
|
|
||
|
|
### Limiar de Incorporação vs. Streaming
|
||
|
|
|
||
|
|
A transmissão de conteúdo usa uma estratégia baseada no tamanho:
|
||
|
|
**< 2MB**: O conteúdo é incluído inline na mensagem (codificado em base64)
|
||
|
|
**≥ 2MB**: Apenas `document_id` é enviado; o processador busca via API do bibliotecário
|
||
|
|
|
||
|
|
## Etapa 1: Envio de Documento (Bibliotecário)
|
||
|
|
|
||
|
|
### Ponto de Entrada
|
||
|
|
|
||
|
|
Os documentos entram no sistema através da operação `add-document` do bibliotecário:
|
||
|
|
1. O conteúdo é carregado no armazenamento de blobs
|
||
|
|
2. Um registro de metadados é criado no Cassandra
|
||
|
|
3. Retorna o ID do documento
|
||
|
|
|
||
|
|
### Disparando a Extração
|
||
|
|
|
||
|
|
A operação `add-processing` dispara a extração:
|
||
|
|
Especifica `document_id`, `flow` (ID do pipeline), `collection` (loja de destino)
|
||
|
|
A operação `load_document()` do bibliotecário busca o conteúdo e o publica na fila de entrada do fluxo
|
||
|
|
|
||
|
|
### Esquema: Documento
|
||
|
|
|
||
|
|
```
|
||
|
|
Document
|
||
|
|
├── metadata: Metadata
|
||
|
|
│ ├── id: str # Document identifier
|
||
|
|
│ ├── user: str # Tenant/user ID
|
||
|
|
│ ├── collection: str # Target collection
|
||
|
|
│ └── metadata: list[Triple] # (largely unused, historical)
|
||
|
|
├── data: bytes # PDF content (base64, if inline)
|
||
|
|
└── document_id: str # Librarian reference (if streaming)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Roteamento**: Baseado no campo `kind`:
|
||
|
|
`application/pdf` → fila `document-load` → Decodificador PDF
|
||
|
|
`text/plain` → fila `text-load` → Fragmentador
|
||
|
|
|
||
|
|
## Etapa 2: Decodificador PDF
|
||
|
|
|
||
|
|
Converte documentos PDF em páginas de texto.
|
||
|
|
|
||
|
|
### Processo
|
||
|
|
|
||
|
|
1. Buscar conteúdo (inline `data` ou via `document_id` do bibliotecário)
|
||
|
|
2. Extrair páginas usando PyPDF
|
||
|
|
3. Para cada página:
|
||
|
|
Salvar como documento filho no bibliotecário (`{doc_id}/p{page_num}`)
|
||
|
|
Emitir triplas de procedência (página derivada do documento)
|
||
|
|
Enviar para o fragmentador
|
||
|
|
|
||
|
|
### Esquema: TextDocument
|
||
|
|
|
||
|
|
```
|
||
|
|
TextDocument
|
||
|
|
├── metadata: Metadata
|
||
|
|
│ ├── id: str # Page URI (e.g., https://trustgraph.ai/doc/xxx/p1)
|
||
|
|
│ ├── user: str
|
||
|
|
│ ├── collection: str
|
||
|
|
│ └── metadata: list[Triple]
|
||
|
|
├── text: bytes # Page text content (if inline)
|
||
|
|
└── document_id: str # Librarian reference (e.g., "doc123/p1")
|
||
|
|
```
|
||
|
|
|
||
|
|
## Etapa 3: Divisor em Blocos
|
||
|
|
|
||
|
|
Divide o texto em blocos de tamanho configurado.
|
||
|
|
|
||
|
|
### Parâmetros (configuráveis no fluxo)
|
||
|
|
|
||
|
|
`chunk_size`: Tamanho do bloco alvo em caracteres (padrão: 2000)
|
||
|
|
`chunk_overlap`: Sobreposição entre blocos (padrão: 100)
|
||
|
|
|
||
|
|
### Processo
|
||
|
|
|
||
|
|
1. Buscar o conteúdo do texto (inline ou via bibliotecário)
|
||
|
|
2. Dividir usando o divisor de caracteres recursivo
|
||
|
|
3. Para cada bloco:
|
||
|
|
Salvar como documento filho no bibliotecário (`{parent_id}/c{index}`)
|
||
|
|
Emitir triplas de procedência (bloco derivado da página/documento)
|
||
|
|
Encaminhar para os processadores de extração
|
||
|
|
|
||
|
|
### Esquema: Bloco
|
||
|
|
|
||
|
|
```
|
||
|
|
Chunk
|
||
|
|
├── metadata: Metadata
|
||
|
|
│ ├── id: str # Chunk URI
|
||
|
|
│ ├── user: str
|
||
|
|
│ ├── collection: str
|
||
|
|
│ └── metadata: list[Triple]
|
||
|
|
├── chunk: bytes # Chunk text content
|
||
|
|
└── document_id: str # Librarian chunk ID (e.g., "doc123/p1/c3")
|
||
|
|
```
|
||
|
|
|
||
|
|
### Hierarquia de Identificação de Documentos
|
||
|
|
|
||
|
|
Documentos filhos codificam sua linhagem no ID:
|
||
|
|
Fonte: `doc123`
|
||
|
|
Página: `doc123/p5`
|
||
|
|
Trecho da página: `doc123/p5/c2`
|
||
|
|
Trecho de texto: `doc123/c2`
|
||
|
|
|
||
|
|
## Etapa 4: Extração de Conhecimento
|
||
|
|
|
||
|
|
Múltiplos padrões de extração disponíveis, selecionados pela configuração do fluxo.
|
||
|
|
|
||
|
|
### Padrão A: Basic GraphRAG
|
||
|
|
|
||
|
|
Dois processadores paralelos:
|
||
|
|
|
||
|
|
**kg-extract-definitions**
|
||
|
|
Entrada: Trecho
|
||
|
|
Saída: Triplas (definições de entidades), Contextos de Entidade
|
||
|
|
Extrai: rótulos de entidades, definições
|
||
|
|
|
||
|
|
**kg-extract-relationships**
|
||
|
|
Entrada: Trecho
|
||
|
|
Saída: Triplas (relacionamentos), Contextos de Entidade
|
||
|
|
Extrai: relações sujeito-predicado-objeto
|
||
|
|
|
||
|
|
### Padrão B: Orientado a Ontologia (kg-extract-ontology)
|
||
|
|
|
||
|
|
Entrada: Trecho
|
||
|
|
Saída: Triplas, Contextos de Entidade
|
||
|
|
Utiliza uma ontologia configurada para guiar a extração
|
||
|
|
|
||
|
|
### Padrão C: Baseado em Agente (kg-extract-agent)
|
||
|
|
|
||
|
|
Entrada: Trecho
|
||
|
|
Saída: Triplas, Contextos de Entidade
|
||
|
|
Utiliza um framework de agente para a extração
|
||
|
|
|
||
|
|
### Padrão D: Extração de Linhas (kg-extract-rows)
|
||
|
|
|
||
|
|
Entrada: Trecho
|
||
|
|
Saída: Linhas (dados estruturados, não triplas)
|
||
|
|
Utiliza uma definição de esquema para extrair registros estruturados
|
||
|
|
|
||
|
|
### Esquema: Triplas
|
||
|
|
|
||
|
|
```
|
||
|
|
Triples
|
||
|
|
├── metadata: Metadata
|
||
|
|
│ ├── id: str
|
||
|
|
│ ├── user: str
|
||
|
|
│ ├── collection: str
|
||
|
|
│ └── metadata: list[Triple] # (set to [] by extractors)
|
||
|
|
└── triples: list[Triple]
|
||
|
|
└── Triple
|
||
|
|
├── s: Term # Subject
|
||
|
|
├── p: Term # Predicate
|
||
|
|
├── o: Term # Object
|
||
|
|
└── g: str | None # Named graph
|
||
|
|
```
|
||
|
|
|
||
|
|
### Esquema: EntityContexts
|
||
|
|
|
||
|
|
```
|
||
|
|
EntityContexts
|
||
|
|
├── metadata: Metadata
|
||
|
|
└── entities: list[EntityContext]
|
||
|
|
└── EntityContext
|
||
|
|
├── entity: Term # Entity identifier (IRI)
|
||
|
|
├── context: str # Textual description for embedding
|
||
|
|
└── chunk_id: str # Source chunk ID (provenance)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Esquema: Linhas
|
||
|
|
|
||
|
|
```
|
||
|
|
Rows
|
||
|
|
├── metadata: Metadata
|
||
|
|
├── row_schema: RowSchema
|
||
|
|
│ ├── name: str
|
||
|
|
│ ├── description: str
|
||
|
|
│ └── fields: list[Field]
|
||
|
|
└── rows: list[dict[str, str]] # Extracted records
|
||
|
|
```
|
||
|
|
|
||
|
|
## Etapa 5: Geração de Embeddings
|
||
|
|
|
||
|
|
### Embeddings de Grafos
|
||
|
|
|
||
|
|
Converte contextos de entidades em embeddings vetoriais.
|
||
|
|
|
||
|
|
**Processo:**
|
||
|
|
1. Receber EntityContexts
|
||
|
|
2. Chamar o serviço de embeddings com o texto do contexto
|
||
|
|
3. Output GraphEmbeddings (mapeamento de entidade para vetor)
|
||
|
|
|
||
|
|
**Esquema: GraphEmbeddings**
|
||
|
|
|
||
|
|
```
|
||
|
|
GraphEmbeddings
|
||
|
|
├── metadata: Metadata
|
||
|
|
└── entities: list[EntityEmbeddings]
|
||
|
|
└── EntityEmbeddings
|
||
|
|
├── entity: Term # Entity identifier
|
||
|
|
├── vector: list[float] # Embedding vector
|
||
|
|
└── chunk_id: str # Source chunk (provenance)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Incorporações de Documentos
|
||
|
|
|
||
|
|
Converte texto em partes diretamente em incorporações vetoriais.
|
||
|
|
|
||
|
|
**Processo:**
|
||
|
|
1. Receber Parte (Chunk)
|
||
|
|
2. Chamar o serviço de incorporação com o texto da parte
|
||
|
|
3. Saída: Incorporações de Documento (DocumentEmbeddings)
|
||
|
|
|
||
|
|
**Esquema: Incorporações de Documento (DocumentEmbeddings)**
|
||
|
|
|
||
|
|
```
|
||
|
|
DocumentEmbeddings
|
||
|
|
├── metadata: Metadata
|
||
|
|
└── chunks: list[ChunkEmbeddings]
|
||
|
|
└── ChunkEmbeddings
|
||
|
|
├── chunk_id: str # Chunk identifier
|
||
|
|
└── vector: list[float] # Embedding vector
|
||
|
|
```
|
||
|
|
|
||
|
|
### Incorporações de Linhas
|
||
|
|
|
||
|
|
Converte campos de índice de linha em incorporações vetoriais.
|
||
|
|
|
||
|
|
**Processo:**
|
||
|
|
1. Receber Linhas
|
||
|
|
2. Incorporar campos de índice configurados
|
||
|
|
3. Saída para o armazenamento vetorial de linhas
|
||
|
|
|
||
|
|
## Fase 6: Armazenamento
|
||
|
|
|
||
|
|
### Armazenamento Triplo
|
||
|
|
|
||
|
|
Recebe: Triplas
|
||
|
|
Armazenamento: Cassandra (tabelas centradas em entidades)
|
||
|
|
Grafos nomeados separam o conhecimento central da procedência:
|
||
|
|
`""` (padrão): Fatos de conhecimento central
|
||
|
|
`urn:graph:source`: Procedência de extração
|
||
|
|
`urn:graph:retrieval`: Explicabilidade em tempo de consulta
|
||
|
|
|
||
|
|
### Armazenamento Vetorial (Incorporações de Grafos)
|
||
|
|
|
||
|
|
Recebe: Incorporações de Grafos
|
||
|
|
Armazenamento: Qdrant, Milvus ou Pinecone
|
||
|
|
Indexado por: IRI da entidade
|
||
|
|
Metadados: chunk_id para procedência
|
||
|
|
|
||
|
|
### Armazenamento Vetorial (Incorporações de Documentos)
|
||
|
|
|
||
|
|
Recebe: Incorporações de Documentos
|
||
|
|
Armazenamento: Qdrant, Milvus ou Pinecone
|
||
|
|
Indexado por: chunk_id
|
||
|
|
|
||
|
|
### Armazenamento de Linhas
|
||
|
|
|
||
|
|
Recebe: Linhas
|
||
|
|
Armazenamento: Cassandra
|
||
|
|
Estrutura de tabela orientada por esquema
|
||
|
|
|
||
|
|
### Armazenamento Vetorial de Linhas
|
||
|
|
|
||
|
|
Recebe: Incorporações de linhas
|
||
|
|
Armazenamento: Banco de dados vetorial
|
||
|
|
Indexado por: campos de índice de linha
|
||
|
|
|
||
|
|
## Análise de Campos de Metadados
|
||
|
|
|
||
|
|
### Campos Ativamente Utilizados
|
||
|
|
|
||
|
|
| Campo | Uso |
|
||
|
|
|-------|-------|
|
||
|
|
| `metadata.id` | Identificador de documento/fragmento, registro, procedência |
|
||
|
|
| `metadata.user` | Multilocação, roteamento de armazenamento |
|
||
|
|
| `metadata.collection` | Seleção de coleção de destino |
|
||
|
|
| `document_id` | Referência do bibliotecário, vinculação de procedência |
|
||
|
|
| `chunk_id` | Rastreamento de procedência através do pipeline |
|
||
|
|
|
||
|
|
<<<<<<< HEAD
|
||
|
|
### Campos Potencialmente Redundantes
|
||
|
|
|
||
|
|
| Campo | Status |
|
||
|
|
|-------|--------|
|
||
|
|
| `metadata.metadata` | Definido como `[]` por todos os extratores; metadados de nível de documento agora gerenciados pelo bibliotecário no momento do envio |
|
||
|
|
=======
|
||
|
|
### Campos Removidos
|
||
|
|
|
||
|
|
| Campo | Status |
|
||
|
|
|-------|--------|
|
||
|
|
| `metadata.metadata` | Removido da classe `Metadata`. Triplas de metadados de nível de documento agora são emitidas diretamente pelo bibliotecário para o armazenamento de triplas no momento do envio, e não são transmitidas através do pipeline de extração. |
|
||
|
|
>>>>>>> e3bcbf73 (The metadata field (list of triples) in the pipeline Metadata class)
|
||
|
|
|
||
|
|
### Padrão de Campos de Bytes
|
||
|
|
|
||
|
|
Todos os campos de conteúdo (`data`, `text`, `chunk`) são `bytes`, mas são imediatamente decodificados para strings UTF-8 por todos os processadores. Nenhum processador usa bytes brutos.
|
||
|
|
|
||
|
|
## Configuração do Fluxo
|
||
|
|
|
||
|
|
Os fluxos são definidos externamente e fornecidos ao bibliotecário através do serviço de configuração. Cada fluxo especifica:
|
||
|
|
|
||
|
|
Filas de entrada (`text-load`, `document-load`)
|
||
|
|
Cadeia de processadores
|
||
|
|
Parâmetros (tamanho do fragmento, método de extração, etc.)
|
||
|
|
|
||
|
|
Padrões de fluxo de exemplo:
|
||
|
|
`pdf-graphrag`: PDF → Decodificador → Fragmentador → Definições + Relacionamentos → Incorporações
|
||
|
|
`text-graphrag`: Texto → Fragmentador → Definições + Relacionamentos → Incorporações
|
||
|
|
`pdf-ontology`: PDF → Decodificador → Fragmentador → Extração de Ontologia → Incorporações
|
||
|
|
`text-rows`: Texto → Fragmentador → Extração de Linhas → Armazenamento de Linhas
|