RAG'e Geçmeden Önce Chunking'i Bozmak
Parça sınırı retrieval'ı belirler

RAG demosuna bakınca iş 'embed et, sor, cevapla' gibi duruyor. İlk denememde cevaba yanlış bölüm girdi. Model uydurmamıştı. Yanlış parçayı ben vermiştim. Kesim, bir prosedürün ortasından geçiyordu; devamı sonraki chunk'ta kalmıştı.
Serinin bu parçası vektör ürünü önermiyor. Önce kesimi bozuyorum. Kesim yanlışsa üstüne hangi indeksi koysam aynı yalanı sıralar.
Kör karakter kesimi
Sabit 500 karakter, sıfır örtüşme, başlığı yok say. Bu üçü birlikte, cümleyi ikiye böler ve komşu bağlamı kaybeder. Küçük bir not deposunda bile 'bu adım hangi başlığın altında' bilgisi kayboluyor.
from dataclasses import dataclass
@dataclass(frozen=True)
class Chunk:
heading: str
text: str
index: int
def split_markdown(md: str, size: int = 600, overlap: int = 80) -> list[Chunk]:
parts: list[Chunk] = []
heading = "giris"
buf: list[str] = []
index = 0
for line in md.splitlines():
if line.startswith("#"):
if buf:
parts.extend(_window("\n".join(buf), heading, size, overlap, index))
index = parts[-1].index + 1
buf = []
heading = line.lstrip("# ").strip() or heading
else:
buf.append(line)
if buf:
parts.extend(_window("\n".join(buf), heading, size, overlap, index))
return parts
def _window(text: str, heading: str, size: int, overlap: int, start: int) -> list[Chunk]:
out: list[Chunk] = []
i, idx = 0, start
while i < len(text):
piece = text[i : i + size]
out.append(Chunk(heading=heading, text=f"{heading}\n\n{piece}", index=idx))
i += max(size - overlap, 1)
idx += 1
return out
Başlığı parçanın içine tekrar yazıyorum. Embed, yalnız gövdeyi görünce 'kurulum' ile 'söküm'ü karıştırabiliyor. Örtüşme, kesilen cümlenin komşusunu taşır. Örtüşmeyi size kadar şişirmek de ayrı hata: aynı paragrafı üç kez retrieve ediyorsun, çeşit ölüyor.
Boyutu hissiyatla seçmemek
512 token ezberi, benim notlarımda uzun bir prosedürü ikiye bölüyor. 2000 token ise alakasız iki başlığı aynı vektöre tıkıyor. İkisini de üç soruyla deniyorum: bildiğim bir sayfa gelsin, komşu sayfa gelmesin, kesik cümle gelmesin. Bu üçü geçmeden indeks büyütmüyorum.
RAG'e geçmek bir olgunluk rozeti değil. Parça sınırı net değilse vektör store, pahalı bir grep. Seriyi burada kapatıyorum; sonraki yazılar serinin dışında, aynı sesle devam ediyor.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap