İçeriğe geç

RAG — Modele Doğru Belgeyi Göstermek

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Bağlam ve Görev Tarifi — Yazmadığın Her Karar Bir Tahmindir

30 saniyede özet

Bir dil modeli şirketinin güncel kurallarını bilmez; ona soruyla ilgili belgeleri bağlamında göstermek gerekir. Buna RAG denir. Cevap, bağlama giren belge kadar doğrudur: soruya en çok benzeyen belge eskimiş olabilir.

Açık kitap sınavındasın ve kütüphaneciden sorunun cevabını bulacağın kitabı getirmesini istiyorsun. Kütüphaneci soruya en çok benzeyen kitabı getiriyor. Ama o kitap geçen yılın baskısı ve içindeki bilgi artık geçerli değil.

  1. Bayt: Destek asistanına EFT kesim saatini sordum. 16:30 dedi ve kaynağını da gösterdi!

  2. Sen: Ama kural bu yıl değişti, artık 17:00.

  3. Bayt: Kaynak gösterdi ama yanlış... bu nasıl olur?

  4. Bayt: Belki hangi belgeyi gösterdiğimize bakmalıyız. Model ancak önüne konanı bilir.

Model neyi bilir, neyi bilmez?

Bir dil modeli eğitildiği tarihe kadar gördüğü metinleri bilir. Şirketinin güncel kurallarını, iç belgelerini ve dün değişen bir düzenlemeyi bilmez.

RAGRetrieval-augmented generation: soruyla ilgili belgeleri bulup modelin bağlamına koymak ve modelden onlara dayanarak cevap vermesini istemek.Sözlükte gör → (retrieval-augmented generation) bu boşluğu doldurur: soru geldiğinde önce ilgili belgeler bulunur, sonra soruyla birlikte modelin bağlamına konur. Model cevabı o belgelere dayanarak verir ve kaynağını gösterebilir.

Kafam karıştı, daha basit anlat

RAG, modele cevap vermeden önce doğru sayfayı açıp göstermektir.

Hızlı kontrolBaşlangıç

RAG ne yapar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Bir dil modeli şirketin geçen hafta değişen bir kuralını neden bilmez?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Benzer olan, geçerli olan değildir

Belgelerin arasında 2023'ten kalma eski bir kural var ve soruyla neredeyse aynı kelimeleri kullanıyor. Yalnızca en benzer belgeyi getirirsen hangisi gelir? Cevabı göster

Büyük ihtimalle eski kural. Arama, belgenin geçerli olup olmadığına değil, soruya ne kadar benzediğine bakar. Model de önüne konan eski kurala dayanarak kendinden emin bir cevap verir.

Cevap, masaya gelen sayfa kadar doğrudur.
Adım adım oku
  1. Kitap yok: hafızadan tahmin.
  2. En benzeyen kitap geldi, ama geçen yılın baskısı.
  3. Eski baskılar raftan inince doğru sayfa geldi.
  4. Cevap, masaya gelen sayfa kadar doğrudur.

Belgeler iki yolla aranabilir: sorudaki kelimelerle ya da anlamla. Anlam araması için metinler bir gömmeDoküman modelinde ilişkili veriyi ayrı bir koleksiyon yerine ana dokümanın içine koymak. Birlikte okunan ve sınırlı veri için tek okuma ve atomik yazma sağlar.Sözlükte gör →’e, yani anlamı temsil eden sayılara çevrilir; benzer anlamlı metinler birbirine yakın düşer.

İki yol da benzerliği ölçer, geçerliliği değil. Bu yüzden belgelere tarih ya da “geçerli mi” gibi bilgiler eklenir ve eskimiş olanlar aramaya hiç sokulmaz. Belge bulunamazsa model tahmin etmemeli; aksi hâlde bir hallucinationBir dil modelinin var olmayan bir API'yi, parametreyi ya da kaynağı kendinden emin bir dille üretmesi. Çıktı akıcı olduğu için fark etmek zordur.Sözlükte gör → çıkar.

