0Pricing
AI Engineering Academy · Ders

Parçalama Stratejileri: Sabit, Cümle Tabanlı ve Özyinelemeli

Sabit boyutlu, cümle sınırlarını izleyen ve özyinelemeli karakter metin bölücülerini uygulayıp karşılaştırın; parça boyutunun ve örtüşmenin geri getirme kalitesini nasıl etkilediğini anlayın.

Parçalama Stratejileri: Sabit, Cümle Tabanlı ve Özyinelemeli, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Parçalara Ayırma Kalitesi Neden Önemlidir

Parçalara ayırma, yüklenen belgeleri LLM'nin bağlam penceresine sığan ve ayrı ayrı dizine eklenip getirilebilen daha küçük parçalara bölme işlemidir. Parçalara ayırma biçiminiz, neredeyse diğer tüm etkenlerden daha fazla getirme kalitesini belirler. Bir yanıtı iki parçaya bölen bir parça, tek başına soruyu yanıtlamak için yeterli olmaz. Birbiriyle ilgisiz iki konuyu karıştıran bir parça, her iki konuyla ilgili sorular için getirilir ancak hiçbirinde yararlı olmaz.

Sabit Boyutlu Parçalara Ayırma

Sabit boyutlu parçalara ayırma, cümle veya paragraf sınırlarına bakmaksızın metni tam olarak N karakterden ya da N belirteçten oluşan parçalara böler. En basit stratejidir ve uygulanması hızlıdır. En büyük dezavantajı, sık sık cümleleri ortadan bölmesi ve düşüncenin ortasında başlayan veya biten parçalar oluşturmasıdır. Bu yöntem, veritabanı dışa aktarma dökümleri gibi yoğun ve tekdüze biçimlendirilmiş metinler için kabul edilebilir; ancak anlatı metinlerinde veya teknik belgelerde düşük getirme kalitesine yol açar.

def fixed_size_chunks(text, chunk_size=500, overlap=50):
    '''Split text into fixed-size character chunks with overlap'''
    chunks = []
    start = 0
    while start < len(text):
        end = start + chunk_size
        chunk = text[start:end]
        chunks.append(chunk)
        start += chunk_size - overlap  # overlap keeps context at boundaries
    return chunks

example = 'This is a long document. ' * 100
chunks = fixed_size_chunks(example, chunk_size=200, overlap=20)
print(f'Produced {len(chunks)} chunks, first: {chunks[0][:80]}...')

Sabit Parçalara Örtüşme Ekleme

Sabit boyutlu parçalara ayırmadaki temel iyileştirme örtüşmedir: her parça, önceki parçayla N karakteri paylaşır. Böylece parça sınırına yakın bilgiler, bitişik iki parçanın ikisinde de yer alır. 50-100 belirteçlik örtüşmeyle, sınırı aşan bir cümle iki parçadan en az birinde eksiksiz olarak bulunur. Daha fazla örtüşme kapsamı artırır; ancak dizin boyutunu büyütür ve getirme sonuçlarında yinelenen içerik oluşturur.

# Overlap example with a sentence at the boundary
text = 'A B C D E F G H I J'
chunk_size = 6  # characters
overlap = 2

i = 0
while i < len(text):
    print(repr(text[i:i+chunk_size]))
    i += chunk_size - overlap

# Output shows overlapping content:
# 'A B C D'
# 'C D E F'
# 'E F G H'
# Each adjacent pair shares 2 chars

Cümle Sınırlarında Parçalara Ayırma

Cümle sınırlarında parçalara ayırma, bölme işleminden önce cümle sonlarını algılamak için nltk veya spacy gibi NLP kitaplıklarını kullanır. Bu, hiçbir cümlenin ortadan bölünmemesini garanti eder. Bir sonraki cümleyi eklemek hedef boyutu aşana kadar cümleleri biriktirir, ardından yeni bir parça başlatırsınız. Sonuçta her zaman eksiksiz düşünceler içeren parçalar elde edilir ve bu parçalar, sabit karakter sayısına göre bölmeye kıyasla çok daha iyi embedding kalitesi sağlar.

import nltk
nltk.download('punkt', quiet=True)

def sentence_chunks(text, max_tokens=300):
    sentences = nltk.sent_tokenize(text)
    chunks = []
    current = []
    current_len = 0

    for sent in sentences:
        sent_tokens = len(sent.split())
        if current_len + sent_tokens > max_tokens and current:
            chunks.append(' '.join(current))
            current = []
            current_len = 0
        current.append(sent)
        current_len += sent_tokens

    if current:
        chunks.append(' '.join(current))
    return chunks

Özyinelemeli Karakter Metni Bölme

