Engenharia
· 9 min de leitura

Por que construir um motor de detecção próprio

Por Amine Gaaliche · rascunho escrito com Claude, revisto e editado à mão

Construímos nosso próprio motor porque uma biblioteca de detecção responde a outra pergunta. Ela informa em que posições do texto um padrão apareceu. Quem usa o promptShield quer saber o que esconder na página que está na tela. Quase todo o trabalho entre uma coisa e outra consiste em decidir o que não marcar.

O que uma biblioteca devolve

O Presidio faz bem o que se propõe a fazer. Ele recebe um texto, aplica reconhecedores e devolve ocorrências com tipo, pontuação e posições de início e fim. Para limpar colunas de um banco de dados antes de um relatório, é isso que se quer. Várias partes do nosso motor começaram pela leitura do código de bibliotecas assim.

O problema aparece quando essa lista vira um produto que alguém abre de manhã com um PDF de 40 páginas. A pessoa não pergunta em que caracteres um padrão foi encontrado. Ela quer saber o que esconder e se pode mandar o arquivo para fora do escritório.

Decidir o que não marcar

Imagine um contrato social registrado na Junta Comercial e escaneado às pressas. A primeira página traz três sócios com nome, CPF, endereço e cargo, como “Diretor Presidente”. Um estagiário sabe em dez segundos o que precisa sumir dali.

Um modelo treinado em notícias lê “Diretor Presidente” logo depois de um nome próprio. Muitas vezes, ele estende a marcação do nome até o cargo ou marca o cargo sozinho. Em cada página, isso gera marcações em palavras que não identificam ninguém.

Depois da quinta marcação inútil, o revisor para de ler com atenção, e na sexta passa o CPF que importava. Por isso temos uma lista de 195 cargos e funções, em vários idiomas, que barra um “CEO” ou um “Directeur” isolado. Ela foi montada caso a caso e muda bastante a revisão.

Camadas que precisam ser fundidas

A camada de padrões acha CPF, CNPJ, CEP e dados bancários com mais confiança que qualquer modelo. Esses valores têm forma: o CPF tem 11 dígitos, o CNPJ tem 14 e o CEP tem 8. O modelo de entidades cuida de nomes, empresas e endereços. A camada de LLM, quando ligada, fica com os casos ambíguos.

As camadas se sobrepõem e se contradizem, e os resultados são fundidos sem marcar duas vezes a mesma entidade. Depois, um nome encontrado com segurança na página 1 é procurado nas outras. Assim, a página 4, onde o modelo leu mal a frase, não sai com o nome à vista. Só no fim entra o filtro de ruído.

Uma página não é só texto

O usuário não oculta “os caracteres 312 a 327”. Ele quer um retângulo preto sobre o nome, na página certa, mesmo quando o nome quebra de linha. Para isso é preciso saber onde cada palavra está desenhada, e uma biblioteca de texto não sabe.

Um escaneamento é uma imagem, sem texto, e o carimbo do cartório faz parte dela. O pipeline renderiza a página a 300 dpi e roda o Tesseract com o idioma do documento mais o inglês. Ele localiza os dados pessoais como regiões da imagem, cobre esses pixels e reconstrói por baixo uma camada de texto pesquisável.

Há um limite: são oito pacotes de idioma (en, fr, de, es, it, nl, pt, pl). Um escaneamento lido com o pacote errado sai mal lido, sem nenhum erro na tela. Por isso a escolha do idioma pesa mais num escaneamento do que num PDF nativo.

Ocultar significa remover o conteúdo

Um retângulo preto sobre o texto engana os olhos, mas qualquer leitor de PDF ainda copia o texto. Ocultar de verdade é remover o conteúdo. Um PDF também guarda texto fora da página: o texto alternativo de PDFs com tags (ActualText e Alt), os metadados XMP, os dicionários PieceInfo, os destinos internos e a aparência salva dos campos de formulário.

Na exportação, o promptShield troca o dado também nesses lugares: pelo código, se você codificou, ou por um marcador neutro, se ocultou. A miniatura gerada antes da ocultação é descartada, porque não dá para substituir texto dentro de uma imagem. Esses resíduos costumam aparecer só quando um cliente abre o arquivo num leitor diferente.