Kafam karıştı, daha basit anlat

Arama benzerliği bulur, doğruluğu değil. Eski belgeleri baştan ayıkla.

Hızlı kontrolOrta

Anlam araması (embedding) neyi ölçer?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Soruya en çok benzeyen belge 2023'ten kalma eski bir kural. Ne yapılmalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Modele hangi belgeyi gösteriyoruz?

Tohum 242800

Soru: EFT için kesim saati kaç?

Oynat ya da adımla: önce belgeler getirilir, sonra model cevap verir.

Hız
Adım 0

Şu an ne oldu?

Soru: EFT için kesim saati kaç?

Kelime araması, en iyi 1.

Görevler0/3

  • Kaynak gösteren ama yanlış bir cevap alaçık

    İpucu

    Varsayılan ayarlar yeter.

  • Bağlama çelişen iki belge sokaçık

    İpucu

    Daha çok belge getir.

  • Doğru, kaynaklı cevabı alaçık

    İpucu

    Eskiyi aramadan çıkar.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Kelime araması, en iyi 1 belge: 2023 kuralı geldi ve asistan kaynak göstererek “16:30” dedi.
  2. “Anlam araması” seç. Yine eski kural geldi: o da soruya en çok benzeyen belgeydi.
  3. “En iyi 3” seç. İki kural birden bağlama girdi; asistan hangisinin geçerli olduğunu bilemedi.
  4. “Yalnızca geçerli belgeler”i aç. Eski kural aramaya hiç girmedi; cevap “17:00”, kaynak belge 1.
  5. “Belge getirme”yi kapat. Asistan hafızasından tahmin etti ve kaynak gösteremedi.
Hızlı kontrolOrta

Asistan kaynak göstererek "16:30" dedi, ama geçerli kural 17:00. En olası sebep nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

En iyi üç belge getirildi ve eski ile yeni kural birlikte bağlama girdi. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Belgelere geçerlilik bilgisi eklememek. Tarih ve “geçerli mi” bilgisi olmayan bir belge deposunda eski ile yeni ayırt edilemez. Her belgeye bu bilgiyi ekle ve aramadan önce süz.

“Bilmiyorum” demesine izin vermemek. Bağlamda cevap yoksa model yine bir şey yazar. Talimatta açıkça söyle: kaynaklarda yoksa bilmediğini söylesin.

Her şeyi bağlama doldurmak. Fazla belge, çelişki ve gürültü demektir. Az ama doğru belge, çok ama karışık belgeden iyidir.

Kafam karıştı, daha basit anlat

Geçerliliği işaretle, “bilmiyorum”a izin ver, bağlamı doldurma.

Hızlı kontrolOrta

Bağlamda soruyu cevaplayan bir belge yok. Talimat ne demeli?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aşağıdaki örnek bir bankanın destek asistanından: belgeler geçerlilik tarihiyle saklanıyor, arama önce süzüyor, talimat kaynak dışına çıkmayı yasaklıyor.

Derinleş · Destek asistanı: geçerli belgelerle RAG 4 dosya · ~64 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/java/com/bank/assistant/ PolicyChunk.java Belge: her parça geçerlilik tarihleri ve kaynağıyla saklanıyor.

src/main/java/com/bank/assistant/PolicyChunk.java
/** One searchable piece of an internal document, with when it is valid. */
record PolicyChunk(String id, String text, float[] embedding, LocalDate validFrom, LocalDate validTo, String source) {
boolean validOn(LocalDate day) {
return !day.isBefore(validFrom) && (validTo == null || !day.isAfter(validTo));
}
}

src/main/java/com/bank/assistant/ PolicyRetriever.java Arama: önce bugün geçerli olanlar süzülüyor, sonra en benzer birkaç tanesi alınıyor.

