İbrahim Bilgiç

RAG ile kendi verinle konuşmak

Kısaca

  1. RAG’in dört adımını (parçala, göm, ara, üret) kurmak
  2. Parça boyutu ve k gibi ayarların etkisini görmek
  3. Aramayı ve cevabı ayrı ayrı değerlendirmek

İlk adım: aşağıdaki Benzerlik ve arama deneyini bul ve içindeki görevi çöz. Okumadan önce kurcalamak, okuduğunu çok daha kolay anlamanı sağlar.

Model şirketinin iç belgelerini, senin notlarını ya da dünkü haberleri bilmez. Bunları modele yeniden eğiterek öğretmek (ince ayar) pahalı ve çoğu zaman gereksiz. Daha basit bir yol var: Soruyla ilgili belgeleri bul ve soruyla birlikte modele ver. Buna RAG denir (Retrieval-Augmented Generation, yani “bulup getirerek üretmek”).

Dört adım

  1. Parçala (chunk): Belgeleri birkaç yüz kelimelik parçalara böl. Parça çok büyükse içine alakasız bilgi karışır. Çok küçükse cümleler bağlamından kopar.
  2. Göm (embed): Her parçayı bir gömme modeliyle vektöre çevir ve sakla.
  3. Ara (retrieve): Soruyu da vektöre çevir, kosinüs benzerliği en yüksek k parçayı getir.
  4. Üret (generate): Bu parçaları istemin içine koy ve modelden yalnızca bu kaynaklara dayanarak cevap vermesini iste.

Aşağıdaki lab, üçüncü adımı küçük ölçekte gösteriyor. Kırmızı çerçeveli satırlar modele gidecek bağlam. Soruyu değiştir, belgeleri değiştir, k’yi oynat.

Lab · Benzerlik ve aramacos(q, d) = q·d / ‖q‖‖d‖
  1. 0.231Aşırı öğrenme, modelin eğitim verisini ezberleyip yeni veride kötüleşmesidir.
  2. 0.102Transformer modelleri dikkat mekanizmasıyla her token'ın diğerlerine ne kadar bakacağını hesaplar.
  3. 0.081Tokenizer metni modelin anlayacağı sayısal parçalara böler.
  4. 0.070Gradyan iniş, kaybı azaltmak için parametreleri eğimin tersi yönünde günceller.
  5. 0.057RAG, soruya en benzeyen belgeleri bulup modele bağlam olarak verir.
  6. 0.023Mangala, Türk kurallarıyla oynanan iki kişilik bir akıl oyunudur.

Kırmızı çerçeveli satırlar, bir RAG sisteminde modele “bağlam” olarak verilecek belgeler. Burada vektörler karakter üçlülerinden (TF-IDF) üretiliyor, yani yazım benzerliğine bakıyor. Gerçek gömme (embedding) modelleri anlama bakar: “ezber” ile “aşırı öğrenme”yi ortak harf olmasa da yakın bulur. Bu farkı görmek için soruyu eş anlamlılarla yeniden yaz.

Lab’deki vektörler harf üçlülerinden üretiliyor, yani yazıma bakıyor. “Ezber” diye sorup “aşırı öğrenme” belgesini bulmak için anlamsal bir gömme modeli gerekir. Bir sonraki koddaki gibi.

Çalışan bir RAG

uv add sentence-transformers numpy anthropic
import numpy as np
from sentence_transformers import SentenceTransformer
import anthropic

# 1. Parçalar: gerçek hayatta bunlar belgelerinden otomatik bölünür
parcalar = [
    "Aşırı öğrenme, modelin eğitim verisini ezberleyip yeni veride kötüleşmesidir.",
    "Gradyan iniş, kaybı azaltmak için parametreleri eğimin tersi yönünde günceller.",
    "Erken durdurma, doğrulama kaybı yükselmeye başlayınca eğitimi keser.",
    "Tokenizer metni modelin anlayacağı parçalara böler.",
]

# 2. Göm: çok dilli bir gömme modeli Türkçede iyi çalışır
gomucu = SentenceTransformer("intfloat/multilingual-e5-small")
P = gomucu.encode([f"passage: {p}" for p in parcalar], normalize_embeddings=True)

def ara(soru, k=2):
    q = gomucu.encode([f"query: {soru}"], normalize_embeddings=True)[0]
    skor = P @ q                      # normalize edildiği için nokta çarpımı = kosinüs
    sira = np.argsort(-skor)[:k]
    return [(parcalar[i], float(skor[i])) for i in sira]

soru = "Model ezber yapmaya başlarsa ne yapmalıyım?"
bulunanlar = ara(soru)
for p, s in bulunanlar:
    print(f"{s:.3f}  {p}")

# 4. Üret
baglam = "\n".join(f"[{i+1}] {p}" for i, (p, _) in enumerate(bulunanlar))
yanit = anthropic.Anthropic().messages.create(
    model="claude-sonnet-5-5",
    max_tokens=400,
    system=(
        "Yalnızca verilen kaynaklara dayanarak cevap ver ve kullandığın kaynağı [1] gibi belirt. "
        "Kaynaklarda cevap yoksa 'Bu konuda kaynağım yok' de."
    ),
    messages=[{"role": "user", "content": f"Kaynaklar:\n{baglam}\n\nSoru: {soru}"}],
)
print(yanit.content[0].text)

Sistem komutundaki iki kural RAG’in özüdür: kaynak göster ve bilmiyorsan söyle.

RAG’i ölçmek

RAG iki ayrı yerde bozulabilir, bu yüzden iki ayrı şey ölçersin:

Ne Soru Nasıl
Arama Doğru parça ilk k içinde mi? Her soru için doğru parçayı elle işaretle, “k’de isabet” oranını hesapla
Cevap Cevap kaynaklara sadık ve doğru mu? Cevapları elle ya da dikkatle kurulmuş bir model değerlendiricisiyle puanla

Cevap kötüyse önce aramaya bak. Yanlış belge geldiyse en iyi model bile doğru cevabı veremez. Çoğu RAG sorunu, model değil arama sorunudur.

İyileştirme sırası

  1. Parça boyutunu ve örtüşmesini ayarla.
  2. Daha iyi (çok dilli) bir gömme modeli dene.
  3. Kelime eşleştiren klasik aramayı anlam arayan vektör aramasıyla birleştir. Buna hibrit arama denir.
  4. İlk 20 sonucu ikinci bir modelle yeniden sırala ve en iyi 3’ünü modele ver. Bu ikinci modele yeniden sıralayıcı (reranker) denir.

Kendini dene

Quiz · Kendini dene0/3
  1. 1. RAG sistemin yanlış cevap veriyor. İlk neye bakmalısın?

  2. 2. Gömmeleri normalize ettiysen nokta çarpımı neye eşittir?

  3. 3. Sistem komutuna "kaynakta yoksa bilmiyorum de" eklemenin amacı ne?

Daha derine inmek istersen

bitti