Modül 6 · RAG and Agentic Search · ⏱ 13 dakika

Text chunking stratejileri

Text chunking strategies

Orijinal İngilizce video — Anthropic Academy / JWPlayer. Aşağıdaki Türkçe metin dersi birebir özetler.

Bu modül için tahmini süre: 13 dakika

Genel bakış

Text chunking, bir RAG pipeline’ı kurarken en kritik adımlardan biridir. Belgeleri nasıl parçaladığın, tüm sistemin kalitesini doğrudan etkiler. Bu derste üç ana chunking yaklaşımını — size-based, structure-based ve semantic-based — ele alıyor; ardından pratik bir orta yol olan sentence-based chunking’i ve strateji seçim kriterlerini inceliyoruz.

Text chunking, bir RAG (Retrieval Augmented Generation) pipeline’ı kurarken en kritik adımlardan biridir. Belgeleri nasıl böldüğün, tüm sistemin kalitesini doğrudan etkiler. Kötü bir chunking stratejisi, prompt’una alakasız context’in girmesine ve AI’ın tamamen yanlış cevaplar üretmesine yol açabilir.

Şu örneği düşün: medical research ve software engineering hakkında bölümleri olan bir belgen var. Kötü chunk’lama yaparsan, “Bu yıl engineers kaç bug fix etti?” diye soran bir kullanıcı, sadece medical bölümü farklı bir bağlamda “bug” kelimesini içerdiği için software engineering yerine medical research bilgisi alabilir.

Bu yüzden doğru chunking stratejisini seçmek bu kadar önemlidir. Üç ana yaklaşımı inceleyelim.

Size-based chunking

Size-based chunking en basit yaklaşımdır — metnini eşit uzunlukta string’lere bölersin. 325 karakterlik bir belgen varsa, onu kabaca 108 karakterlik üç chunk’a bölebilirsin.

Bu yöntem implementasyonu kolaydır ve her tür belgeyle çalışır, ama açık dezavantajları vardır:

  • Kelimeler cümlenin ortasında kesilir
  • Chunk’lar çevreleyen metinden önemli context’i kaybeder
  • Section header’ları içeriklerinden ayrılabilir

Bu sorunları gidermek için chunk’lar arasına overlap ekleyebilirsin. Bu, her chunk’ın komşu chunk’lardan bazı karakterleri içermesi anlamına gelir; daha iyi context sağlar ve tam kelime ve cümleler garanti edilir.

İşte temel bir implementasyon:

def chunk_by_char(text, chunk_size=150, chunk_overlap=20):
    chunks = []
    start_idx = 0
    
    while start_idx < len(text):
        end_idx = min(start_idx + chunk_size, len(text))
        chunk_text = text[start_idx:end_idx]
        chunks.append(chunk_text)
        
        start_idx = (
            end_idx - chunk_overlap if end_idx < len(text) else len(text)
        )
    
    return chunks

Structure-based chunking

Structure-based chunking metni belgenin doğal yapısına göre — header’lar, paragraflar ve section’lar — böler. Markdown dosyaları gibi iyi biçimlendirilmiş belgelerin olduğunda harika çalışır.

Bir Markdown belgesi için header marker’larına göre bölebilirsin:

def chunk_by_section(document_text):
    pattern = r"\n## "
    return re.split(pattern, document_text)

Bu yaklaşım en temiz, en anlamlı chunk’ları verir çünkü her biri tam bir bölümü temsil eder. Ancak yalnızca belge yapısı hakkında garantilerin olduğunda çalışır. Gerçek dünya belgelerinin çoğu, yapısal marker’ları olmayan plain text veya PDF’lerdir.

Semantic-based chunking

Semantic-based chunking en sofistike yaklaşımdır. Metni cümlelere böler, ardından natural language processing kullanarak ardışık cümlelerin ne kadar ilişkili olduğunu belirlersin. Chunk’ları ilişkili cümle gruplarından oluşturursun.

Bu yöntem hesaplama açısından pahalıdır ama en alakalı chunk’ları üretir. Tek tek cümlelerin anlamını anlamayı gerektirir ve diğer stratejilere göre implementasyonu daha karmaşıktır.

Sentence-based chunking

Pratik bir orta yol, cümleye göre chunk’lamadır. Metni regular expression’larla tek tek cümlelere bölersin, ardından opsiyonel overlap ile gruplara ayırırsın:

def chunk_by_sentence(text, max_sentences_per_chunk=5, overlap_sentences=1):
    sentences = re.split(r"(?<=[.!?])\s+", text)
    
    chunks = []
    start_idx = 0
    
    while start_idx < len(sentences):
        end_idx = min(start_idx + max_sentences_per_chunk, len(sentences))
        current_chunk = sentences[start_idx:end_idx]
        chunks.append(" ".join(current_chunk))
        
        start_idx += max_sentences_per_chunk - overlap_sentences
        
        if start_idx < 0:
            start_idx = 0
    
    return chunks

Stratejini seçmek

Seçimin tamamen use case’ine ve belge garantilerine bağlıdır:

  • Structure-based: Belge biçimlendirmesini kontrol ettiğinde (kurum içi raporlar gibi) en iyi sonucu verir
  • Sentence-based: Çoğu text belge için iyi bir orta yol
  • Size-based: Code dahil her içerik türüyle çalışan, en güvenilir fallback

Size-based chunking with overlap, production’da sıkça tercih edilen bir seçenektir çünkü basit, güvenilir ve her belge tipiyle çalışır. Mükemmel sonuç vermese de tutarlı bir şekilde makul chunk’lar üretir ve pipeline’ını bozmaz.

Unutma: tek bir “en iyi” chunking stratejisi yoktur. Doğru yaklaşım, belgelerine, use case’ine ve implementasyon karmaşıklığı ile chunk quality arasında yapmaya razı olduğun trade-off’lara bağlıdır.

Temel çıkarımlar

  • Kötü chunking, RAG sisteminin tamamen yanlış cevaplar üretmesine sebep olabilir
  • Size-based chunking en basit ve genel yöntemdir; overlap eklemek context kaybını azaltır
  • Structure-based chunking, Markdown gibi yapılı belgelerde en temiz chunk’ları verir
  • Semantic-based chunking en kaliteli sonucu verir ama pahalı ve karmaşıktır
  • Sentence-based chunking pratik bir orta yoldur; production’da size-based with overlap güvenilir bir varsayılandır