iToverDose/Yazılım· 27 NISAN 2026 · 20:04

Markdown Dokümanlarınızı RAG için Akıllıca Parçalamanın Yolları

Geleneksel token tabanlı parçalama yöntemleriyle karşılaşılan tabloların bölünmesi, listelerin parçalanması gibi sorunların çözümü, RAG sistemlerinin doğruluğunu artırıyor. İşte yapıya saygılı markdown ayrıştırma teknikleri.

DEV Community4 dk okuma0 Yorumlar

RAG (Çıkarım Destekli Geri Çağırma) sistemleri, kullanıcı sorularına doğru yanıtlar verebilmek için temiz ve bütün halinde verilere ihtiyaç duyar. Ancak çoğu geliştirici, sabit boyutlu token parçalama yöntemlerinin getirdiği gizli tehlikenin farkında değil: bu yöntemler markdown tablolarını, listeleri ya da kod bloklarını ortadan ikiye bölerek anlam kaybına yol açabiliyor. Örneğin, bir destek mühendisi, bir webhook yeniden deneme sürecini sorguladığında sistemin sadece tablonun ilk iki satırını geri getirmesi ve asıl hataya ait 429 durum kodunu içeren satırları kaybetmesi, yanıtın eksik olmasına neden oluyor. Bu sorunu çözmek için, markdown yapısına saygı duyan akıllı bir ayrıştırıcıya ihtiyaç var.

Sabit Token Parçalamanın Yapısal İçeriğe Etkileri

RAG eğitimlerinde en sık kullanılan token tabanlı parçalama yöntemi basit ve öngörülebilir olduğu için tercih ediliyor. Bu yaklaşım, herhangi bir belgeyi belirli aralıklarla parçalara bölerken, teknik dokümanların doğal yapısını göz ardı ediyor. Örneğin, markdown tabloları satır ortasında kesilerek bölünüyor, kod bloklarının açılış ve kapanış çizgileri kayboluyor ya da madde işaretli listeler başlıkların altında kalan unsurları kaybediyor. Aşağıdaki Python kodunda gösterildiği gibi, sabit token aralıklarıyla yapılan parçalama, anlam bütünlüğünü bozabiliyor:

import tiktoken

def sabit_parcalama(metin: str, boyut: int = 512) -> list[str]:
    kodlayici = tiktoken.encoding_for_model("gpt-4o")
    tokenlar = kodlayici.encode(metin)
    return [
        kodlayici.decode(tokenlar[i : i + boyut])
        for i in range(0, len(tokenlar), boyut)
    ]

Bu kod, 512 tokenlık parçalara ayırırken, örneğin | Durum Kodu | Yeniden Dene Zamanı | gibi bir tablonun satırını ortadan ikiye bölebiliyor. Bu durumda, ilk parça tablonun ilk kısmını, ikinci parça ise kalanını içereceğinden, RAG sistemi sadece parça halindeki verilerle yanıt üretebiliyor. Şubat 2026'da yapılan bir araştırmada, 50 akademik makale üzerinde farklı parçalama stratejileri test edildi. Sabit token tabanlı parçalama %69 doğruluk oranıyla en başarılı sonuç elde ederken, tamamen anlamsal parçalamada bu oran %54 olarak kaldı. Bu veriler, yapısal içerikle çalışırken token tabanlı yaklaşımların avantajını ortaya koyuyor.

Markdown’ı Atomik Bloklara Dönüştürmek

Markdown dosyalarını parçalamadan önce, her bir bileşenin—başlıklar, paragraflar, kod blokları, tablolar ve listeler—ayrı bir birim olarak ele alınması gerekiyor. Bu yaklaşım, iç bağlantılarının kaybolmasını engelleyerek anlam bütünlüğünü koruyor. Aşağıdaki Python sınıfı, markdown unsurlarını yapısal olarak temsil ediyor:

from dataclasses import dataclass

@dataclass
class Blok:
    tur: str  # h1..h6, paragraf, kod, tablo, liste
    seviye: int  # başlık seviyesi, diğerleri için 0
    icerik: str

