Ana içeriğe geç

Orta9 dk

RAG'e giriş

Önkoşul:Halüsinasyon: neden olur, nasıl azaltılır

Kanca

  1. derste gördük: bir model, bilmediği bir şey sorulduğunda bile %100 güvenle bir cevap ÜRETİR. Peki modele, cevabı UYDURMAK yerine, GERÇEKTEN bilinen bir kaynaktan BAKMASINI nasıl sağlarız?

Sezgi

RAG (Retrieval-Augmented Generation), üç adımlı bir tariftir: GETİR (sorguyla en İLGİLİ belgeyi bir bilgi tabanından bul), ZENGİNLEŞTİR (bu belgeyi promptun bağlamına EKLE), ÜRET (model, ARTIK elindeki bu bilgiye DAYANARAK cevap versin). Bu, 10. dersteki halüsinasyon sorununa doğrudan bir ÇÖZÜMdür.

Mekanizma

Küçük bir bilgi tabanı kurup, 5. kategorideki (NLP & LLM, 4. ders) AYNI TF-IDF fikrini bir GETİRME motoru olarak kullanalım:

GETİR: sorguya en benzer belgeyi bul

# 5. kategorideki (NLP & LLM, 4. ders) AYNI TF-IDF fikrini, ŞİMDİ bir "getirme"
# (retrieval) motoru olarak kullanıyoruz.
def tokenize(s):
    return s.lower().replace(".", "").replace(",", "").replace("'", "").split()

def tf(belge):
    kelimeler = tokenize(belge)
    sayac = Counter(kelimeler)
    toplam = len(kelimeler)
    return {k: v / toplam for k, v in sayac.items()}

def idf(belgeler):
    N = len(belgeler)
    kelime_belge_sayisi = Counter()
    for b in belgeler:
        for k in set(tokenize(b)):
            kelime_belge_sayisi[k] += 1
    return {k: math.log(N / v) for k, v in kelime_belge_sayisi.items()}

idf_degerleri = idf(BELGELER)
tum_kelimeler = sorted(set(k for b in BELGELER for k in tokenize(b)))

def tfidf_vektor(belge):
    tf_degerleri = tf(belge)
    return [tf_degerleri.get(k, 0) * idf_degerleri.get(k, 0) for k in tum_kelimeler]

