AI Bahçesi

RAG ve fine-tuning mimarileri — vanilla RAG’den agentic RAG’e, ölçümüyle birlikte.

Beyaz tahta daha geniş bir ekran istiyor — notlar sırayla aşağıda.

şema

Yol haritası

Bu pano soldan sağa tek bir argüman olarak okunur: problem → en ucuz çözüm → ucuz kazanımlar → pahalı kazanımlar → ölçüm.

Rendering diagram…

Tek kural

Bir basamağa ancak altındakini ölçtükten sonra çık. Farklı bir chunk boyutunu hiç denemeden agentic RAG’e atlamak, en ucuz problemin üstüne en pahalı çözümü koymaktır.

Varsayılan sıra: Prompt → RAG → İleri RAG → Agentic → Fine-tune → Distill. Her adım, bir öncekinin ölçülmüş hali üzerine oturur.

#rag#roadmap
not

Neden RAG? Halüsinasyon

Bir modelin bildiği her şey eğitim verisinde donmuş durumda. Bu yüzden üç şeyi aynı anda yapamaz: güncel olmak, senin alanını bilmek, kaynak göstermek.

Rendering diagram…
Güncel değilbilgi eğitim anında donmuş
Alan dışısenin dokümanlarını hiç görmedi
Kaynak yoknereden geldiğini söyleyemez
Yine de eminton hiç değişmez

RAG tek cümleyle: modelin bilmediğini, cevap vermeden önce önüne koy. Retrieval-augmented generation — önce getir, sonra üret.

Fine-tuning de bir cevap, ama ilk cevap değil: her yeni olgu yeniden etiketleme, temizleme ve GPU zamanı demek. Küçük bir corpus için bu fazla.

#rag#hallucination
şema

RAG mi, fine-tune mı?

En kısa ayrım: RAG bilgi için, fine-tuning biçim için. Her hafta değişen olguları ağırlıklara gömmek, her hafta yeniden eğitmek demek.

RAGFine-tune
Bilgi nerede yaşarmodelin dışındaağırlıklarda
Güncellemekkolay — yeniden indexlezor — yeniden eğit
Inference maliyetiyüksek, context doludüşük, prompt kısa
Context limitivar, window kadaryok
Kaynak göstermekdoğalimkânsız
İyi olduğu yerolgular, taze veriton, şema, davranış
Rendering diagram…
#rag#fine-tuning#decision
şema

Vanilla RAG pipeline’ı

Vanilla RAG iki ayrı pipeline’dır ve ikisini karıştırmamak işin yarısıdır: biri offline çalışıp index’i kurar, öteki her istekte çalışır.

Rendering diagram…
iki hat, iki sözleşme
Kaynakdokümanlar, ticket’lar
Chunkböl + overlap
Embedvektör
Storeindex
Sorgu
Retrievetop-k
Promptcontext + soru
Cevapkaynaklarıyla

Vanilla’da olmayan her şey

Router yok, çok adımlı planlama yok, geri bildirim yok. Model bir kez getirir, bir kez cevaplar. Asıl iş retrieval ile generation arasındaki sözleşmeyi kurmak: modele ne veriyorsun, karşılığında ne bekliyorsun.

#rag#pipeline
snippet

Referans baseline stack

Referans baseline — çalışan, sade, bilerek numarasız bırakılmış bir vanilla RAG servisi. Her ölçümün kıyaslandığı sıfır noktası bu.

API & orkestrasyonTypeScript + Express
RAG entegrasyonuLangChain
Vector storeChroma, lokal
Embedding & generationOllama, temperature 0
KonfigürasyonZod + YAML
tek process, üç bağımlılık
tek Node process’iHTTPq, k (Zod)similaritySearchembed · chatClientcurl · eval harnessExpressPOST /rag/queryLangChainretrieval zinciriChromavector store · lokalOllamaembed + chat · t=0Backend2Veritabanı1Dış1Model1

İki hat

hat 1 — offline index kurulumu
JSON oku
FiltrelepdfText
TextSplitter
Metadata
Chroma’ya yaz
hat 2 — POST /rag/query
Zod ile doğrula
similaritySearchq, k
Chunk’ları biçimlendir
ChatOllama
JSON yanıt

temperature = 0 tesadüf değil: eval sırasında cevaptaki varyans sampling’den değil, retrieval kalitesinden gelmeli.

#langchain#chroma#ollama
not

Naif RAG nerede bozulur

Naif RAG bozulduğunda dışarıdan model hatası gibi görünür. Neredeyse her zaman bir retrieval hatasıdır.

