Show HN: RAG için açık kaynaklı kural tabanlı PDF ayrıştırıcı
(github.com/nlmatics)- nlm-ingestor, llmsherpa API'nin bağlanarak kullandığı servis kodudur; RAG'ye yönelik PDF, HTML, Text, DOCX, PPTX gibi belge ayrıştırıcıları sunar
- PDF ayrıştırıcı, nlmatics'in değiştirilmiş Tika sürümünden elde edilen metin koordinatları, grafik ve font verilerini kullanır; taranmış sayfalar varsa
apply_ocrseçeneğiyle OCR otomatik olarak uygulanabilir - PDF işleme özellikleri arasında bölüm ve alt bölüm seviyeleri, paragraf birleştirme, bölüm-paragraf bağlantısı, tablolar, iç içe listeler, sayfalar arası içerik birleştirme, tekrarlanan üstbilgi ve altbilgilerin kaldırılması, filigran kaldırma ve OCR sınırlayıcı kutuları yer alır
- Model tabanlı görsel ayrıştırıcılarla karşılaştırıldığında, kural tabanlı ayrıştırıcının PDF sayfa görüntüleri oluşturması gerekmediği için 100 kat daha hızlı olduğu belirtiliyor; OCR olmayan metin katmanlı PDF'lerde ve yüzlerce sayfalık belgelerde daha pratik olduğu düşünülüyor
- Geliştirme sunucusu Docker ile veya doğrudan çalıştırılarak ayağa kaldırılabilir; üretim ortamında ise nginx ya da bulut ağ geçidi gibi bir güvenli ağ geçidinin arkasında çalıştırılması önerilir
nlm-ingestor'ın sunduğu belge ayrıştırıcıları
- nlm-ingestor, llmsherpa API'sinin bağlanabileceği bir servis kodu deposudur
- RAG'ye (retrieval augmented generation) yönelik özel ayrıştırıcıları birden fazla dosya biçimi için sunar
-
PDF
-
HTML
-
Text
- DOCX, PPTX ve Apache Tika'nın desteklediği diğer biçimler
-
PDF ayrıştırıcının çalışma biçimi ve özellikleri
- PDF ayrıştırıcı kural tabanlıdır ve nlmatics'in değiştirilmiş nlm-tika sürümünden elde edilen metin koordinatları, grafikler ve font verilerini kullanır
- PDF metin katmanına dayanarak çalışır;
apply_ocrseçeneğiyle PDF'de taranmış sayfalar varsa OCR otomatik olarak uygulanabilir - OCR özelliği, dahili olarak tesseract kullanan nlmatics'in değiştirilmiş Tika sürümüne dayanır
- PDF ayrıştırıcıyı doğrudan denemek için pdf_visual_ingestor_step_by_step adlı notebook sunulur
- PDF ayrıştırıcının özellikleri şunlardır
- Bölümleri, alt bölümleri ve her bir seviyeyi belirleme
- Birden çok satırı birleştirerek paragraf oluşturma
- Bölümler ile paragraflar arasında bağlantı oluşturma
- Tabloları ve tablonun bulunduğu bölümü belirleme
- Listeleri ve iç içe listeleri işleme
- Sayfalar arasında devam eden içeriği birleştirme
- Tekrarlanan üstbilgi ve altbilgileri kaldırma
- Filigran kaldırma
- OCR sonuçları için sınırlayıcı kutular sağlama
HTML, Text ve Office belgelerinin işlenmesi
- HTML ayrıştırıcı, RAG performansını artırmak için daha kaliteli parçalar oluşturacak yerleşim duyarlı bloklar üretir
- Text ayrıştırıcı, görsel bilgi, font bilgisi ve sınırlayıcı kutu olmadan yalnızca metne bakarak listeleri, tabloları, başlıkları vb. tahmin eder
- DOCX, PPTX ve Apache Tika'nın desteklediği diğer biçimler, Tika'nın HTML çıktısı kullanıldıktan sonra HTML ayrıştırıcıyla işlenir
Çalıştırma ve API kullanımı
- Doğrudan çalıştırma adımları Java kurulumu, Tika sunucusunu çalıştırma,
nlm-ingestorkurulumu ve ingestor'ı çalıştırmadan oluşur- Tika sunucusunu çalıştırma:
java -jar <path_to_nlm_ingestor>/jars/tika-server-standard-nlm-modified-2.9.2_v2.jar - Kurulum:
pip install nlm-ingestor - Çalıştırma:
python -m nlm_ingestor.ingestion_daemon
- Tika sunucusunu çalıştırma:
- Herkese açık GitHub Container Registry'de Docker imajı sunulur
- İmajı alma:
docker pull ghcr.io/nlmatics/nlm-ingestor:latest - Çalıştırma örneği:
docker run -p 5010:5001 ghcr.io/nlmatics/nlm-ingestor:latest-<version>
- İmajı alma:
- Sunucu çalıştıktan sonra llmsherpa API kütüphanesiyle parçalar alınarak LLM projelerinde kullanılabilir
llmsherpa_urlörneğihttp://localhost:5010/api/parseDocument?renderFormat=allşeklindedir- OCR uygulama:
&applyOcr=yes - Başlık seviyesi ataması için farklı bir algoritma kullanan yeni indent ayrıştırıcıyı kullanma:
&useNewIndentParser=yes
- OCR uygulama:
- Geliştirme sunucusu olarak kullanılabilir, ancak üretim ortamında nginx ya da bulut ağ geçidi gibi bir güvenli ağ geçidinin arkasında çalıştırılması önerilir
- Sunucuyu llmsherpa ayrıştırıcısıyla test etmeye yönelik örnek kod test_llmsherpa_api notebook'unda yer alır
Kural tabanlı ayrıştırıcının seçilme nedeni
- nlmatics ekibi, Tom Liu ve Yi Zhang tarafından geliştirilen YOLO tabanlı görsel ayrıştırıcı da dahil olmak üzere 4 yıl boyunca çeşitli seçenekleri değerlendirdikten sonra kural tabanlı ayrıştırıcıyı seçti
- Kural tabanlı ayrıştırıcı, herhangi bir görsel ayrıştırıcıdan kayda değer ölçüde daha hızlıdır; depo açıklaması bunu 100 kat hızlı olarak ifade eder
- Görsel ayrıştırıcılar, metin katmanı olan PDF'lerde bile tüm sayfaların görüntülerini oluşturmak zorundadır
- Görsel ayrıştırıcılar, metin katmanı olmayan OCR PDF'ler veya form verilerinden oluşan küçük PDF'ler için daha iyi bir seçenek olabilir
- Yüzlerce sayfalık büyük metin katmanlı PDF'lerde kural tabanlı ayrıştırıcının daha pratik olduğu düşünülür
- PDF OCR özelliği kullanılmıyorsa özel donanım gerekmez
- Depo açıklaması, 2000'lerin başındaki donanımlarda bile çalışabileceğini belirtir
- Görsel ayrıştırıcılar dahil tüm ayrıştırıcılarda hata oluşabilir; model tabanlı ayrıştırıcıların hatalarını düzeltme biçiminin tatmin edici olmadığı açıklanıyor
- Eğitim setine daha fazla örnek eklendiğinde önceki eğitimin doğruluğu düşebilir ve önceden çalışan kod belirsiz hale gelebilir
- Model tabanlı ayrıştırıcı sorunları kural tabanlı fikirlerle giderildiğinde yeniden çok sayıda kural yazmak gerekir
nlmatics'in değiştirilmiş Tika sürümü
- nlmatics'in değiştirilmiş Tika sürümü 2.4.1-nlm dalında bulunur
- Kolaylık için derlenmiş jar dosyası deponun
jars/klasörüne dahil edilmiştir - Bazı PDF'lerde Java sunucusunda hata oluşabilir; bu durumda ilgili kodun düzeltilmesi ve jar dosyasının yeniden derlenmesi gerekir
- Değiştirilen dosyalar, her PDF metin öğesi için font ve koordinatlar ekler ve filigranları kaldırır
PDF2XHTML.javaAbstractPDF2XHTML.java
GraphicsStreamProcessor.javadeğişikliği, tablo tespitine yardımcı olabilecek çizgiler ve dikdörtgenler eklemek içindir- Değişikliklerin etkisi pdf_visual_ingestor_step_by_step notebook'unun baş kısmında görülebilir
- Gelecekteki çalışma fikirleri şunlardır
- Tika değişikliklerine bağımlılığı kaldırmak için pdfbox üzerinde kendi wrapper'ını yazmak
- En yeni Tika sürümüne yükseltmek
- Döndürülen HTML biçimini CSS ile daha uyumlu olacak şekilde düzenlemek
1 yorum
Hacker News yorumları
Bilimsel makalelerle çalışıyorsanız GROBID de eklemeye değer: https://github.com/kermitt2/grobid
paperetl(https://github.com/neuml/paperetl) ile birlikte kullanıyorum
Güzel proje. Belge ayrıştırmada olgunluğu ve desteklediği formatların genişliği nedeniyle uzun süredir Tika kullanıyorum; XHTML çıktısı da RAG için belge parçalamada yardımcı oluyor
Örnekler: https://neuml.hashnode.dev/build-rag-pipelines-with-txtai ve https://neuml.hashnode.dev/extract-text-from-documents
Bu arada txtai(https://github.com/neuml/txtai) projesinin ana yazarlarından biriyim
pdfminer.six (unstructured'ın kullandığı) düzen algılamada oldukça temel kaldığı için çok sütunlu metinleri ayrıştıramaması hayal kırıklığı yaratmıştı; MuPDF ise kusursuz halletmişti
Şu anda MuPDF + AWS Textract'i (çoğunlukla tablolar için) birlikte kullanıyorum; başkalarının ne kullandığını bilmek isterim
Oldukça faydalı olabilir. Çalıştığım şirkette PDF'leri okuyup anlamsal farkları karşılaştıran “PDFC” adlı bir PDF karşılaştırma aracımız var: https://www.inetsoftware.de/products/pdf-content-comparer
PDF formatı çok karmaşık olduğu için ayrıştırma epey baş ağrıtıcı olabiliyor. Biz bu özelliklerin çoğunu zaten destekliyoruz, ama her zaman çok sayıda uç durum olduğundan ek yaklaşımlar işe yarayabilir
Tesseract OCR fallback iyi görünüyor
Artık RAG için langchain, LLMindex, unstructured vb. birçok dosya yükleyici var; bunu tercih etmek için bir neden olup olmadığını merak ediyorum. Örneğin benchmark skorlarında önde olduğuna dair bir kanıt var mı
Ancak PDF ayrıştırma amacıyla bu RAG araçlarını denedim ve çıktı kalitesi oldukça düşüktü. LLM sorunu bir ölçüde etrafından dolaştığı için RAG'de idare eder çalışıyor, ama düzgün referansları olan daha kaliteli yanıtlar istiyorsanız bence en iyisi doğrudan kural tabanlı bir ayrıştırıcı kullanmak. Sonunda ben de öyle yaptım; sadece Tika değil MuPDF tabanlıydı
Bu aracın yazarları da benzer düşünmüş olabilir
Bir RAG prototipi çalıştırmak için yeterliydi ama güvenilir bir şey inşa etmek için yetersizdi. Bu proje çok daha sahada sınanmış bir uygulama gibi görünüyor
Harika iş, çok ilginç. Ancak GitHub'a gidince “This organization has no public members” yazıyor; kim olduğunuzu hiç bilmiyorum ve kamuya açık olmayan şekilde bunun içinde başka neler olabileceğini de bilemiyorum
Genel olarak, “isimsiz gizli bir grubun $CORP güvenlik sitesine koyduğu şey” ile geleneksel tanıtım ve güven inşa etme yöntemleri arasında, zamanla kimlik ve güven oluşturabilecek bir orta noktaya ihtiyaç olduğunu düşünüyorum
LLM/RAG projelerinde en uygun parçaları elde etmek için bu sunucuyu llmsherpa LayoutPDFReader ile birlikte kullanabilirsiniz: https://github.com/nlmatics/llmsherpa
Depodaki örneklere ve notebook'lara bakın
Örnek girdi/çıktı çiftlerinin bir yerde olup olmadığını merak ediyorum
Notebook içeren örnekler burada: https://github.com/nlmatics/llmsherpa
Depodaki başka bir örnek notebook da burada: https://github.com/nlmatics/nlm-ingestor/blob/main/notebooks...
Bununla birkaç yüz PDF ayrıştırdım; sonuçlar epey iyiydi. Julia ile geliştirilmiş olsaydı en az 10 kat daha hızlı olurdu diye düşünüyorum
Bunun Azure Document Intelligence'tan nasıl farklı olduğunu, yoksa fiilen aynı şey mi olduğunu merak ediyorum
Bu sunucuyu llmsherpa kütüphanesiyle (https://github.com/nlmatics/llmsherpa) birlikte kullanırsanız LLM/RAG projelerine uygun, düzen dostu parçalar elde edebilirsiniz
Bu kütüphane ve fitz/pymupdf gibi araçlar PDF'den metni doğrudan çıkarır, ardından ayrıştırma ve yapılandırma kuralları uygulamanıza imkân verir. Modern PDF'lerin çoğunda OCR olmadan metin çıkarılabilir
Elbette çok daha ucuzdur, ancak dinamik düzenlerin geneline iyi ölçeklenmez; bu yüzden genellikle standart bir yapıya göre yapılandırabildiğinizde kullanılır. Yine de bilimsel makaleler gibi şeylerde kural tabanlı metin çıkarmanın oldukça dinamik şekilde iyi çalıştığını gördüm
Yine de Tesseract OCR'ın potansiyel bir sınırlama olmasından endişeliyim. Çok fazla hata yaptığını gördüm
Örnek var mı merak ediyorum. Depoda hiç PDF dosyası yok gibi görünüyor
Bu nlm-ingestor projesi, llmsherpa ile birlikte çalışan backend'i sağlıyor. llmsherpa kütüphanesi, LLM/RAG projeleri için iyi parçalar çıkarmada çok kullanışlı