src/main/java/com/bank/assistant/PolicyRetriever.java
@Component
class PolicyRetriever {
private static final int TOP_K = 3;
private final PolicyChunkRepository chunks;
private final Embedder embedder;
private final Clock clock;
PolicyRetriever(PolicyChunkRepository chunks, Embedder embedder, Clock clock) {
this.chunks = chunks;
this.embedder = embedder;
this.clock = clock;
}
List<PolicyChunk> relevantTo(String question) {
LocalDate today = LocalDate.now(clock);
float[] q = embedder.embed(question);
return chunks.findAll().stream()
.filter(c -> c.validOn(today)) // superseded rules never compete
.sorted(Comparator.comparingDouble((PolicyChunk c) -> Vectors.cosine(q, c.embedding())).reversed())
.limit(TOP_K)
.toList();
}
}

src/main/java/com/bank/assistant/ GroundedPrompt.java Talimat: model yalnızca verilen kaynaklara dayanacak, yoksa bilmediğini söyleyecek ve kaynak numarasını yazacak.

src/main/java/com/bank/assistant/GroundedPrompt.java
final class GroundedPrompt {
private GroundedPrompt() {}
static String build(String question, List<PolicyChunk> sources) {
StringBuilder prompt = new StringBuilder("""
Yalnızca aşağıdaki kaynaklara dayanarak cevap ver.
Cevap kaynaklarda yoksa "Bu bilgi elimdeki belgelerde yok." de.
Her cevabın sonunda kullandığın kaynağın numarasını yaz.
""");
for (int i = 0; i < sources.size(); i++) {
prompt.append("[").append(i + 1).append("] ").append(sources.get(i).text()).append('\n');
}
return prompt.append("\nSoru: ").append(question).toString();
}
}

src/test/java/com/bank/assistant/ PolicyRetrieverTest.java Test: eski kuralın bağlama hiç girmediği ayrı bir testle korunuyor.

src/test/java/com/bank/assistant/PolicyRetrieverTest.java
class PolicyRetrieverTest {
@Test
void neverPutsASupersededRuleInTheContext() {
var clock = Clock.fixed(Instant.parse("2025-10-01T09:00:00Z"), ZoneOffset.UTC);
var old = chunk("eft-2023", "EFT son saati 16:30", LocalDate.of(2023, 1, 1), LocalDate.of(2024, 12, 31));
var current = chunk("eft-2025", "EFT son saati 17:00", LocalDate.of(2025, 1, 1), null);
var retriever = new PolicyRetriever(() -> List.of(old, current), text -> new float[] {1f}, clock);
assertThat(retriever.relevantTo("EFT için kesim saati kaç?")).extracting(PolicyChunk::id).containsExactly("eft-2025");
}
private static PolicyChunk chunk(String id, String text, LocalDate from, LocalDate to) {
return new PolicyChunk(id, text, new float[] {1f}, from, to, "genelge");
}
}

Kendini sına

Şimşek turu1/4

Kaynak gösteren bir cevap her zaman doğrudur.

Soru 1/3İleri

Belge deposunda hiçbir belgede tarih ya da geçerlilik bilgisi yok. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Dil modeli şirketin güncel kurallarını bilmez. RAG, sorudan önce ilgili belgeleri bulup modelin bağlamına koyar ve modelden o belgelere dayanarak cevap vermesini ister.
  2. 2 Soruya en çok benzeyen belge en doğru belge olmayabilir. Eskimiş belgeleri aramaya hiç sokmamak, yanlış ama kendinden emin cevapları önler.
  3. 3 Daha çok belge her zaman daha iyi değildir. Çelişen iki belge aynı bağlama girerse model hangisinin geçerli olduğunu bilemez.
Sonraki kapı Model yüz harcamadan doksan dokuzunu güzelce sınıflandırdı. Yüzüncüsü bütün gece çalışan toplu işi neden durdurdu? Modelin Cevabını Uygulamada Kullanmak — Doğrulamadan Kaydetme · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı