Show HN: Parser de PDF open source baseado em regras para RAG
(github.com/nlmatics)- nlm-ingestor é o código de serviço ao qual a API do llmsherpa se conecta, oferecendo parsers de documentos para PDF, HTML, Text, DOCX, PPTX e outros formatos voltados para RAG
- O parser de PDF usa dados de coordenadas de texto, gráficos e fontes obtidos do Tika modificado pela nlmatics, e pode aplicar OCR automaticamente com a opção
apply_ocrquando houver páginas digitalizadas - Os recursos de processamento de PDF incluem níveis de seção e subseção, mesclagem de parágrafos, ligação entre seções e parágrafos, tabelas, listas aninhadas, combinação de conteúdo entre páginas, remoção de cabeçalhos e rodapés repetidos, remoção de marca d’água e bounding boxes de OCR
- Em comparação com parsers visuais baseados em modelo, o parser baseado em regras é descrito como 100 vezes mais rápido por não precisar gerar imagens das páginas do PDF, sendo considerado mais prático para PDFs com camada de texto e documentos com centenas de páginas
- O servidor de desenvolvimento pode ser iniciado com Docker ou diretamente, e para produção é recomendada uma configuração executada atrás de um gateway de segurança, como nginx ou um gateway de nuvem
Parsers de documentos oferecidos pelo nlm-ingestor
- nlm-ingestor é um repositório de código de serviço ao qual a API do llmsherpa pode se conectar
- Ele oferece parsers personalizados para vários formatos de arquivo voltados para RAG (retrieval augmented generation)
-
PDF
-
HTML
-
Text
- DOCX, PPTX e outros formatos suportados pelo Apache Tika
-
Como o parser de PDF funciona e quais recursos oferece
- O parser de PDF é baseado em regras e usa dados de coordenadas de texto, gráficos e fontes obtidos do nlm-tika, uma versão modificada pela nlmatics
- Ele funciona com base na camada de texto do PDF e pode aplicar OCR automaticamente quando houver páginas digitalizadas no PDF por meio da opção
apply_ocr - O recurso de OCR é baseado internamente na versão modificada do Tika pela nlmatics, que usa tesseract
- Há um notebook para testar diretamente o parser de PDF: pdf_visual_ingestor_step_by_step
- Os recursos do parser de PDF incluem:
- identificação de seções, subseções e seus níveis
- combinação de várias linhas para formar parágrafos
- criação de ligações entre seções e parágrafos
- identificação de tabelas e das seções em que elas aparecem
- tratamento de listas e listas aninhadas
- combinação de conteúdo que atravessa páginas
- remoção de cabeçalhos e rodapés repetidos
- remoção de marca d’água
- fornecimento de bounding boxes para resultados de OCR
Processamento de documentos HTML, Text e Office
- O parser de HTML gera blocos com reconhecimento de layout para criar chunks de melhor qualidade e aumentar o desempenho de RAG
- O parser de Text analisa apenas o texto, sem informações visuais, de fonte ou bounding boxes, para inferir listas, tabelas, cabeçalhos e outros elementos
- DOCX, PPTX e outros formatos suportados pelo Apache Tika são processados usando a saída HTML do Tika e depois enviados ao parser de HTML
Execução e uso da API
- O processo para executar diretamente consiste em instalar Java, iniciar o servidor Tika, instalar o
nlm-ingestore executar o ingestor- Iniciar o servidor Tika:
java -jar <path_to_nlm_ingestor>/jars/tika-server-standard-nlm-modified-2.9.2_v2.jar - Instalação:
pip install nlm-ingestor - Execução:
python -m nlm_ingestor.ingestion_daemon
- Iniciar o servidor Tika:
- Há uma imagem Docker disponível no GitHub Container Registry público
- Baixar a imagem:
docker pull ghcr.io/nlmatics/nlm-ingestor:latest - Exemplo de execução:
docker run -p 5010:5001 ghcr.io/nlmatics/nlm-ingestor:latest-<version>
- Baixar a imagem:
- Depois que o servidor estiver em execução, é possível receber chunks com a biblioteca da API do llmsherpa e usá-los em projetos com LLM
- Um exemplo de
llmsherpa_urléhttp://localhost:5010/api/parseDocument?renderFormat=all- Aplicar OCR:
&applyOcr=yes - Usar o novo parser de indentação, que emprega um algoritmo diferente para atribuir níveis de cabeçalho:
&useNewIndentParser=yes
- Aplicar OCR:
- Pode ser usado como servidor de desenvolvimento, mas em ambiente de produção é recomendada uma configuração atrás de um gateway de segurança, como nginx ou um gateway de nuvem
- Há código de exemplo para testar o servidor com o parser do llmsherpa no notebook test_llmsherpa_api
Por que escolher um parser baseado em regras
- A equipe da nlmatics afirma ter avaliado várias opções ao longo de 4 anos, incluindo um parser visual baseado em YOLO desenvolvido por Tom Liu e Yi Zhang, antes de escolher um parser baseado em regras
- O parser baseado em regras é significativamente mais rápido do que qualquer parser visual, e a descrição do repositório o define como 100 vezes mais rápido
- Parsers visuais precisam gerar imagens de todas as páginas, mesmo em PDFs que já têm camada de texto
- Parsers visuais podem ser uma opção melhor para PDFs OCR sem camada de texto ou PDFs pequenos compostos por dados de formulários
- Para PDFs grandes com camada de texto e centenas de páginas, o parser baseado em regras é visto como mais prático
- Se o recurso de OCR do PDF não for usado, não há necessidade de hardware especial
- A descrição do repositório afirma que ele pode rodar até em hardware do início dos anos 2000
- Todos os parsers, inclusive os visuais, podem produzir erros, e a equipe diz não ter ficado satisfeita com a forma de corrigir erros em parsers baseados em modelo
- Adicionar mais exemplos ao conjunto de treinamento pode reduzir a precisão de aprendizados anteriores e tornar incerto um código que antes funcionava
- Corrigir problemas de parsers baseados em modelo com ideias baseadas em regras acaba levando novamente à escrita de muitas regras
Tika modificado pela nlmatics
- O Tika modificado pela nlmatics está no branch 2.4.1-nlm
- Para conveniência, um arquivo jar compilado está incluído na pasta
jars/do repositório - Alguns PDFs podem causar erros no servidor Java; nesse caso, pode ser necessário corrigir esse código e recompilar o arquivo jar
- Os arquivos modificados adicionam fonte e coordenadas a cada elemento de texto do PDF e removem marcas d’água
PDF2XHTML.javaAbstractPDF2XHTML.java
- A alteração em
GraphicsStreamProcessor.javaserve para adicionar linhas e retângulos que podem ajudar na detecção de tabelas - O impacto das mudanças pode ser visto no início do notebook pdf_visual_ingestor_step_by_step
- Ideias para trabalhos futuros incluem:
- escrever um wrapper próprio sobre o pdfbox para remover a dependência das mudanças no Tika
- atualizar para uma versão mais recente do Tika
- reorganizar o formato HTML retornado para ser mais compatível com CSS
1 comentários
Comentários do Hacker News
Se você trabalha com artigos científicos, GROBID também vale ser adicionado: https://github.com/kermitt2/grobid
Uso junto com o paperetl(https://github.com/neuml/paperetl)
Ótimo projeto. Para parsing de documentos, usei Tika por muito tempo por causa da maturidade e da ampla variedade de formatos suportados, e a saída XHTML ajuda no chunking de documentos para RAG
Há exemplos em https://neuml.hashnode.dev/build-rag-pipelines-with-txtai e https://neuml.hashnode.dev/extract-text-from-documents
Para referência, sou o principal autor do txtai(https://github.com/neuml/txtai)
O pdfminer.six(usado pelo unstructured) me decepcionou porque a detecção de layout é bem básica e falhou ao fazer parsing de texto em múltiplas colunas, enquanto o MuPDF lidou com isso perfeitamente
No momento uso uma combinação de MuPDF + AWS Textract(principalmente para tabelas), mas gostaria de saber o que outras pessoas estão usando
Parece que pode ser bastante útil. Na empresa onde trabalho, temos uma ferramenta de comparação de PDFs chamada “PDFC”, que lê PDFs e compara diferenças semânticas: https://www.inetsoftware.de/products/pdf-content-comparer
Como o formato PDF é muito complexo, o parsing pode dar bastante dor de cabeça. Já oferecemos suporte à maioria desses recursos, mas sempre há muitos casos de borda, então abordagens adicionais podem ajudar
O fallback com Tesseract OCR parece bom
Hoje há muitos file loaders para RAG, como langchain, LLMindex, unstructured etc., e fico curioso se há algum motivo para preferir este. Por exemplo, se existem evidências como pontuações melhores em benchmarks
Dito isso, já usei essas ferramentas de RAG para parsing de PDF e a qualidade da saída era bem baixa. Como o LLM contorna o problema até certo ponto, funciona mais ou menos para RAG, mas, se você quer respostas de qualidade mais alta com referências corretas, acho melhor usar diretamente um parser baseado em regras. Foi o que acabei fazendo, embora baseado em MuPDF, não em Tika
Talvez os autores desta ferramenta tenham pensado de forma parecida
Era suficiente para rodar um protótipo de RAG, mas não para construir algo confiável. Este projeto parece uma implementação muito mais testada em produção
Excelente trabalho e muito interessante. Mas, ao entrar no GitHub, aparece “This organization has no public members”, não dá para saber quem vocês são, e também não dá para saber o que mais pode estar incluído aqui sem estar público
No geral, acho que é preciso um meio-termo entre “um grupo oculto sem nome postou isso em um site de segurança da $CORP” e as formas tradicionais de apresentação e construção de confiança, para que se possa construir identidade e confiança ao longo do tempo
Para obter chunks ideais em projetos LLM/RAG, você pode usar este servidor junto com o llmsherpa LayoutPDFReader: https://github.com/nlmatics/llmsherpa
Veja os exemplos e notebooks no repositório
Fico curioso se há pares de entrada e saída de exemplo em algum lugar
Um exemplo com notebook está aqui: https://github.com/nlmatics/llmsherpa
Outro notebook de exemplo no repositório está aqui: https://github.com/nlmatics/nlm-ingestor/blob/main/notebooks...
Fiz parsing de algumas centenas de PDFs com isto e os resultados foram bem bons. Se tivesse sido desenvolvido em Julia, acho que teria sido pelo menos 10 vezes mais rápido
Fico curioso sobre como isto difere do Azure Document Intelligence, ou se na prática é a mesma coisa
Usando este servidor junto com a biblioteca llmsherpa(https://github.com/nlmatics/llmsherpa), você consegue chunks compatíveis com layout para projetos LLM/RAG
Esta biblioteca e ferramentas como fitz/pymupdf extraem texto diretamente do PDF e permitem aplicar regras de parsing e estruturação. A maioria dos PDFs modernos permite extrair texto sem OCR
Obviamente é muito mais barato, mas não escala bem para layouts dinâmicos em geral, então normalmente é usado quando dá para configurar para uma estrutura padrão. Ainda assim, vi que a extração de texto baseada em regras funciona de forma bastante dinâmica para coisas como artigos científicos
Ainda assim, me preocupa se o Tesseract OCR pode ser uma limitação. Já vi ele cometer erros demais
Fico curioso se há exemplos. Não parece haver nenhum arquivo PDF no repositório
Este projeto nlm-ingestor fornece o backend que funciona com o llmsherpa. A biblioteca llmsherpa é muito conveniente para extrair bons chunks para projetos LLM/RAG