Bilgi Ekleme ile Üretim (RAG) sistemleri, Büyük Dil Modellerini (LLM) belirli ve mülkiyet verilerinde temellendirmek için sektör standardı haline gelmiştir. Ancak bir RAG sisteminin kalitesi genellikle LLM'nin kendisi tarafından değil, girdi verilerinin ön işlenmesi tarafından belirlenir. Bu hattaki en kritik adım parçalamadır. Parçalarınız çok küçükse bağlamı kaybedersiniz; çok büyükse anlamsal ilgiliği seyreltirsiniz. Doğru parçalama stratejisini seçmek, yardımcı bir asistan ile halüsinasyon gören bir robot arasındaki farktır.
Neden Parçalama Önemlidir
LLM'lerin sınırlı bir bağlam penceresi vardır. Vektör veritabanları, metnin anlamsal anlamını temsil eden gömme (embedding) değerlerini saklar. Vektör aramasının en ilgili bilgileri bulabilmesini sağlamak için, belgeleri yönetilebilir parçalara bölmeliyiz. Hedef, kendi kendine yeten ancak anlamsal olarak tutarlı parçalar oluşturmaktır. Kötü parçalanmış bir belge, bir cümleyi ikiye bölebilir veya bir başlığı gövdesinden ayırabilir, bu da ilgili olmayan aramalara yol açar.
1. Sabit Boyutlu Parçalama: Temel Çizgi
En basit yaklaşım sabit boyutlu parçalama'dır. Bu, metni belirli bir karakter sayısına veya token sayısına göre, genellikle bazı örtüşmelerle parçalara ayırır. Hızlı ve uygulamaya kolaydır ancak metnin yapısal bütünlüğünü görmezden gelir.
import textsplitter
def fixed_size_chunk(text, chunk_size=500, overlap=50):
chunks = []
for i in range(0, len(text), chunk_size - overlap):
chunks.append(text[i : i + chunk_size])
return chunks
# Example:
# text = "This is a very long document..."
# chunks = fixed_size_chunk(text)
2. Özyinelemeli Karakter Bölme: Yapısal Yaklaşım
Çoğu üretim sistemi özyinelemeli karakter bölme kullanır. Bu yöntem, karakterlere başvurmadan önce metni doğal sınırlarda (paragraflar veya cümleler gibi) bölmeğe çalışır. Metnin hiyerarşisine saygı duyar: Paragraf → Cümle → Kelime → Karakter. Bu, sabit boyutlu yöntemlere göre anlamı daha iyi korur.
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
separators=["\n\n", "\n", " ", ""]
)
# This splitter will try to keep paragraphs together,
# then sentences, then words, and finally characters.
docs = splitter.split_documents([Document(page_content=raw_text)])
3. Anlamsal Parçalama: İleri Düzey Yöntem
Anlamsal parçalama, metnin anlamının önemli ölçüde değiştiği noktaları tespit etmek için gömme (embedding) değerlerini kullanır. Bitişik cümleler arasındaki kosinüs benzerliğini analiz eder. Benzerlik bir eşiğin altına düştüğünde, yeni bir konunun başladığını varsayar ve bir parça kırılımı oluşturur.
Hesaplamalı olarak pahalı olsa da, bu yöntem, belge yapısından bağımsız olarak ilgili kavramları bir arada gruplandırdığı için genellikle en yüksek arama doğruluğunu sağlar.
# Pseudocode for semantic chunking
def semantic_chunk(text, threshold=0.8):
sentences = split_into_sentences(text)
embeddings = get_embeddings(sentences)
chunks = []
current_chunk = [sentences[0]]
for i in range(1, len(sentences)):
sim = cosine_similarity(embeddings[i-1], embeddings[i])
if sim < threshold:
chunks.append(" ".join(current_chunk))
current_chunk = [sentences[i]]
else:
current_chunk.append(sentences[i])
chunks.append(" ".join(current_chunk))
return chunks
Uygulama İçin En İyi Uygulamalar
- Örtüşme Anahtardır: Sınırlardaki bağlam kaybını önlemek için parçalar arasında her zaman bazı örtüşmeler (yüzde 10-20) dahil edin.
- Meta Verilere Saygı Gösterin: Kaynak verileriniz yapılandırılmışsa (JSON veya Markdown gibi), önce bunları ayrıştırın ve mantıksal birimlere göre parçalayın (ör. API uç noktası başına veya bölüm başına).
- Dene: "Tek boyut herkese uyar" diye bir şey yoktur. Arama hassasiyetini ölçmek için farklı parça boyutlarını ve stratejilerini gerçek sorgu veri setinizle test edin.
Sonuç
Parçalama sadece bir ön işleme adımı değildir; RAG mimarinizin temel bir bileşenidir. Sağlam bir temel çizgi için özyinelemeli karakter bölme ile başlayın ve aramalarınızın nüanslı bağlamı kaçırdığını fark ederseniz anlamsal parçalamaya geçin. Parçalama stratejinizi verilerinizin yapısıyla ve kullanıcı sorgularınızın anlamsal içeriğiyle hizalayarak, yapay zeka uygulamalarınızın performansını ve güvenilirliğini önemli ölçüde artıracaksınız.