Özyinelemeli karakter bölme, üretim RAG sistemlerinde en yaygın kullanılan stratejidir. Ayırıcıları sırayla hiyerarşik olarak dener: önce paragraf sonları (\n\n), ardından satır sonları (\n), sonra cümle sonundaki noktalar, ardından boşluklar ve son olarak tek tek karakterler. Parçayı hedef boyutun altında tutan en büyük anlamlı sınırdan böler; böylece belge yapısına mümkün olduğunca uygun parçalar oluşturur.

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,       # target size in characters
    chunk_overlap=200,     # overlap between consecutive chunks
    separators=['\n\n', '\n', '. ', '! ', '? ', ' ', ''],
    length_function=len
)

with open('document.txt') as f:
    text = f.read()

chunks = splitter.split_text(text)
print(f'Split into {len(chunks)} chunks')
for i, chunk in enumerate(chunks[:3]):
    print(f'Chunk {i}: {len(chunk)} chars — {chunk[:60]}...')

Belirteç Farkındalıklı Bölme

Karakter sayıları, belirteç sayıları için kesin olmayan bir yaklaşık değerdir. 1000 karakterlik bir parça, sözcük uzunluğuna ve dile bağlı olarak 200 ya da 400 belirteç olabilir. Kesin denetim için tiktoken kullanarak belirteç sayısına göre bölün. Bu, parçaları modelin bağlam penceresine sığdırmak ve maliyeti doğru tahmin etmek açısından önemlidir. LangChain'in TokenTextSplitter bileşeni, belirteç farkındalıklı parçalara ayırma için tiktoken'i sarmalar.

from langchain_text_splitters import TokenTextSplitter
import tiktoken

# Split by actual token count, not characters
splitter = TokenTextSplitter(
    encoding_name='cl100k_base',  # GPT-4 tokenizer
    chunk_size=256,               # target tokens per chunk
    chunk_overlap=32              # overlap in tokens
)

chunks = splitter.split_text(text)

# Verify token count
enc = tiktoken.get_encoding('cl100k_base')
for chunk in chunks[:3]:
    tokens = len(enc.encode(chunk))
    print(f'Chunk: {tokens} tokens')

Doğru Parça Boyutunu Seçme

Parça boyutu kritik bir hiperparametredir. Küçük parçalar (100-200 belirteç) kesindir; sıkı biçimde odaklanmış bilgiler içerir ve iyi embedding oluşturur. Ancak çevredeki bağlamı kaybettikleri için LLM'nin yanıt vermek için yeterli bilgisi olmayabilir. Büyük parçalar (500-1000 belirteç) daha fazla bağlam sağlar; ancak embedding'leri daha geniş bir konu üzerinde ortalama aldığı için belirli sorgular için getirilmeleri zorlaşır. Çoğu üretim sistemi, verileri üzerinde yapılan deneysel testlerle 256-512 belirteç kullanır.

Parçalara Bağlam Ekleme

Etkili bir geliştirme, bağlamsal parça üst bilgileri kullanmaktır: embedding oluşturmadan önce belge başlığını ve bölüm başlığını her parçanın metninin başına ekleyin. Böylece embedding yalnızca parçanın içeriğini değil, belgedeki kaynağını da kapsar. Yan haklar ve İzin Politikası: Çalışanlar her yıl 15 gün biriktirir... şeklindeki bir parça, üst bilgisi olmayan aynı metne göre izin politikasıyla ilgili sorular için çok daha doğru biçimde getirilir.

def create_contextual_chunks(doc, splitter):
    title = doc['metadata'].get('title', '')
    section = doc['metadata'].get('section', '')
    text = doc['text']

    raw_chunks = splitter.split_text(text)
    contextual_chunks = []
    for chunk in raw_chunks:
        # Prepend document context to each chunk
        context_header = f'{title}\n{section}\n\n' if title else ''
        contextual_chunks.append({
            'text': context_header + chunk,
            'metadata': doc['metadata']
        })
    return contextual_chunks

Stratejileri Verileriniz Üzerinde Karşılaştırma

