🔬 Técnicas Avançadas de Ingestão
RAG — Arquitetura de Ingestion e RetrievalApresentaçã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.
| Unidade | Tamanho típico | Uso |
|---|---|---|
| Child | 256–400 tokens | Indexar e pesquisar (embedding) |
| Parent | 1024–2048 tokens | Devolver 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
| Aspeto | Character-based | Token-based |
|---|---|---|
| Unidade | Caracteres (ex.: 600) | Tokens (ex.: 512) |
| Vantagem | Simples, sem tokenizer | Alinha com limites do modelo |
| Limite embedding | Pode exceder | Respeita 512/8192 do modelo |
| Custo | Imprevisível em tokens | Previsí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:
- Embeddar cada parágrafo/frase
- Comparar similaridade com vizinhos
- 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
0↔O,1↔lem 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
| Fonte | Conector | Observações |
|---|---|---|
| S3 | boto3, s3fs | Eventos, polling, sync |
| SharePoint | Office 365 API, shareplum | Permissões, delta sync |
| Google Drive | drive API | OAuth, webhooks |
| Confluence | REST API | Spaces, pages, attachments |
| Notion | Notion API | Blocks, databases |
| Slack | Slack API | Histórico de canais |
| APIs REST | requests, httpx | Paginação, rate limit |
4.2 Delta Sync
- Watermark:
last_modified > watermark(SQL, APIs comupdated_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
| Modelo | Dimensão | Idiomas | Notas |
|---|---|---|---|
| all-MiniLM-L6-v2 | 384 | EN | Rápido, atual |
| multilingual-e5-base | 768 | 100+ | PT/EN |
| BGE-large-en | 1024 | EN | Qualidade |
| E5-large-v2 | 1024 | EN | Contrastive |
| GTE-base | 768 | 100+ | General Text Embedding |
| Cohere embed-v3 | 1024 | Multilingue | API |
Escolha: Latência vs qualidade, local vs API, dimensão do vector store.
8. Matriz de Técnicas por Estado
| Técnica | Teoria | Implementação |
|---|---|---|
| Parent-Child chunking | ✅ | ❌ |
| Token-based chunking | ✅ | ❌ (só chars) |
| Structure-aware chunking | ✅ | Parcial (break at \n) |
| Semantic chunking | ✅ | ❌ |
| Table extraction | ✅ | ❌ |
| OCR | ✅ | ❌ |
| Metadata extraction | ✅ | Parcial (doc_id) |
| Normalização texto | ✅ | ❌ |
| S3/SharePoint connectors | ✅ | ❌ |
| Document deduplication | ✅ | ❌ |
| Hierarchical indexing | ✅ | ❌ |
Zona de prática
Sem perguntas. Clica em Editar para adicionar.