Düşük precisiongetirilen her chunk alakalı değil
Düşük recallalakalı her chunk getirilmiyor
Bayat veriindex kaynaktan uzaklaştı
Tek atışkötü bir retrieval’ı düzeltme şansı yok

İki ayrı hastalık

  • Düşük precision context’i gürültüyle doldurur. Model doğru chunk’ı görüp yine de ortada kaybedebilir — lost in the middle. Cevap yakın ama yanlış çıkar.
  • Düşük recall, modelin sentezleyeceği malzemeyi hiç görmemesi demek. Cevap ya eksik ya uydurma olur.

Daha fazla token getirmek daha iyi performans demek değil. top-k’yı artırmak genellikle precision’a mal olur ve cevabı kötüleştirir.

#rag#retrieval#failure
not

Chunking: sınır > boyut

Chunk boyutunu ayarlamak ölçülebilir en ucuz kazanım — ama asıl önemli olan boyut değil, sınır. Bir fikrin tam ortasından kesilmiş 512 token’lık bir chunk, temiz bir 1024’ten daha kötüdür.

ChunkKazançKayıp
Küçük (128–256)yüksek precisioncontext kopuyor
Orta (512–1024)çoğu corpus için denge noktası
Büyük (2000+)context bütünbulanık embedding, gürültü

Bu sırayla dene

  1. Sabit token sayısına göre değil, başlıklara göre böl. Başlık zincirini her chunk’a taşı.
  2. %10–15 overlap. Sınıra denk gelen cümleyi iki tarafta da tut.
  3. Contextual retrieval. Her parçanın önüne — ucuz bir modele ürettirdiğin — hangi dokümanın neresinde durduğunu söyleyen 50–100 token’lık bir satır ekle, sonra onu embed et.

Tek bir global chunking stratejisi yok. Bir sözleşme, bir tablo ve bir sohbet kaydı aynı splitter’dan sağ çıkmaz — asıl iş, ingest sırasında doküman tipini sınıflandırmak.

#chunking#ingest
şema

Metadata filtreleme

Metadata, her chunk’a enjekte edebileceğin context’tir: yıl, doküman başlığı, sayfa, bölüm, sahip. Ham semantik arama bunları birbirine karıştırır — sonuç düşük precision.

Rendering diagram…

Sorunun içindeki 2021 bir anlam değil, bir filtre. Vektör benzerliği 2020 ve 2021 dokümanlarını neredeyse aynı görür.

Rendering diagram…

Ne saklamalı

Yapısalyıl, sayfa, bölüm, doküman tipi
Türetilmişchunk özeti, komşuların özeti
Ters HyDEbu chunk hangi soruları cevaplıyor
#metadata#precision
not

Hybrid search ve reranking

Dense vektörler anlamı yakalar ve birebir eşleşmeleri kaçırır: hata kodları, SKU’lar, kişi adları, sürüm numaraları. BM25 tam da bunlarda iyidir.

getir → birleştir → sırala → kes
Densetop-50
BM25top-50
RRFbirleştir
Rerankcross-encoder
Top-5

Neden bu sıra

  • Geniş getir, dar ver. top-50 çekip top-5’e kesmek, ham bir top-20’yi context’e boca etmekten hem daha ucuz hem daha iyi.
  • RRF iki listeyi skorlarını normalize etmeye hiç kalkışmadan birleştirir; onun yerine sıraları toplar.
  • Cross-encoder soruyla chunk’ı birlikte okur. Bi-encoder’ın kaçırdığı ilişkiyi yakalar — latency pahasına; o yüzden en sona ve az sayıda aday üzerine gelir.

Cevapta chunk id’leri iste. Hiçbir şeye atıf yapmayan bir RAG sistemi halüsinasyonu ortadan kaldırmaz — sadece görünmez yapar.

#bm25#rerank#hybrid
açık soru

Chunk mı, parent mı, özet mi?

Benim için hâlâ çözülmemiş: retrieval biriminin embedding birimine göre nerede durması gerektiği.

Chunk’ı embed etucuz, context kaybediyor
Özeti embed etdaha iyi recall, daha çok depolama

Etrafında dönüp durduğum seçenekler:

  1. Chunk’ı embed et, chunk’ı döndür. Basit ve herkesin başladığı yer. Anlamın bölümler arasına yayıldığı dokümanlarda kırılıyor.
  2. Chunk’ı embed et, parent’ı döndür. Küçük vektörler, geniş context. Context bütçesini hızla yiyor.
  3. Üretilmiş bir özeti embed et, orijinali döndür. Retrieval kalitesi artıyor; artık ingest pipeline’ında kaynaktan sapabilecek bir generation adımının sahibisin.