def kosinus(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    na = math.sqrt(sum(x * x for x in a))
    nb = math.sqrt(sum(x * x for x in b))
    return dot / (na * nb + 1e-10)

belge_vektorleri = [tfidf_vektor(b) for b in BELGELER]

SORGU = "Academyou AI kaç dilde ders sunuyor?"
sorgu_vektor = tfidf_vektor(SORGU)

benzerlikler = sorted(
    [(i, kosinus(sorgu_vektor, bv)) for i, bv in enumerate(belge_vektorleri)],
    key=lambda x: -x[1],
)
print(f"Sorgu: \"{SORGU}\"\n")
print(f"{'Benzerlik':<12} Belge")
for i, s in benzerlikler:
    print(f"{s:<12.3f} {BELGELER[i]}")

en_ilgili_indeks = benzerlikler[0][0]
en_ilgili_belge = BELGELER[en_ilgili_indeks]
print(f"\nEN İLGİLİ belge (retrieval sonucu): \"{en_ilgili_belge}\"")
Sorgu: "Academyou AI kaç dilde ders sunuyor?"

Benzerlik    Belge
0.422        Academyou AI platformunda Türkçe dilinde 150'den fazla ders bulunur.
0.110        Academyou AI ücretsiz derslerini 2026 yılında yayınlamaya başladı.
0.105        Academyou AI, yapay zeka eğitimi sunan bir platformdur.
0.000        İade politikamıza göre, satın alınan ürünler 30 gün içinde iade edilebilir.
0.000        Müşteri destek ekibimize hafta içi 09.00-18.00 arasında ulaşabilirsiniz.
0.000        Şirketimiz 2023 yılında İstanbul'da kuruldu.

EN İLGİLİ belge (retrieval sonucu): "Academyou AI platformunda Türkçe dilinde 150'den fazla ders bulunur."

Matematik

Getirme: kosinüs benzerliği
benzerlik(q,d)=qdqd\text{benzerlik}(q, d) = \frac{q \cdot d}{\|q\| \, \|d\|}

Bu, 5. kategoride (NLP & LLM) TEKRAR TEKRAR kullandığımız AYNI kosinüs benzerliği formülüdür — burada qq sorgunun, dd ise bir belgenin TF-IDF vektörüdür. En YÜKSEK benzerlikli belge, “GETİRİLEN” (retrieved) belge olur.

Matematik tazelemeNokta çarpım: benzerliğin matematiği

Kod

Şimdi ZENGİNLEŞTİR ve ÜRET adımlarını görelim:

Zenginleştir: getirilen bilgiyi bağlama ekle

# AUGMENT: getirilen belgeyi, sorguyla BİRLİKTE bağlama EKLE.
NAIF_PROMPT = SORGU
RAG_PROMPT = (
    f'Aşağıdaki bilgiye dayanarak soruyu cevapla. Bilgi: "{en_ilgili_belge}" '
    f"Soru: {SORGU}"
)

print(f"\nNAİF prompt (10. dersteki gibi, modelin KENDİ hafızasına güvenmesi gerekir):")
print(f"  \"{NAIF_PROMPT}\"")
print(f"\nRAG prompt (GETİRİLEN belgeyle TEMELLENDİRİLMİŞ):")
print(f"  \"{RAG_PROMPT}\"")
print("\nNAİF promptta model, 10. dersteki 'AAAA' örneğindeki gibi, bilgisi OLMASA bile")
print("bir cevap UYDURABİLİR. RAG promptta İSE, cevap ZATEN bağlamda VAR -- model sadece")
print("bunu BULUP aktarmak zorunda, İCAT ETMEK değil.")

NAİF prompt (10. dersteki gibi, modelin KENDİ hafızasına güvenmesi gerekir):
  "Academyou AI kaç dilde ders sunuyor?"

RAG prompt (GETİRİLEN belgeyle TEMELLENDİRİLMİŞ):
  "Aşağıdaki bilgiye dayanarak soruyu cevapla. Bilgi: "Academyou AI platformunda Türkçe dilinde 150'den fazla ders bulunur." Soru: Academyou AI kaç dilde ders sunuyor?"

NAİF promptta model, 10. dersteki 'AAAA' örneğindeki gibi, bilgisi OLMASA bile
bir cevap UYDURABİLİR. RAG promptta İSE, cevap ZATEN bağlamda VAR -- model sadece
bunu BULUP aktarmak zorunda, İCAT ETMEK değil.

Peki bilgi tabanında OLMAYAN bir şey sorulursa?

İlgisiz bir sorguda benzerlik neredeyse sıfır

# RAG'in GÜVENİLİRLİĞİ, GETİRME (retrieval) adımının KALİTESİNE bağlıdır -- İLGİSİZ
# bir sorguyla ne olur?
ILGISIZ_SORGU = "Bugün hava nasıl?"
ilgisiz_vektor = tfidf_vektor(ILGISIZ_SORGU)
ilgisiz_benzerlikler = sorted(
    [(i, kosinus(ilgisiz_vektor, bv)) for i, bv in enumerate(belge_vektorleri)],
    key=lambda x: -x[1],
)
print(f"\nİLGİSİZ sorgu: \"{ILGISIZ_SORGU}\"")
print(f"En yüksek benzerlik: {ilgisiz_benzerlikler[0][1]:.3f} (\"{BELGELER[ilgisiz_benzerlikler[0][0]]}\")")
print("\nBilgi tabanında BU soruyla İLGİLİ HİÇBİR şey yok -- en yüksek benzerlik bile ÇOK")
print("DÜŞÜK. İYİ bir RAG sistemi, bu durumda 'ilgili bilgi bulunamadı' DEMELİDİR --")
print("düşük benzerlikli bir belgeyi ZORLA bağlama EKLEMEK, YANLIŞ yönlendirebilir.")

İLGİSİZ sorgu: "Bugün hava nasıl?"
En yüksek benzerlik: 0.000 ("Academyou AI, yapay zeka eğitimi sunan bir platformdur.")

Bilgi tabanında BU soruyla İLGİLİ HİÇBİR şey yok -- en yüksek benzerlik bile ÇOK
DÜŞÜK. İYİ bir RAG sistemi, bu durumda 'ilgili bilgi bulunamadı' DEMELİDİR --
düşük benzerlikli bir belgeyi ZORLA bağlama EKLEMEK, YANLIŞ yönlendirebilir.
6 belgenin sorguya göre kosinüs benzerliğini gösteren yatay çubuk grafik; en ilgili belge turuncu renkte, açıkça diğerlerinden yüksek.
En ilgili belge (turuncu), diğerlerinden AÇIKÇA yüksek bir benzerlik skoruna sahip -- bu netlik, RAG'in GÜVENİLİR çalışmasının ön koşuludur.

Nerede işe yarar

RAG, halüsinasyonu AZALTIR ama SIFIRLAMAZ — güvenilirliği GETİRME adımının kalitesine BAĞLIDIR:

  • “Garbage in, garbage out”: bilgi tabanı YANLIŞ veya GÜNCEL OLMAYAN bilgi içeriyorsa, RAG bu YANLIŞ bilgiyi de aynı güvenle AKTARIR.
  • Düşük benzerlikli sonuçlar İŞARET SAYILMALIDIR: bu dersteki İLGİSİZ sorgu örneğinde olduğu gibi, en yüksek benzerlik bile DÜŞÜKSE, sistem “ilgili bilgi bulunamadı” DEMELİDİR — zorla bir belge EKLEMEK yerine.
  • Gerçek sistemler TF-IDF yerine genelde YOĞUN (dense) embedding’ler kullanır (5. kategori, 5. ders) — bunlar EŞ ANLAMLI kelimeleri de (örn. “ücretsiz” ve “bedava”) YAKALAYABİLİR, TF-IDF’nin YAKALAYAMADIĞI bir esneklik sağlar.

Bu 2 hatayı yaparsın:

  1. RAG’in halüsinasyonu TAMAMEN ORTADAN KALDIRDIĞINI düşünmek — 10. dersteki matematiksel gerçek (softmax her zaman bir dağılım üretir) HÂLÂ geçerlidir; RAG sadece modele DAHA İYİ bir TEMEL sağlar.
  2. Düşük benzerlikli bir getirme sonucunu YİNE DE bağlama eklemek — bu, MODELİ yanlış bir yöne İTEBİLİR, hiç bağlam vermemekten bile KÖTÜ olabilir.

Kendini test et

1. RAG'deki üç adım (Getir, Zenginleştir, Üret) NE İŞE yarar?
  1. Modelin parametrelerini kalıcı olarak günceller
  2. Sorguyla en İLGİLİ belgeyi bir bilgi tabanından BULUR (Getir), bu belgeyi promptun bağlamına EKLER (Zenginleştir), model bu bağlama DAYANARAK cevap üretir (Üret) -- modelin kendi hafızasına güvenmesi yerine VERİLEN bir kaynağı kullanmasını sağlar (doğru cevap)
  3. Modeli daha hızlı çalıştırır
  4. Sadece görsel içerik için kullanılır

Neden: tfidf-getirme ve augment-ve-generate bloklarında bu üç adım AÇIKÇA sırayla uygulanıyor: TF-IDF ile en ilgili belge bulunuyor, sonra bu belge promptun İÇİNE ekleniyor.

2. Notebook'ta 'Bugün hava nasıl?' gibi İLGİSİZ bir sorguda en yüksek benzerlik bile 0.000 çıkıyor. İYİ bir RAG sistemi bu durumda NE YAPMALIDIR?
  1. En yüksek benzerlikli belgeyi yine de bağlama eklemeli
  2. 'İlgili bilgi bulunamadı' şeklinde bir sinyal vermeli -- düşük benzerlikli bir belgeyi ZORLA bağlama eklemek, modeli YANLIŞ bir yöne yönlendirebilir (doğru cevap)
  3. Hata vermeli ve çökmelidir
  4. Rastgele bir belge seçmelidir

Neden: getirme-kalitesinin-onemi bloğunda AÇIKÇA belirtildiği gibi, çok düşük bir benzerlik skoru, bilgi tabanında İLGİLİ hiçbir şey OLMADIĞININ işaretidir -- bu durumda bağlam EKLEMEMEK daha güvenlidir.

3. RAG, 10. dersteki halüsinasyon sorununu TAMAMEN mi çözer?
  1. Evet, RAG kullanan bir model asla halüsinasyon görmez
  2. Hayır -- 10. dersteki matematiksel gerçek (softmax her zaman bir dağılım üretir) HÂLÂ geçerlidir; RAG SADECE modele daha İYİ bir temel (bağlam) sağlayarak RİSKİ azaltır, tamamen ORTADAN KALDIRMAZ (doğru cevap)
  3. Evet, çünkü RAG modelin mimarisini değiştirir
  4. RAG halüsinasyonla hiç ilgili değildir

Neden: kullanım bölümünde AÇIKÇA belirtildiği gibi, RAG'in bilgi tabanı YANLIŞ veya belirsiz olduğunda, ya da getirme kalitesi düşük olduğunda, halüsinasyon RİSKİ hâlâ VARDIR.

Özet

Özet

  • RAG üç adımdan oluşur: Getir (en ilgili belgeyi bul), Zenginleştir (bağlama ekle), Üret (bu bağlama dayanarak cevap ver).
  • Getirme, kosinüs benzerliği (5. kategorideki AYNI formül) ile ölçülür -- bu dersteki örnekte doğru belge 0.422 benzerlikle bulundu.
  • İlgisiz bir sorguda benzerlik skorları ÇOK DÜŞÜK kalır -- bu, "ilgili bilgi yok" sinyali olarak KULLANILMALIDIR.
  • RAG, 10. dersteki halüsinasyon riskini AZALTIR ama TAMAMEN ORTADAN KALDIRMAZ.
  • Gerçek sistemler, TF-IDF yerine genelde YOĞUN embedding'ler (5. kategori, 5. ders) kullanır -- eş anlamlı kelimeleri de yakalayabilmek için.
Sonraki adım: Ajan mantığına giriş →