Hafif bir ayrıştırıcı, markdown dosyasını satır satır tarayarak ilgili unsurları gruplandırıyor. Düzenli ifadeler kullanılarak başlıklar, kod blokları, tablo satırları ve liste unsurları tespit ediliyor:

  • ^#{1,6}\s+(.*)$ — Başlıkları tanır
  • ^\{3}` — Üç tırnaklı kod bloklarını algılar
  • ^\s*\|.*\|\s*$ — Tabloların satırlarını belirler
  • ^\s*([-*+]|\d+\.)\s+ — Liste unsurlarını tanımlar

Ayrıştırma süreci, tuket_kod, tuket_tablo ve tuket_liste gibi yardımcı fonksiyonlarla destekleniyor. Bu fonksiyonlar, ilgili unsurun tamamı okunana kadar satırları biriktiriyor ve her unsurun tek bir blok olarak saklanmasını sağlıyor. Böylece, 10 satırlık bir tablo bütün halinde kalırken, çok satırlı bir kod bloğu da parçalanmadan korunmuş oluyor.

Token Bütçesi: Esnek Sınırlar, Katı Kurallar

Markdown unsurları bloklara ayrıldıktan sonra, sıra token bütçesini yönetmeye geliyor. Bu aşamada, hedef token sayısına ulaşmak için esnek bir yaklaşım benimsenirken, asla sert_maks sınırını aşılmaması gerekiyor. Örneğin, 512 tokenlık bir pencereye sahip bir model için hedef=480 ve sert_maks=512 ayarlaması ideal bir denge sağlıyor. Daha geniş bağlam pencerelerine sahip modellerdeyse, örneğin text-embedding-3-large (8.191 token) için hedef=800 ve sert_maks=1024 değerleri tercih ediliyor.

import tiktoken

KODLAYICI = tiktoken.encoding_for_model("gpt-4o")

def token_sayisi(metin: str) -> int:
    return len(KODLAYICI.encode(metin))

Büyük ölçekli veri kümelerinde, token sayılarının önbelleğe alınması, naif parçalama yöntemlerinde karşılaşılan performans sorunlarını ortadan kaldırıyor. Veri kümesi ne kadar büyükse, token sayılarının ayrıştırma aşamasında hesaplanıp saklanması, parçalama sürecini önemli ölçüde hızlandırıyor.

Hırslı Paketleme ve Öncelikli Parçalama

Çekirdek algoritma, blokları hedef token sınırına uygun şekilde bir araya getiriyor. Eğer bir blok sert_maks sınırını aşarsa, bloklar öncelik sırasına göre parçalanıyor: başlıklar ilk sırada, ardından paragraflar, cümleler ve en sonunda kelimeler geliyor. Bu şekilde, başlıklar hiçbir zaman tek başlarına kalmıyor ve bir sonraki parçaya aktarılıyor.

def paketle(
    bloklar: list[Blok],
    hedef: int = 480,
    sert_maks: int = 512,
) -> list[str]:
    parcalar: list[str] = []
    ara_bellek: list[Blok] = []
    ara_token = 0

    def bosalt():
        nonlocal ara_bellek, ara_token
        if ara_bellek:
            parcalar.append("\n\n".join(b.icerik for b in ara_bellek))
        ara_bellek, ara_token = [], 0

    for blok in bloklar:
        bt = token_sayisi(blok.icerik)
        if bt > sert_maks:
            bosalt()
            for parca in buyuk_bloku_parcala(blok, sert_maks):
                parcalar.append(parca)
            continue

        if ara_token + bt > hedef and ara_token > 0:
            bosalt()
        ara_bellek.append(blok)
        ara_token += bt

    bosalt()
    return parcalar

Bu algoritma sayesinde, 700 tokenlık bir paragraf bile anlamsal bütünlüğü bozulmadan paketlenebiliyor. Başlıkların ve tabloların korunması, RAG sisteminin yanıt kalitesini doğrudan artırıyor.

Geleceğe Bakış: Yapısal Parçalama ile Daha Akıllı RAG Sistemleri

RAG sistemlerinin geleceği, belge yapısına duyarlı parçalama algoritmalarında yatıyor. Geliştiriciler, sabit token sınırlarından bağımsız olarak anlam bütünlüğünü koruyan akıllı ayrıştırıcılar kullanarak, RAG sistemlerinin doğruluğunu ve güvenilirliğini artırabilir. Gelecekte, bu tür yapısal parçalama yöntemlerinin standart hale gelmesiyle birlikte, RAG sistemlerinin kullanıcı sorularına daha doğru ve tutarlı yanıtlar sunması bekleniyor. Yapısal içeriklerin korunması, sadece teknik dokümanlarda değil, aynı zamanda karmaşık veri kümelerinde de RAG performansını önemli ölçüde iyileştirecek.

Yapay zeka özeti

RAG sistemlerinde karşılaşılan sabit token parçalama sorunlarını çözmek için markdown yapısına saygılı ayrıştırma tekniklerini keşfedin. Tabloların ve kod bloklarının bütünlüğünü koruyan yöntemler.

Yorumlar

00
YORUM BIRAK
ID #6ONMAZ

0 / 1200 KARAKTER

İnsan doğrulaması

4 + 4 = ?

Editör onayı sonrası yayına girer

Moderasyon · Spam koruması aktif

Henüz onaylı yorum yok. İlk yorumu sen bırak.