Şüphem şu: doğru cevap doküman tipine bağlı; yani asıl iş tek bir global stratejiyi ayarlamak değil, ingest sırasında dokümanları sınıflandırmak.

#rag#embeddings
şema

Small-to-big retrieval

Sezgi: büyük bir metin bloğunu embed etmek kötü fikir. Vektör bulanıklaşır ve sorunun sorduğu o tek cümle gürültüde boğulur.

Çözüm: küçük şeyi embed et, büyük şeyi cevaba ver.

üç varyant
Cümleyi embed et
Eşleştir
Pencereyi genişlet k=2
Geniş context LLM’e
Child chunk’ı embed et
Eşleştir
Parent chunk’ı getir
Parent’tan sentezle
Özeti/metadata’yı embed et
Eşleştir
Orijinali getir
Orijinalden sentezle

Ölçülmüş fark

Retrieverhit rateMRR
Base (düz chunk)0.7960.605
Chunk references0.8920.740
Metadata references0.9160.747

Kaynak: LlamaIndex advanced-retrieval benchmark’ları. Mutlak sayılar corpus’a göre değişir; sıralama genellikle korunur.

#retrieval#llamaindex
not

Sorgu dönüşümleri

Kullanıcının yazdığı cümle, arama için yazılmış bir cümle değil. Retrieval’dan önce sorguya dokunmak, index’e dokunmadan elde edilebilecek en büyük kazanım.

Rewritekonuşmayı çöz: "peki ya şu?"
HyDEvarsayımsal bir cevap üret, onu embed et
Multi-queryüç farklı ifadeyle ara, sonuçları birleştir
Decompositionmulti-hop soruyu alt sorulara böl
Routinghangi kaynak: vektörler, SQL, web
Rendering diagram…

Her transform bir LLM çağrısı daha — latency artı token. Önce ölç: sorgularının kaçı gerçekten belirsiz? Çoğu tek atışsa, bunu bir router’ın arkasına koy.

#hyde#query-rewriting
şema

Retrieval döngüsünü kapat

Vanilla RAG tek atış: yanlış şeyi getirdiyse toparlayamaz. Kaliteyi gerçekten yükselten şey, retrieval’ı kapalı bir döngüye çevirmek.

Rendering diagram…

Döngüyü kapatan üç kontrol

  • Relevance kontrolü. Getirilen chunk’lar soruyla ilgili mi? Değilse üretmeden önce tekrar ara. Corrective RAG’in çekirdeği bu.
  • Groundedness kontrolü. Cevaptaki her iddia gösterilen context’te var mı? Yoksa daralt ya da "bilmiyorum" de.
  • Bir durma koşulu. En fazla N tur. Yoksa döngü sonsuza kadar döner ve sen bunu ay sonunda öğrenirsin.
#crag#retrieval#loop
şema

Agentic RAG döngüsü

Agentic RAG sabit bir "getir ve üret" pipeline’ı değil; modelin kendi arama sürecini yürüttüğü bir orchestrator.

Rendering diagram…

Geleneksel RAG’den farkı

Geleneksel (reaktif)Agentic (proaktif)
Akıştek yönlü, deterministikdöngüsel, dinamik
Arama sayısıbirgerektiği kadar
Veri kalitesihiç sorgulanmazdeğerlendirilir
Eksik bilgifark edilmezyeni bir strateji tetikler

Sağlam bir orta sütun olmadan çalışmaz. Metadata, hybrid search ve reranking yoksa agentic katman kötü retrieval’ı yalnızca pahalı hale getirir.

#agentic#rag
şema

Agentic tasarım pattern’leri

Agentic RAG tek bir mimari değil, bir pattern ailesi. Hepsini birden kurma — hangi hatayı düzelttiğini bilerek teker teker ekle.

Routerniyeti oku, doğru kaynağa yolla
Adaptivezorluğu puanla: kolay → LLM, zor → agent
Corrective (CRAG)kötü retrieval → web’de ara ya da yeniden yaz
Self-RAGretrieval yapılıp yapılmayacağına model karar verir
Multi-agentplanner, researcher, synthesiser, validator
Rendering diagram…

Hangi derde hangisi

  • Sorular farklı kaynaklara gidiyor → Router.
  • Soruların çoğu kolay, birkaçı zor → Adaptive (agentic kalitenin bedelini yalnızca zor olanlarda ödersin).
  • Retrieval bazen boş dönüyor → Corrective.
  • Cevaplar birkaç dokümanın birleştirilmesini gerektiriyor → Multi-agent.
