Knowledge Bases

Gizli Yapı: Yüksek Kaliteli Bilgi Tabanları İçin PDF İşlemenin Ustası Olmak

Bilgiye Dayalı Üretkenlik (RAG) ve kurumsal bilgi yönetimi alanında PDF'ler en yaygın belge formatı olmaya devam ediyor. Ancak bir PDF'yi basit bir metin kabı olarak ele almak, geliştiricilerin yaptığı en yaygın ve pahalı hatalardan biridir. Bir PDF bir belge değildir; bir sunum talimatları kılavuzudur. Sağlam bilgi tabanları oluşturmak için yüzeyin altına inmeli, ham karakterlerden ziyade anlamsal yapıyı nasıl çıkaracağımızı anlamalıyız.

Neden Naif Metin Çıkarma Başarısız Olur?

PDF'den temel araçlarla metin çıkardığınızda, genellikle "okuma sırası" sorunlarıyla karşılaşırsınız. Yan yana olması gereken sütunlar doğrusal olarak birleştirilebilir. Tablolar sıkça okunamaz dizelere dönüştürülür. Dipnotlar cümlelerin ortasında görünür ve başlıklar tekrarlanır veya tamamen kaybolur. Bir LLM bağlam penceresi için bu gürültü, yüksek belirsizliğe ve düşük retrieval (getirme) doğruluğuna neden olur.

Etkili işleme, sunumun (nasıl göründüğü) ile içeriğin (ne anlama geldiği) ayrıştırılmasını gerektirir. Bu, Tagged PDF ağacını analiz etmeyi veya taranmış belgeler için Bilgisayarlı Görü tekniklerini kullanmayı içerir.

Modern Yaklaşımlar: Düzen Analizi vs. OCR

Bugün PDF'leri işlemek için iki temel strateji vardır:

  1. Yapıya Dayalı Çıkarma: Dijital olarak yerel PDF'lerle iyi çalışır. PyMuPDF veya pdfminer.six gibi araçlar, altta yatan metin nesnelerini ve uzamsal koordinatlarını çıkarır.
  2. Görüşe Dayalı İşleme: Taranmış belgeler veya karmaşık düzenler için gereklidir. Donut veya LayoutLMv3 gibi modeller, PDF sayfasını bir görüntü olarak ele alır; başlıklar, tablolar ve gövde metni gibi bölgeleri tanımlar.

Modern bir RAG hattı için genellikle hibrit bir yaklaşım en iyisidir. Yerel metin için yapıya dayalı çıkarmayı kullanın ve iç yapı eksik veya bozuk olduğunda görüşe dayalı modellere başvurun.

Python ile Pratik Uygulama

Yapılandırılmış içeriği çıkarmak için son derece verimli olan PyMuPDF (fitz) kullanan pratik bir örneğe bakalım. Görsel hiyerarşiyi koruyarak metin çıkaracağız; bu, aşağı akış parçalama (chunking) stratejilerine yardımcı olur.

import fitz  # PyMuPDF

def extract_structured_text(pdf_path):
    doc = fitz.open(pdf_path)
    structured_data = []
    
    for page_num, page in enumerate(doc):
        # Sınırlayıcı kutularla metin bloklarını çıkar
        blocks = page.get_text("dict")["blocks"]
        
        for block in blocks:
            if "lines" in block:
                line_text = ""
                # Bloktaki satırları topla
                for line in block["lines"]:
                    for span in line["spans"]:
                        line_text += span["text"]
                
                # Bu bloğun büyük olasılıkla bir başlık mı yoksa gövde mi olduğunu belirle
                # Yazı tipi boyutuna dayalı sezgisel yaklaşım
                font_size = blocks[0]["lines"][0]["spans"][0]["size"] if block.get("lines") else 12
                is_header = font_size > 14
                
                structured_data.append({
                    "page": page_num,
                    "is_header": is_header,
                    "content": line_text.strip(),
                    "bbox": block.get("bbox", [0,0,0,0]) # (x0, y0, x1, y1)
                })
                
    return structured_data

# Örnek kullanım
data = extract_structured_text("corporate_report.pdf")
for item in data[:5]:
    print(f"Type: {'Header' if item['is_header'] else 'Body'} - {item['content']}")

Parçalama ve Meta Veri Zenginleştirme

Metin çıkarıldıktan sonra, bir sonraki kritik adım parçalama (chunking) işlemidir. Düz metnin aksine, PDF içeriği anlamsal parçalamadan yararlanır. Sabit karakter sayıları yerine, başlıkları meta veri olarak koruyarak paragraf veya bölüm bazında parçalama yapmayı düşünün.

Her parça için sayfa numarası, belge başlığı ve parçanın bir başlık olarak tanımlanıp tanımlanmadığı gibi meta veriler enjekte edin. Bu, vektör veritabanınızın sonuçları daha etkili bir şekilde filtrelemesine olanak tanır. Örneğin, "Finansal Sonuçlar" hakkındaki bir kullanıcı sorgusu, "Tablo" veya "Özet" bölümleri olarak etiketlenmiş parçalara daraltılabilir; bu da gürültüyü büyük ölçüde azaltır.

Sonuç

PDF'leri işlemek çözülmüş bir sorun değildir, ancak yapay zeka destekli uygulamalar geliştiren herkes için temel bir mühendislik meydan okumasıdır. Naif metin çıkarmadan uzaklaşarak belge yapısına saygı duyan stratejiler benimseyerek, yüksek doğruluklu bir bilgi tabanının temelini atarsınız. Düzen analizi, OCR veya hibrit bir model seçmeniz fark etmez, amaç aynıdır: Yapay zeka dil modellerinin (LLM) gerçekten anlayabileceği yapılandırılmış, anlamsal bilgilere dönüştürmek için yapılandırılmamış görsel verileri dönüştürmek.

Share: