Bilgiye Dayalı Üretkenlik (RAG) sistemleri, tükettikleri veri kadar iyidir. Düz metin belgelerinin işlenmesi nispeten basitken, yapılandırılmamış veya yarı yapılandırılmış belgelerin—özellikle çok sütunlu raporların ve karmaşık tabloların—yönetilmesi önemli bir darboğaz olmaya devam etmektedir. Metin sütunlar arasında yatay akış gösterdiğinde veya tablo verisi ayrıştırma sırasında yapısal bağlamını kaybettiğinde, ortaya çıkan gömme (embedding) değerleri gürültülü hale gelir; bu da halüsinasyonlara ve alakasız bilgi çekme sonuçlarına yol açar.
Doğrusal Olmayan Metin Yapılarının Zorluğu
Standart ayrıştırıcılar genellikle belgeleri doğrusal bir şekilde, sütun sütun veya satır satır okur. Çok sütunlu bir düzende bu yaklaşım, cümlelerin parçalanmasına neden olur. Örneğin, bir cümle birinci sütunun en altında başlayıp ikinci sütunun en üstünde devam edebilir. Eğer doğru şekilde işlenmezse, parçalama motoru bu cümleyi ikiye bölebilir ve anlam bütünlüğünü yok edebilir. Ayrıca, PDF'lerdeki veya HTML'deki tablolar genellikle her sayfada tekrarlanan açık satır ve sütun başlıklarından yoksundur; bu da LLM'lerin (Büyük Dil Modelleri) önemli bir ön işleme olmadan verinin bağlamını anlamasını zorlaştırır.
Strateji 1: Bağlamsal Örtüşme ile Anlamsal Parçalama
Parçalanmış cümleleri ele almak için, basit karakter tabanlı parçalamadan öteye geçmemiz gerekir. Anlamsal parçalama, metni paragraflar veya tam cümleler gibi doğal duraklara göre bölmeyi içerir. Bu uygulamada, örtüşme penceresi (overlap window) eklemek kritik öneme sahiptir. Bu, bir cümle bölünse bile, sonraki parçaların önceki parçadan bağlamı korumasını sağlar.
Örtüşme ile anlamsal parçalama uygulamak için Python ve LangChain kullanarak pratik bir örnek:
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Cümle sınırlarına saygı duyan bir parçalayıcı tanımlayın
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
length_function=len,
separators=["\n\n", "\n", ". ", " ", ""],
)
# Çok sütunlu bir rapordan alınan metin
report_text = """
Q3 finansal sonuçları, gelirlerde %15'lik bir artış gösterdiğini belirtiyor.
Ancak, tedarik zinciri aksaklıkları nedeniyle işletme giderleri de arttı.
Net kâr marjı %12'de seyrediyor; bu, Q2'deki %14'lük seviyenin altında.
"""
chunks = text_splitter.split_text(report_text)
for i, chunk in enumerate(chunks):
print(f"Chunk {i}: {chunk}")
Strateji 2: Gömme (Embedding) İçin Tabloların Yapılandırılması
Tablolar, anlamları ızgara yapılarından geldiği için özellikle zordur. Bir tablonun basit bir metin dökümü, onu okunamaz hale getirir. En iyi yaklaşım, tabloları satır ve sütun başlıklarını koruyan JSON veya HTML gibi yarı yapılandırılmış bir formata dönüştürmektir. Bu, gömme modelinin "Gelir"in altındaki sütundaki değerlerle ilişkili olduğunu anlamasını sağlar.
PyPDF2 veya Tabula-py gibi araçlar kullanırken, tabloyu bir DataFrame olarak çıkarın ve ardından her biri başlıklarıyla birlikte bir satırı temsil eden bir dize listesine dönüştürün:
import pandas as pd
# 'df', bir PDF tablosundan çıkarılmış bir pandas DataFrame'i temsil etsin
df = pd.DataFrame({
'Kategori': ['A', 'B'],
'Q1 Geliri': [100, 200],
'Q2 Geliri': [150, 250]
})
# Her satırı bağlam açısından zengin bir dizeye dönüştürün
table_contexts = []
for index, row in df.iterrows():
# Gömme modeli için okunabilir bir dize oluşturun
row_string = " | ".join([f"{col}: {val}" for col, val in row.items()])
table_contexts.append(f"Satır {index} Verisi: {row_string}")
print(table_contexts)
# Çıktı: ['Satır 0 Verisi: Kategori: A | Q1 Geliri: 100 | Q2 Geliri: 150', ...]
Strateji 3: HTML Tabanlı Ön İşleme
Kaynak belgeleriniz HTML ise, BeautifulSoup gibi sağlam bir ayrıştırıcı kullanmak düzen bütünlüğünü korumaya yardımcı olabilir. DOM ağacını analiz ederek, çok sütunlu düzenler için kritik olan görsel okuma sırasını yansıtmak üzere içeriği DOM sırasına göre yeniden sıralayabilirsiniz.
from bs4 import BeautifulSoup
import html5lib
# DOM yapısına saygı duyarak HTML'yi ayrıştırın
soup = BeautifulSoup(html_content, "html5lib")
# Yapısal ipuçlarını koruyarak metni çıkarın
for div in soup.find_all('div', class_='column'):
# Sütun içeriğini sırayla işleyin
print(div.get_text(separator=' ', strip=True))
Sonuç
Karmaşık düzenlerin yönetimi sadece bir ön işleme adımı değildir; RAG mimarisi başarısının temel bir bileşenidir. Anlamsal parçalama uygulamak, tablo verisini okunabilir formatlara yapılandırmak ve sağlam HTML ayrıştırıcıları kullanmak, geliştiricilerin gömme (embedding) kalitesini önemli ölçüde artırabilir. Bu teknikler, LLM'lerin doğru ve bağlama duyarlı bilgiler çekmesini sağlayarak nihayetinde son kullanıcılara daha doğru ve güvenilir yanıtlar sunmasını güvence altına alır.