Modern RAG (Bilgiye Dayalı Üretim) boru hatlarının çağında, en kalıcı zorluklardan biri, katı ve öngörülebilir bir yapıya uymayan belgelerin alımıdır. Standart CSV'lerin veya temiz JSON akışlarının aksine, gerçek dünya verileri çoğu zaman eski PDF'ler, tutarsız biçimlendirilmiş HTML sayfaları veya karmaşık Word belgeleri olarak gelir. Bir belge düzeni değiştiğinde, standart metin çıkarma yöntemleri genellikle bozulur; bu da parçalanmış bloklara ve kritik anlamsal bağlamın kaybına yol açar. Bu gönderi, bilgi tabanınızın doğru ve aranabilir kalmasını sağlamak için bu dinamik düzenleri işlemeye yönelik gelişmiş stratejileri ele alıyor.
Doğrusal Çıkarımın Sorunu
Çoğu temel alım boru hattı, bir belgeyi tek bir karakter akışı olarak ele alan doğrusal metin çıkarmaya dayanır. Bu yaklaşım, çok sütunlu düzenler, tablolar veya başlık/alt bilgi gürültüsüyle uğraşırken çarpıcı bir şekilde başarısız olur. Örneğin, doğrusal olarak çıkarılan iki sütunlu bir özgeçmiş, "Çalışma Deneyimi" ve "Eğitim" bölümlerini iç içe geçirebilir ve bu da verileri arama modelleri için kullanılamaz hale getirir.
Bunu çözmek için, metin çıkarmadan yapısal farkındalığa geçmemiz gerekir. Hedef, belgeyi parçalamadan önce mantıksal hiyerarşisini belirlemektir.
Strateji 1: Yapı Farkındalıklı Ayrıştırma
Etiketleri soyup düz metni okumak yerine, kaynak biçiminin içsel yapısından yararlanmalıyız. HTML için bu, DOM ağacına saygı göstermek anlamına gelir. PDF'ler için ise, düzeni yeniden oluşturmak için vektör koordinatlarını ve yazı boyutlarını analiz etmek gerekir.
HTML girdileri için hiyerarşik bağlamı koruyarak içerik çıkarmak için BeautifulSoup kullanan şu Python örneğini düşünün:
from bs4 import BeautifulSoup
import json
def extract_structured_context(html_content):
soup = BeautifulSoup(html_content, 'html.parser')
# Gürültüye neden olan, içerik olmayan öğeleri kaldır
for element in soup(['script', 'style', 'nav', 'footer', 'header']):
element.decompose()
structured_data = []
# Ana yapısal blokları dolaş
for block in soup.find_all(['h1', 'h2', 'h3', 'p', 'table']):
text = block.get_text(separator=' ', strip=True)
if text:
# Bloğu anlamsal rolüyle etiketle
structured_data.append({
'content': text,
'type': block.name,
'context': block.find_parent(['article', 'section', 'main'])
})
return structured_data
# Kullanım örneği
html_sample = """
<article>
<h1>Ürün Kılavuzu</h1>
<h2>Kurulum</h2>
<p>Adım 1: İkili dosyayı indirin.</p>
<h2>Sorun Giderme</h2>
<p>404 hatası görürseniz, ağınızı kontrol edin.</p>
</article>
"""
data = extract_structured_context(html_sample)
print(json.dumps(data, indent=2))
type alanını etiketleyerek ve ebeveyn context alanını belirleyerek, aşağı akış vektörleştirme süreçlerinin belirli bölümlere diğerlerinden daha yüksek ağırlık vermesini sağlarız. Bir başlık, ardından gelen paragraflar için kritik meta veri sağlar.
Strateji 2: Çakışmalı Anlamsal Parçalama
Yapısal ayrıştırma yapılsa bile, belgeler tek bir vektör gömümü için çok büyük olabilir. Körlüce kelime sayısına göre bölmek (örneğin, her 500 kelimede bir) genellikle mantıksal bağlantıları keser. Bunun yerine, anlamsal parçalama kullanın.
Bu, metindeki doğal kırılma noktalarını (çift satır sonu veya konu değişimleri gibi) tespit etmeyi ve her parçanın bir "ebeveyn bağlam" öneki içermesini sağlamayı içerir. Örneğin, bir parça "Kurulum" bölümünden türetilmişse, son gömülü dize şu görünüme sahip olmalıdır: "[Bölüm: Kurulum] Adım 1: İkili dosyayı indirin...". Bu, başlık aynı parçada olmasa bile bağlamın vektör içinde korunmasını sağlar.
Strateji 3: Tabloları ve Karmaşık Izgaraları İşleme
Tablolar, metin alımının belasıdır. Bir tablonun basit metin çıkarımı, karışık bir hücre listesine dönüşür. Bilgi tabanları için, tablolar alımdan önce Markdown veya JSON gibi yapılandırılmış bir biçime dönüştürülmelidir.
pandas gibi araçlar veya uzmanlaşmış PDF kütüphaneleri (örneğin PyMuPDF), tablo ızgara çizgilerini tespit edebilir. Tespit edildikten sonra, tabloyu bir dizi anahtar-değer çiftine veya bir Markdown tablosuna dönüştürün. Bu, arama motorlarının belirli veri noktalarını (örneğin, "Fiyat: $50") eşleştirmesini sağlar ve yapılandırılmamış metin duvarında kaybolmasını önler.
Dayanıklılık İçin Uygulama İpuçları
- Meta Verilerle Doğrulayın: Parçanın yanına her zaman orijinal kaynak meta verilerini (URL, sayfa numarası, dosya özü) saklayın. Bir arama sonucu yanlış görünüyorsa kolay hata ayıklama sağlar.
- Hibrit Arama Kullanın: Vektör aramayı anahtar kelime aramasıyla (BM25) birleştirin. Dinamik düzenler genellikle belirsiz anlamsal gömümlere yol açar, ancak tam anahtar kelime eşleşmeleri ilgili sonuçları kurtarabilir.
- Alım Kaymasını İzleyin: Parça boyutlarının ve türlerinin dağılımını izleyen bir günlük tutma uygulaması uygulayın. "Tablo" parçalarında ani bir artış veya "Paragraf" parçalarında bir düşüş görürseniz, bu, ayrıştırıcı ayarlaması gerektiren bir kaynak belge biçimi değişikliğine işaret edebilir.
Sonuç
Dinamik belge düzenlerini işlemek, tek seferlik bir görev değil, sürekli bir iyileştirme sürecidir. Basit metin çıkarmadan öteye geçerek yapı farkındalıklı ayrıştırma, anlamsal parçalama ve dikkatli tablo işleme ile, biçim varyasyonlarına karşı dayanıklı bir bilgi tabanı oluşturabilirsiniz. Anahtar nokta, düzeni bir hata değil bir özellik olarak ele almak ve bu yapısal bağlamı doğrudan veri boru hattınıza enjekte etmektir. Yapay zeka modelleri daha sofistike hale geldikçe, alım boru hattınızın kalitesi, faydalı bir asistan ile kafa karışıklığına düşen bir asistan arasındaki temel ayırt edici faktör olacaktır.