#router#crag#multi-agent
not

Vanilla vs agentic: bedeli

Agentic RAG doğrulukta kazanır; bedelini latency, token ve hata yüzeyinde gerçek mühendislik emeğiyle öder. Karar, tam olarak bu takas.

BoyutVanilla RAGAgentic RAG
Latencydüşük, ~1–2 snyüksek ve değişken
Token maliyetidüşük, tek sorguyüksek, geçmiş her turda yeniden okunur
Karmaşıklıkbasit bir pipelinestate yönetimi + tool bağlantıları
Zor görevlerde doğrulukdüşük, context kırılıryüksek, çapraz sentez
Hata yüzeyidar: ara ve üretgeniş: planlama, tool’lar, döngüler
Vanilla — tipik istek1 LLM çağrısı
Agentic — tipik istek6 LLM çağrısı

Doğruluk kazancını ölçemiyorsan, ödediğin latency ve token gerçek, kazanç ise bir varsayım.

#cost#latency
şema

Agent bir döngüdür

Agent, durma koşulu olan bir döngüdür. Mühendisliğin çoğu o durma koşulunda yaşar.

Rendering diagram…

Döngüler nerede bozulur

Bütçe yokfatura fark edene kadar çalışır
Sessiz hatatool hataları yutulur, agent tahmin eder
Tool çorbası40 tool, hiçbiri düzgün tarif edilmemiş
Hata hafızası yokaynı çağrıyı sonsuza kadar tekrar dener

Onun yerine ne vermeli

  • Sert bir adım bütçesi ve bir token bütçesi; ikisi de modele görünür olsun.
  • Tool hataları, modelin okuyup üzerine aksiyon alabileceği metin olarak dönsün; asla gizlenmesin.
  • Daha az ama daha geniş tool’lar; ne zaman kullanılmayacağını dürüstçe anlatan açıklamalarla.
  • Yazabileceği bir scratchpad, ki N+1. adım N. adımın öğrendiğini görebilsin.
#agents#tools
not

Context bir bütçedir

Büyük bir context window kova değil, bütçedir. İçine koyduğun her şey modelin dikkati ve senin latency hedefin için yarışır.

System prompt + tool’lar4,000 tok
Getirilen chunk’lar12,000 tok
Konuşma geçmişi9,000 tok
Cevap için pay7,000 tok

Hep döndüğüm kurallar

  • Kararlı kısmı başa koy — system prompt, tool tanımları, uzun referans dokümanlar. Prompt caching’in yeniden kullanabildiği şey kararlı prefix’ler.
  • Değişken kısmı sona koy — kullanıcının turu, yeni getirilen chunk’lar. Üst taraftaki tek bir düzenleme, sonrasındaki her şey için cache’i geçersiz kılar.
  • Geçmişi her turda değil, bir eşikte özetle. Her tur kendini yeniden yazan yuvarlanan özetler cache’i yok eder ve sapar.

Kırpmadan önce ölç. "Context çok büyük" problemlerinin yarısı aslında sayfalanmamış bir JSON yığını döndüren tek bir tool.

#context#caching#cost
şema

Ne zaman fine-tune

Fine-tuning olgular için değil, biçim için. Her hafta değişen bilgiyi ağırlıklara yakmak, her değişiklikte yeniden eğitmek demek.

Rendering diagram…

İki meşru iş

  1. Distillation. Güçlü bir modelin davranışını küçük, ucuz, hızlı bir modele taşı. Kazandığın şey maliyet ve latency.
  2. Kalıntıyı sabitlemek. Prompt’un tutamadığı ton, çıktı şeması ve ret kalıpları. Hiç %100’e ulaşmayan uzun kuyruk.

Sırayı bozma: Prompt → RAG → Fine-tune → Distill. RAG’i ölçmeden fine-tune’a uzanmak, problemi bilmeden GPU kiralamaktır.

#fine-tuning#decision
not

Fine-tuning yöntemleri

Sıfırdan eğitmek neredeyse hiçbir ürün ekibinin işi değil. Pratikte seçim, hangi parameter-efficient yöntem olduğu.

