Retrieval-Augmented Generation (RAG)

Arama Kalitesini Optimize Etme: RAG Sistemleri İçin Gelişmiş Parçalama Stratejileri

Arama Destekli Üretim (RAG), Büyük Dil Modellerini (LLM) mülki verilerde kökleştirmek için standart mimari haline gelmiştir. Ancak, üretim kalitesi, arama kalitesiyle iç içe geçmiştir. Sistem, alakasız, parçalı veya eksik bağlamı geri getirirse, model halüsinasyonlar üretecek veya düşük kaliteli cevaplar verecektir. Bu boru hattındaki en kritik, ancak sıklıkla göz ardı edilen değişken parçalama (chunking) işlemidir.

Parçalama, büyük belgelerin vektör uzayına gömülecek (embed) daha küçük, yönetilebilir parçalara bölünmesi işlemidir. Metni bölmek basit bir ön işleme adımı gibi görünse de, aslında bilgi yoğunluğu, semantik tutarlılık ve hesaplama kısıtlamaları arasında karmaşık bir dengeleme eylemidir. Bu yazıda, basit karakter sınırlarının ötesine geçerek bağlamsal olarak zengin parçalar oluşturan gelişmiş parçalama stratejilerini inceliyoruz.

Basit Sabit Boyutlu Parçalamadaki Sorun

Parçalama için en basit yaklaşım sabit boyutlu bölmedir. Bu, metni $N$ karakterlik (veya token) segmentlere, isteğe bağlı bir örtüşme (overlap) ile dilimlemeyi içerir. Uygulanması kolay olsa da, bu yöntem ciddi semantik parçalanma sorunlarından muzdariptir.

Karmaşık bir hukuki maddeyi açıklayan bir belgeyi düşünün. Sabit boyutlu bir parça, bir cümlenin ortasından başlayabilir, bir düşüncenin sonundan önce bitebilir veya bir tabloyu iki parçaya bölebilir. Bu parçalar gömüldüğünde, vektör temsil yalnızca kısmi anlamı yakalar. Arama sırasında, kullanıcının sorgusu bölme sınırını kapsayan bir kavramla ilgiliyse, hiçbir tek parça tam mantıksal birimi içermediği için aracı, ilgili parçaları yüksek sıralamada tutamama riskiyle karşı karşıya kalabilir.

Özyinelemeli Karakter Bölme

Daha sağlam bir temel Özyinelemeli Karakter Bölme (Recursive Character Splitting) yöntemidir. Bu yöntem, metni körü körüne karakterlere göre kesmek yerine, doğal ayraçları hiyerarşik bir şekilde kullanarak bölme girişiminde bulunur. Amaç, cümleleri, paragrafları ve bölümleri mümkün olan her yerde bütünlük içinde tutmaktır.

Algoritma genellikle bir ayraç listesi tanımlayarak (ör. `"\n\n"`, `"\n"`, `" "`) ve metni ilk ayraça göre özyinelemeli olarak bölerek çalışır. Sonuçlanan parçalar hâlâ istenen maksimum boyuttan büyükse, bir sonraki ayraça geçer. Bu, parçaların doğal dil sınırlarıyla hizalanmasını sağlar.

from langchain.text_splitter import RecursiveCharacterTextSplitter

# Bölücüyü tanımla
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
    is_separator_regex=False,
    separators=["\n\n", "\n", " ", ""]
)

text = """
Bölüm 1: Giriş
Yapay zekanın tarihi uzundur.

Bölüm 2: Mevcut Durum
Modern LLM'ler transformer'lara dayanır."""

chunks = text_splitter.split_text(text)
# Sonuçlanan parçalar, daha fazla bölmeden önce paragraf kırılmalarına saygı gösterir

Semantik ve Cümle-Pencere Parçalaması

Daha üst düzey uygulamalar için Semantik Parçalama, metni nerede böleceğini belirlemek için gömme (embedding) tekniklerini kullanır. Ardışık cümle gömmeleri arasındaki kosinüs benzerliğini hesaplayarak, algoritma konunun önemli ölçüde değiştiği noktaları belirler. Benzerlikteki bir düşüş, farklı kavramlar arasındaki bir sınırı gösterir ve parçaların tutarlı temalar etrafında oluşturulmasına olanak tanır.

Bir diğer güçlü hibrit yaklaşım Cümle-Pencere Parçalaması (Sentence-Window Chunking) dır. Bu stratejide, metin önce cümlelere bölünür. Ancak bir cümle gömme için "birincil" parça olarak seçildiğinde, $K$ önceki ve $K$ sonraki cümleden oluşan bir bağlam penceresiyle birlikte gelir. Bu, vektör veritabanına birincil cümleyi anlamak için gereken yerel bağlamı sağlarken, LLM'in hafif bağlam kaymaları gerektiren soruları yanıtlamak için bu pencereyi kullanmasına olanak tanır.

Örtüşme ve Granülerliği Ayarlama

Stratejiden bağımsız olarak, örtüşme (overlap) kritik bir parametredir. Örtüşme, parçaların sınırlarındaki bilgilerin kaybolmamasını sağlar. Tipik bir örtüşme, parça boyutunun %10-20'sidir. Çok az örtüşme, köprü bilgilerin kaçırılma riskini taşır; çok fazla örtüşme ise doğrulukta önemli kazanımlar olmadan depolama maliyetlerini ve arama gecikmesini artırır.

Ayrıca, granülerlik (ince ayar) önemlidir. Daha küçük parçalar (ör. 128-256 token) genellikle gömme daha dar bir konuya odaklandığı için daha hassas arama sonuçları verir. Daha büyük parçalar (ör. 512-1024 token) daha fazla bağlam sağlar ancak vektör temsilini seyreltebilir. En iyi uygulama, her iki boyutu da belirli veri setiniz ve sorgu setinizle deneyerek test etmektir.

Sonuç

Etkili parçalama, tek tip bir çözüm değildir. Kaynak verilerinizin yapısını ve kullanıcı sorgularınızın doğasını anlamayı gerektirir. Genel amaçlı belgeler için özyinelemeli karakter bölme ile başlayın, ancak bağlam sürekliliğinin en önemli olduğu teknik veya hukuki metinler için semantik veya pencere tabanlı stratejilere geçin. Parçalamayı, ön işleme sonrası bir düşünce olarak değil, RAG boru hattınızın temel bir bileşeni olarak ele alarak, üretilen yanıtlarınızın zekasını ve güvenilirliğini önemli ölçüde artırabilirsiniz.

Share: