RAG para documentos internos: contratos, atas e PDFs
A promessa do RAG para documentos internos é sedutora: faça uma pergunta em linguagem natural e o sistema encontra a resposta no meio de mil contratos, atas e manuais. A realidade é que documentos empresariais são os inputs mais problemáticos para um pipeline RAG. Tabelas quebradas, PDFs escaneados, cabeçalhos repetidos em todo chunk, dados pessoais sem controle. Este artigo é um guia honesto para fazer isso funcionar.
Tipos de documento mais comuns em PMEs — e seus desafios específicos
Cada tipo de documento traz um conjunto diferente de problemas na extração e indexação:
- Contratos (PDF): estrutura legal complexa com cláusulas numeradas, parágrafos longos, referências cruzadas ("conforme cláusula 5.2 acima"), datas e valores críticos. O chunking por tamanho fixo inevitavelmente separa uma cláusula de seu contexto numérico.
- Atas de reunião: mistura de decisões formais, discussões informais e ações. Frequentemente digitadas em Word e salvas como PDF sem metadados. O desafio é separar o que foi decidido do que foi apenas discutido.
- Manuais e procedimentos (SOPs): estrutura hierárquica (capítulo → seção → passo) que se perde com chunking ingênuo. Passo 3.2.1 sem o contexto de "3.2 — Procedimento de Segurança" não significa nada.
- Planilhas exportadas para PDF: tabelas que se tornam texto desestruturado na extração. Uma planilha de preços com 50 linhas vira um bloco de números sem contexto de coluna.
- E-mails e comunicações: encadeamentos longos, citações de mensagens anteriores duplicando conteúdo, assinaturas repetidas em todo chunk.
- Notas fiscais e documentos fiscais: alta densidade de dados estruturados (CNPJ, valores, NCM, datas) que embeddings tratam mal. BM25 é mais adequado para esses casos.
Desafios específicos de PDF: tabelas, cabeçalhos e footers
PDF é o formato mais problemático para extração de texto, e é exatamente o mais usado em contextos empresariais.
Tabelas em PDF
A maioria dos extratores de PDF (PyMuPDF, pdfplumber, pypdf) tenta reconstruir tabelas a partir de posições x/y de texto, o que frequentemente gera linhas embaralhadas ou colunas colapsadas. Uma tabela de preços com 3 colunas pode virar:
# O que está no PDF (visualmente correto):
Produto Qtd Mínima Preço Unit.
Parafuso A 100 R$ 0,45
Parafuso B 500 R$ 0,38
# O que o extrator produz (texto linearizado):
Produto Qtd Mínima Preço Unit. Parafuso A 100 R$ 0,45 Parafuso B 500 R$ 0,38
Solução: usar extratores especializados para tabelas (pdfplumber com detecção de bordas, Camelot, ou serviços como Azure Document Intelligence / AWS Textract) e converter tabelas para Markdown antes de indexar. Markdown de tabela preserva a estrutura de colunas e é compreensível para LLMs.
Cabeçalhos e rodapés repetidos
Em documentos longos, o cabeçalho ("CONTRATO DE PRESTAÇÃO DE SERVIÇOS — CONFIDENCIAL") e o rodapé ("Página X de Y — Empresa ABC LTDA — CNPJ 12.345.678/0001-90") aparecem em todos os chunks. Isso polui o embedding com ruído repetido e consome tokens desnecessários no contexto.
A solução é detectar e remover padrões de cabeçalho/rodapé antes do chunking, comparando as primeiras e últimas linhas de cada página e eliminando padrões que se repetem em mais de 80% das páginas.
Checklist de pré-processamento documental (15 itens)
Use este checklist antes de indexar qualquer lote de documentos. Um item não concluído pode comprometer todo o pipeline.
- Inventário e deduplicação: identificar e remover documentos duplicados ou versões antigas. Manter apenas a versão vigente de cada documento.
- Validação de formato: verificar se todos os arquivos são legíveis (não corrompidos). PDFs com senha bloqueiam a extração silenciosamente.
- Detecção de necessidade de OCR: verificar se o PDF tem texto extraível (heurística: extrair texto da página 1; se vazio ou < 50 chars, marcar para OCR).
- OCR para documentos escaneados: usar Tesseract (open-source) ou serviço cloud (Azure, AWS, Google Vision) com configuração de idioma pt-BR. Verificar qualidade da saída.
- Remoção de cabeçalhos e rodapés repetidos: detectar padrões repetidos entre páginas e removê-los antes do chunking.
- Extração e conversão de tabelas: identificar tabelas e convertê-las para formato Markdown estruturado, preservando relação coluna/valor.
- Normalização de texto: remover caracteres de controle, normalizar espaços em branco, converter encoding para UTF-8, tratar hifenização de final de linha.
- Extração de metadados: data de criação/modificação, autor (se disponível), título, número de páginas, tipo de documento (contrato, ata, manual, etc.).
- Classificação automática de tipo: usar regex ou classificador simples para categorizar documentos (contrato, ata, manual, NF, e-mail) e adicionar como metadado.
- Identificação de dados pessoais (LGPD): executar NER (Named Entity Recognition) para detectar CPF, CNPJ, nome, endereço, e-mail, telefone nos documentos.
- Anonimização ou classificação de acesso: para dados pessoais identificados: anonimizar (substituir por token interno) ou marcar com nível de acesso restrito e aplicar RBAC.
- Versionamento do corpus: registrar hash (SHA-256) de cada documento indexado para detectar alterações e reindexar apenas o que mudou.
- Teste de extração em amostra: extrair 10% dos documentos manualmente e verificar qualidade do texto antes de processar o lote completo.
- Definição de estratégia de chunking por tipo: contratos usam chunking por cláusula; manuais usam chunking hierárquico; e-mails usam chunking por mensagem individual. Não use estratégia única para tudo.
- Validação pós-ingestão: verificar contagem de chunks esperada vs. real; buscar termos-chave para confirmar que a indexação funcionou; checar que filtros de metadados retornam os documentos corretos.
Pipeline de ingestão: do arquivo ao chunk indexado
O pipeline de ingestão para documentos empresariais tem mais etapas que o exemplo típico de tutorial RAG:
# Fluxo simplificado de ingestão
para cada documento em fila_de_ingestão:
1. VALIDAÇÃO
- verificar integridade do arquivo
- checar se já está indexado (por hash)
- identificar formato (PDF, DOCX, XLSX, etc.)
2. EXTRAÇÃO
- se PDF sem texto → OCR (Tesseract / Azure)
- se PDF com texto → PyMuPDF / pdfplumber
- se DOCX → python-docx
- se XLSX → openpyxl (tratar como tabelas)
3. PRÉ-PROCESSAMENTO
- remover cabeçalhos/rodapés
- converter tabelas para Markdown
- normalizar texto e encoding
- executar NER para dados pessoais
4. CLASSIFICAÇÃO E METADADOS
- classificar tipo de documento
- extrair metadados (data, autor, título)
- aplicar regras de anonimização/RBAC
5. CHUNKING (estratégia por tipo)
- contratos: por cláusula + contexto pai
- manuais: hierárquico (seção → subseção)
- e-mails: por mensagem individual
- documentos genéricos: semântico
6. EMBEDDING E INDEXAÇÃO
- gerar embeddings (OpenAI / BGE-M3)
- indexar no vector store com metadados
- indexar no BM25 para busca híbrida
- registrar hash e timestamp no log
LGPD e dados pessoais em documentos empresariais
Este é o ponto onde muitos projetos RAG para documentos internos tropeçam sem saber. Documentos empresariais estão cheios de dados pessoais: contratos têm CPF e endereço das partes, atas têm nome e cargo de participantes, e-mails têm dados de clientes.
Quando esses documentos são indexados e o LLM os usa para responder perguntas, você está realizando tratamento de dados pessoais sob a LGPD — mesmo que os documentos já existissem antes do sistema RAG.
As principais medidas a implementar:
- Mapeamento de dados pessoais no corpus: antes de indexar, identifique quais documentos contêm dados pessoais e de que tipo (sensíveis ou não).
- Minimização: indexe apenas o necessário. Um contrato pode ser indexado sem o CPF das partes se o sistema não precisa responder "qual o CPF do fornecedor X?"
- Controle de acesso granular: documentos com dados pessoais sensíveis (saúde, financeiro) devem ter RBAC restrito.
- Direito de exclusão: se um titular de dados solicitar exclusão, você precisa conseguir remover todos os chunks que contêm seus dados. O hash de documento por item facilita isso.
- Registro de atividades de tratamento (ROPA): documente que o sistema RAG trata dados pessoais, com finalidade, base legal e medidas de segurança.
Para detalhes sobre LGPD em aplicações LLM, veja LGPD e aplicações LLM: o que sua empresa precisa saber.
Quanto custa na prática: estimativas para PMEs
Para um corpus típico de PME (2.000–10.000 documentos):
- Extração e OCR: Azure Document Intelligence custa ~US$ 0,001/página. 10.000 documentos × 5 páginas médias = US$ 50 de OCR. Tesseract é gratuito mas requer servidor.
- Embedding: text-embedding-3-small da OpenAI custa US$ 0,02/M tokens. Um corpus de 10.000 documentos de 5 páginas (~250 tokens/página) = ~12,5M tokens = US$ 0,25 de embedding. Praticamente gratuito.
- Vector store: Qdrant Cloud para 500K chunks custa ~US$ 30–80/mês. Alternativa self-hosted em VM: ~R$ 150/mês.
- Tempo de engenharia: pré-processamento bem feito para 10.000 documentos leva 3–6 semanas de engenharia, dependendo da variedade de formatos e qualidade dos originais. Este é o maior custo.
Para a estratégia de chunking mais adequada a cada tipo de documento, veja estratégias de chunking: semântico, hierárquico e por estrutura.