YöntemNe yaparNe zaman
Full SFTher ağırlığı güncellernadiren — pahalı, unutkan
LoRAdonmuş model üstüne low-rank adaptervarsayılan başlangıç noktası
QLoRA4-bit base üstüne LoRAtek GPU’ya sığdırmak için
DPOtercih çiftleri üzerinden hizalariyi/kötü cevap çiftlerin varsa
GRPObir reward fonksiyonuna karşı RLdoğruluk programatik olarak kontrol edilebiliyorsa
Distillationbüyük modeli küçüğe kopyalarmaliyet ve latency baskısı
pratik yol
Derle200-500 örnek
QLoRA SFT
DPOçiftlerin varsa
Evalyayına almadan önce

Adapter, retrieval’ın yerini tutmaz. Fine-tune edilmiş model hiç görmediği dokümanı yine uydurur — sadece daha güzel bir formatta.

#lora#qlora#dpo
deney

Embedding’i fine-tune etmek

Retrieval’ı iyileştirmenin en az konuşulan yolu: modeli değil, embedding’i fine-tune etmek. Alan jargonuyla dolu bir corpus’ta bu, olabilecek en ucuz kazanım.

etiketsiz veriden bir eğitim seti
Ham chunk
LLM’e sorbu hangi soruyu cevaplıyor
(soru, chunk) çifti
Embedding’i eğit

Genel amaçlı bir embedding modeli şirketinin kısaltmalarını, parça numaralarını ya da iç kelime dağarcığını hiç görmedi. Sentetik soru üretimi bu açığı tek bir elle yazılmış etiket olmadan kapatır.

Neden işe yarıyor

  • Eğitim çiftleri herkese açık bir benchmark’tan değil, senin corpus’undan geliyor.
  • Retriever’ı iyileştirmek pipeline’daki her sorguyu iyileştirir — bir prompt değişikliğinin aksine, birikir.
  • Aynı sentetik set, retrieval eval’leri için ground truth olarak yeniden kullanılabilir.
#embeddings#synthetic-data
deney

Retrieval eval, izole

RAG’i uçtan uca ölçmeden önce izole ölç: verili bir soru için getirilen chunk’lar doğru olanlar mıydı? Cevap kalitesi bu cevaba bağlı.

Rendering diagram…

Veri seti

Girdi bir soru, çıktı onu cevaplayan ground-truth doküman id’leri. Elle 20 tane yaz, sonra chunk’lardan sentetik sorular üreterek büyüt.

MetrikNe söylüyor
Hit ratedoğru chunk top-k içinde hiç var mı
recall@kalakalı chunk’ların kaçı geri geldi
MRRilk doğru sonuç ne kadar üstte
NDCGsıra da doğru mu — reranking’in metriği

Benchmark olmadan RAG yapmak, hangi değişikliğin neyi iyileştirdiğini bilmeden düğme çevirmektir.

#eval#mrr#ndcg
deney

Uçtan uca eval

İzole eval’ler retrieval’ı denetler; uçtan uca eval’ler kullanıcının gördüğü cevabı denetler. İkisi de gerekli, hiçbiri diğerinin yerine geçmez.

e2e harness
Soru
RAG pipeline
Cevap + context
Değerlendirici
MetrikSorduğu soru
Faithfulnessher iddia gösterilen context’te var mı
Answer relevancycevap soruyu karşılıyor mu
Context precisiongetirilen context’in ne kadarı gerekliydi
Context recallgereken context’in ne kadarı geldi

İki mod

  • Etiketsiz. Referans cevap yok: faithfulness, relevancy, ton, toksisite. Her commit’te çalıştıracak kadar ucuz.
  • Etiketli. Ground-truth cevaplar var: doğruluk, kapsam. Yazması pahalı, regresyonları en keskin yakalayan da bu.
#eval#faithfulness#ragas
deney

Prompt’tan önce eval

Eval’siz prompt ayarlamak, üstüne birkaç adım eklenmiş vibe’dan ibaret. Eval’in sofistike olması gerekmiyor; prompt değişmeden önce var olması gerekiyor.

işe yarayan en küçük harness
20 vakagerçek girdiler
Çalıştırsabit seed
Puanlarubrik ya da assert
Diffson çalıştırmaya göre

Başlangıç seti

TürAdetNe yakalar
Golden10happy path’teki regresyonlar
Adversarial5prompt injection, ret tuzağı
Sıkıcı5boş girdi, devasa girdi, yanlış dil

Modelle puanlamak

Cevap gerçekten açık uçluysa kullan, ve o zaman:

  • Her seferinde tek boyut puanla. Tek bir "bu iyi mi" skoru gürültüdür.
  • Judge’a rubriği ve bir referans cevabı ver.
  • Bir örneklem üzerinde judge/insan uyumunu takip et. Hiç denetlemediğin bir judge, görgülü bir rastgele sayı üretecidir.