← Voltar a RAG — Arquitetura de Ingestion e Retrieval

🔬 Técnicas Avançadas de Ingestão

RAG — Arquitetura de Ingestion e Retrieval

Apresentação

12. Técnicas Avançadas de Ingestion

Este documento descreve técnicas de ingestion para RAG que complementam a arquitetura base. Muitas estão planeadas ou em teoria; algumas têm implementação parcial.


1. Chunking Avançado

1.1 Parent-Child Chunking

Problema: Chunks pequenos melhoram precisão de retrieval mas perdem contexto; chunks grandes têm contexto mas reduzem precisão.

Solução: Desacoplar unidade de pesquisa da unidade de retorno.

UnidadeTamanho típicoUso
Child256–400 tokensIndexar e pesquisar (embedding)
Parent1024–2048 tokensDevolver ao LLM (contexto rico)

Fluxo:

Documento → Parent splitter (2000 tokens) → Parents
    → Child splitter (400 tokens) por parent → Children
    → Embed children, indexar em vector store
    → Guardar mapeamento child_id → parent_content

Retrieval: Pesquisar por children → obter parent correspondente → passar parent ao LLM.

Implementação: LangChain ParentDocumentRetriever; Chroma + docstore com links.

Quando usar: Documentos longos, técnicos, legais, onde contexto é crucial.


1.2 Token-based vs Character-based Chunking

AspetoCharacter-basedToken-based
UnidadeCaracteres (ex.: 600)Tokens (ex.: 512)
VantagemSimples, sem tokenizerAlinha com limites do modelo
Limite embeddingPode excederRespeita 512/8192 do modelo
CustoImprevisível em tokensPrevisível

Recomendação: Para embeddings com limite (ex.: 512 tokens), usar token-based ou converter: ~4 chars/token para inglês, ~2–3 para português.

Fórmula aproximada: chunk_size_chars ≈ chunk_size_tokens * 3


1.3 Document-Structure-Aware Chunking

Para Markdown, HTML, LaTeX:

  • Quebrar por headers (##, <h2>) — cada secção = chunk ou parent
  • Preservar hierarquia###### como árvore
  • Tabelas — tratar como unidade (não cortar a meio)
  • Listas — agrupar items relacionados

Exemplo Markdown:

# Doc
## Secção 1
Parágrafo...
## Secção 2
Parágrafo...

→ Chunks por secção, com header_path no metadata.


1.4 Semantic Chunking

Usar embedding para detetar fronteiras semânticas:

  1. Embeddar cada parágrafo/frase
  2. Comparar similaridade com vizinhos
  3. Quebrar onde similaridade cai (mudança de tópico)

Custo: Embedding de todo o documento na ingestion. Benefício: Chunks mais coerentes. Recomendado para docs longos e densos.


2. Extração de Conteúdo

2.1 Extração de Tabelas (PDF/HTML)

PDFs e HTML podem ter tabelas que se perdem em extração de texto plana.

Técnicas:

  • PyMuPDF / pdfplumber: extract_tables() — devolve células
  • Camelot, Tabula: PDF → tabelas estruturadas
  • HTML: Parsing de <table>, <tr>, <td>

Saída: Converter para tabela Markdown ou StructuredRecord para SQL/graph.


2.2 OCR para Documentos Digitalizados

PDFs escaneados são imagens — exigem OCR.

Ferramentas:

  • Tesseract: Open source, multilingue
  • Azure Document Intelligence, Google Cloud Vision: APIs managed
  • pytesseract: Wrapper Python

Fluxo: PDF page → imagem → OCR → texto + bounding boxes. Opcional: reflow por região para preservar estrutura.

Pós-processamento: Corrigir artefactos OCR (caracteres trocados, espaços).


2.3 Metadata Extraction

Frontmatter (YAML no início de MD):

---
title: Security Policy
version: 2
tags: [security, policy]
---

Headers: Título do doc, secções para header_path em metadata.

Datas: Extrair created_at, modified_at de metadados do ficheiro ou do conteúdo.

Saída: Incluir em DocumentRecord.metadata para filtros no retrieval.


3. Normalização de Texto

3.1 Encoding

  • Normalizar para UTF-8
  • Detetar e converter Latin-1, Windows-1252
  • Substituir caracteres inválidos

3.2 Artefactos OCR

  • Corrigir 0O, 1l em contextos numéricos
  • Unificar hífens (-, , )
  • Remover múltiplos espaços e quebras de linha inconsistentes

3.3 Normalização Unicode

  • NFD/NFKC para comparação
  • Remover caracteres de controlo

4. Acquisition — Fontes de Dados

4.1 Conectores Comuns

FonteConectorObservações
S3boto3, s3fsEventos, polling, sync
SharePointOffice 365 API, shareplumPermissões, delta sync
Google Drivedrive APIOAuth, webhooks
ConfluenceREST APISpaces, pages, attachments
NotionNotion APIBlocks, databases
SlackSlack APIHistórico de canais
APIs RESTrequests, httpxPaginação, rate limit

4.2 Delta Sync

  • Watermark: last_modified > watermark (SQL, APIs com updated_since)
  • Eventos: S3 Event Notifications, webhooks
  • Checksum: Evitar reprocessar ficheiros inalterados

5. Deduplicação

5.1 Documentos

  • Hash de conteúdo: Detetar duplicatas exatas
  • Similitude: Embedding + threshold para near-duplicates (opcional)
  • URL/path normalizado: Evitar ingest duplicado da mesma fonte

5.2 Chunks

  • Exact match: Não indexar chunks idênticos
  • Semantic dedupe: Chunks com embedding muito similar (cuidado com over-dedupe)

6. Hierarchical Indexing

Estrutura Doc → Secções → Chunks:

DocumentRecord (doc_id, title)
    └── SectionRecord (section_id, header_path, parent_doc_id)
        └── ChunkRecord (chunk_id, content, parent_section_id)

Uso:

  • Retrieval por chunk → expandir para secção ou doc conforme necessidade
  • Filtros por header_path (ex.: só "## Apêndice B")
  • Navegação estruturada

7. Modelos de Embedding — Alternativas

ModeloDimensãoIdiomasNotas
all-MiniLM-L6-v2384ENRápido, atual
multilingual-e5-base768100+PT/EN
BGE-large-en1024ENQualidade
E5-large-v21024ENContrastive
GTE-base768100+General Text Embedding
Cohere embed-v31024MultilingueAPI

Escolha: Latência vs qualidade, local vs API, dimensão do vector store.


8. Matriz de Técnicas por Estado

TécnicaTeoriaImplementação
Parent-Child chunking
Token-based chunking❌ (só chars)
Structure-aware chunkingParcial (break at \n)
Semantic chunking
Table extraction
OCR
Metadata extractionParcial (doc_id)
Normalização texto
S3/SharePoint connectors
Document deduplication
Hierarchical indexing

Zona de prática

Sem perguntas. Clica em Editar para adicionar.