Os números da comparação e quando foram medidos

Publicamos uma comparação direta entre o promptShield e o Presidio sobre o mesmo conjunto de documentos. Na execução publicada, o Presidio na instalação padrão marcou 666 trechos, e o promptShield, 252. A comparação não foi repetida com a versão atual do nosso motor, que mudou desde então.

Leia esses totais como uma medição datada, e não como um placar atualizado. Marcar mais trechos também não é uma virtude em si: parte da diferença pode ser ruído que uma ferramenta filtra e a outra não.

Onde nós mesmos erramos

O erro mais caro que já publicamos sobre nosso motor não veio de biblioteca nenhuma. Em sete idiomas, afirmamos que um valor recebe um código idêntico em toda a biblioteca de documentos. Isso é falso: o código é definido por pasta, e pastas diferentes não se enxergam.

Só um código fixado à mão pelo usuário vale em qualquer pasta. A regra faz sentido: cada pasta pode corresponder a um processo. A frase errada ficou no ar até alguém compará-la com o código-fonte.

O aplicativo gratuito no navegador gera códigos pelo mesmo método do desktop, com uma chave própria. Por isso, o código de uma demonstração tem o formato real do produto. Já o selo “100% offline” vale só para o desktop: a versão no navegador envia um sinal anônimo de abertura.

Nas duas versões, o documento não sai da sua máquina. O modo isolado do desktop, sem verificação de licença e sem envio de relatórios de falha, é exclusivo do plano Pro.

O que isso muda para quem responde pela LGPD

Se seu pipeline manda o texto para uma API de terceiros, esse terceiro atua como operador (art. 5º, VII). O tratamento precisa de uma base legal do art. 7º, e o art. 6º, X cobra do controlador a prova de que as medidas funcionam.

Para advogados, o art. 34, VII da Lei nº 8.906/1994 e o art. 154 do Código Penal tratam do sigilo. Nenhum contrato com fornecedor transfere esse dever. Explicamos de onde ele vem. Avaliar seu caso concreto cabe a você e a quem assessora você.

Perguntas de quem está decidindo

Por que não usar uma biblioteca existente?

Para muita gente, essa é a escolha certa. Se seus dados são texto em colunas e o resultado vai para outro sistema, o Presidio resolve bem e tem uma comunidade por trás. Nós entregamos uma página que alguém revisa e envia, com a ocultação no lugar certo e sem resíduos no arquivo.

O que falta a uma biblioteca?

Tudo o que vem depois das posições de caractere: geometria, OCR para páginas que são imagem, fusão de camadas e propagação entre páginas. Falta também filtrar o ruído e exportar sem deixar o dado em metadados, formulários e miniaturas. É outro escopo, e a biblioteca cumpre bem o dela.

A diferença está no modelo ou na filtragem?

Pela nossa experiência, sobretudo na filtragem, embora ter um modelo próprio nos tenha permitido encolhê-lo para rodar no navegador. No dia a dia, o revisor sente o ruído: cargos marcados como pessoa, números de página confundidos com números de documento, marcações duplicadas. Nenhuma camada detecta todos os identificadores, e por isso o produto pede revisão antes do download.

Quanto trabalho dá montar isso a partir de uma biblioteca?

Um protótipo que funciona num PDF nativo cabe num fim de semana. Escaneamentos em sete idiomas, ocultação que vale em qualquer leitor de PDF e uma filtragem que poupa o revisor levam muito mais tempo. A maior parte desse tempo vai para casos que nenhum conjunto de testes inicial contém.

A pergunta que o usuário fez

O estagiário acerta em dez segundos porque responde à pergunta de quem tem a página na frente. Uma biblioteca acerta outra coisa, com rigor, e isso tem valor. Nosso trabalho foi sobretudo aprender a não marcar o que não precisa ser marcado. Ainda erramos, e por isso pedimos revisão antes do download.

Foi útil? Diga-nos.

Partilhar