Tek bir parçalara ayırma stratejisi her durumda en iyi değildir. Hızlı bir değerlendirme oluşturun: yanıtlarını bildiğiniz 20 soruyu alın, her parçalara ayırma stratejisiyle getirme işlemini çalıştırın ve doğru parçanın ilk 5 sonuçta ne sıklıkla yer aldığını ölçün (5'te isabet oranı). Bunu kurmak bir saat sürer ve haftalarca süren tahmin yürütme işinden kurtarır. Belirli belge biçiminizin (yoğun hukuki metinlere karşı yapılandırılmış teknik belgelere) bir stratejiyi diğerlerine güçlü biçimde üstün kıldığını çoğu zaman görürsünüz.

def evaluate_chunking_strategy(questions_and_answers, retriever):
    hits = 0
    for qa in questions_and_answers:
        results = retriever.retrieve(qa['question'], top_k=5)
        result_texts = [r['text'] for r in results]
        # Check if answer text appears in any retrieved chunk
        if any(qa['answer'] in text for text in result_texts):
            hits += 1
    hit_rate = hits / len(questions_and_answers)
    print(f'Hit rate@5: {hit_rate:.1%} ({hits}/{len(questions_and_answers)})')
    return hit_rate

Özel Belge Türlerini İşleme

Bazı belge türleri özel amaçlı parçalara ayırma gerektirir. Kod dosyaları, karakter sayısına göre değil, işlev veya sınıf sınırlarına göre bölünmelidir. Markdown dosyaları, her parçanın bir bölüme karşılık gelmesi için başlık sınırlarında bölünmelidir. Tablolar, tek bir parça olarak bütün hâlinde korunmalıdır (tablonun ortasından bölmek içeriği anlaşılmaz hâle getirir). Her duruma uyan tek bir bölücü uygulamak yerine, parçalara ayırma stratejinizi derleminizdeki belge türlerine göre planlayın.

from langchain_text_splitters import MarkdownHeaderTextSplitter

# Split Markdown by header hierarchy
md_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=[
        ('#', 'h1'),
        ('##', 'h2'),
        ('###', 'h3')
    ]
)

with open('documentation.md') as f:
    md_text = f.read()

# Each chunk gets metadata from its heading hierarchy
chunks = md_splitter.split_text(md_text)
for chunk in chunks[:3]:
    print('Section:', chunk.metadata)
    print('Text:', chunk.page_content[:80])
    print()

Parça Soyunu İzleme

Her parçanın, kaynak belgesinden ve konumundan türetilen sabit ve benzersiz bir kimliği olmalıdır. Belgeler değiştiğinde tüm derlemi yeniden dizine eklemeden belirli parçaları güncellemek için bu kimliği kullanın. Kaynak yolunun ve parça dizininin belirlenimci bir özeti iyi çalışır. Ayrıca parça konumunu meta verilere kaydedin (X belgesindeki 12 parçadan 3. parça gibi); bu, birden fazla bitişik parça birlikte getirildiğinde tam bölümlerin yeniden birleştirilmesine yardımcı olur.

import hashlib

def assign_chunk_ids(chunks, source_path):
    for i, chunk in enumerate(chunks):
        key = f'{source_path}::chunk_{i}'
        chunk_id = hashlib.sha256(key.encode()).hexdigest()[:16]
        chunk['id'] = chunk_id
        chunk['metadata']['chunk_index'] = i
        chunk['metadata']['total_chunks'] = len(chunks)
    return chunks

# IDs are stable across re-runs if source and position match
chunks = sentence_chunks(text)
chunks = [{'text': c, 'metadata': {}} for c in chunks]
assign_chunk_ids(chunks, 'docs/policy_v3.pdf')

Hızlı Kontrol

Bu dersteki yapay zekâ mühendisliği kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: sabit boyutlu parçalara ayırma basittir ancak cümleleri ortadan böler; cümle sınırlarında parçalara ayırma eksiksiz düşünceleri korur; özyinelemeli karakter bölme belge yapısına uyar ve üretim ortamında en yaygın tercihtir; ayrıca belirteç farkındalıklı bölme, bağlamsal üst bilgiler, Markdown ve kod için özel amaçlı bölücüler ve artımlı güncellemeler için sabit parça kimlikleri gibi gelişmiş teknikleri öğrendiniz. Sırada bu parçaları bir vektör veritabanına embedding olarak ekleyip depolamak var.

Sıkça Sorulan Sorular

“Parçalama Stratejileri: Sabit, Cümle Tabanlı ve Özyinelemeli” dersi ücretsiz mi?

Evet — “Parçalama Stratejileri: Sabit, Cümle Tabanlı ve Özyinelemeli” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Parçalama Stratejileri: Sabit, Cümle Tabanlı ve Özyinelemeli” dersinde ne öğreneceğim?

Sabit boyutlu, cümle sınırlarını izleyen ve özyinelemeli karakter metin bölücülerini uygulayıp karşılaştırın; parça boyutunun ve örtüşmenin geri getirme kalitesini nasıl etkilediğini anlayın. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Parçalama Stratejileri: Sabit, Cümle Tabanlı ve Özyinelemeli” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Belge Yükleme ve Metin Çıkarma
  2. Parçalama Stratejileri: Sabit, Cümle Tabanlı ve Özyinelemeli
  3. Dizinleme: Parçaları Gömme ve Depolama
  4. Sorgulama, Geri Getirme ve Oluşturma
← AI Engineering Academy Sayfasına Dön