Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Agentic RAG ve GraphRAG: Klasik RAG Ne Zaman Yetmez?
Klasik RAG cevabı tek yerde duran soruların çoğunu çözer; multi-hop sorularda retrieval'ı tool yapan agent doğru kaynağı buldu ama 3 çağrı, 11 kat token ve 30 kat süre harcadı. GraphRAG'in ilk adımı küçük modelde parçalı entity'ler üretti; bütün corpus'u prompt'a koyan long context klasik RAG'le 7/10'da berabere kaldı.
RAG'i Ölçmek: Recall@k, MRR, nDCG, Faithfulness ve Groundedness
RAG'i ölçmek, retrieval'ı etiketli kaynakla (recall@k, MRR, nDCG) ve generation'ı yargıç bir LLM'le (groundedness, relevance) ayrı ayrı ölçmek demek. 30 soruda dört retrieval yöntemini C#'ta karşılaştırıyor, Microsoft.Extensions.AI.Evaluation'ın soruyu ıskalayan bir cevaba 5 verdiğini gösteriyor ve response cache'le 1 dk 42 sn'lik testi 1,1 sn'ye indiriyoruz.
RAG'de Yetki ve Güvenlik: Doküman Seviyesi Permission, Multi-tenant Filtre ve Indirect Prompt Injection
RAG'de yetki prompt'taki bir rica değil, retrieval sorgusunun WHERE cümlesidir: "bunu gösterme" denen gemma3:4b personel indirimini müşteriye söyledi. Tenant ve ACL'i token'dan alıp EF Core 10 isimli query filter'larıyla sorguya koyuyor, HNSW filtresinin 10 yerine 1 sonuç döndürmesini ve zehirli bir okur yorumunun kart numarası istemesini ölçüyoruz.
Prompt'a Context Koymak: Citation, Context Bütçesi ve Düşük Skorda "Bilmiyorum"
Chunk'ları kısa id'li bloklar halinde, token bütçesine sığdırıp prompt'a koymak, cevabı ve kaynak id'lerini structured output ile almak ve id'leri kodla doğrulamak citation'ı güvenilir kılar; ama geçerli citation doğru cevap demek değil. Türkçe skorlar üst üste bindiği için modelden önce "bilmiyorum" eşiği yalnız bariz durumları yakalıyor.
Reranking ve Query Transformation: Cross-encoder, Sorgu Yeniden Yazma ve HyDE
Geniş getir, dar ver: hybrid search'ün 10 adayını soru ve chunk'ı birlikte okuyan bir reranker'dan geçirmek, 30 soruda birinci sıradaki doğru chunk sayısını 15'ten 23'e çıkardı; bedeli soru başına 3,2 saniye. Sohbette soru yeniden yazma, multi-query, HyDE ve self-query'yi aynı setle ölçüp ne zaman zarar verdiklerini gösteriyoruz.
Hybrid Search ve Reciprocal Rank Fusion: Keyword ile Vector Aramayı Birleştirmek
Vector search ürün kodu, ISBN ve nadir terimleri kaçırır; PostgreSQL tsvector (turkish) ile keyword aramayı ekleyip iki listeyi skorla değil sırayla, Reciprocal Rank Fusion ile birleştirmek bu açığı kapatır. EF Core, tek SQL sorgusu ve VectorData HybridSearchAsync ile kuruyor, 30 soruda vector, keyword ve hybrid recall'unu ölçüyoruz.
EF Core ile Vector Search (2): PostgreSQL pgvector, HNSW Index ve Dapper
Pgvector.EntityFrameworkCore ile Vector property, HNSW index ve CosineDistance sıralaması birkaç satırda kurulur; asıl risk sessiz hatalarda: vector_l2_ops ile kurulan index cosine sorgusunda hiç kullanılmadı, ReloadTypes unutulunca Npgsql vektörü yazamadı. Yetki filtresiyle arama, EXPLAIN kontrolü, halfvec ile storage'ı yarıya indirmek (30 sorunun 30'unda aynı top-5) ve aynı sorgu Dapper ile.
EF Core ile Vector Search (1): SQL Server 2025 vector Tipi, VectorDistance ve EF Core 11 VectorSearch
EF Core 10'da SQL Server 2025 vector kolonu SqlVector<float> property ve HasColumnType("vector(768)") ile map edilir, arama EF.Functions.VectorDistance ile exact yapılır. Kodu derleyip EF Core'un ürettiği gerçek SQL'i inceliyoruz: projection'sız sorgunun vektörü de çektiğini, preview vector index ve VECTOR_SEARCH'ü ve EF Core 11'in getirdiklerini. SQL Server 2025 bu yazı için çalıştırılmadı.
Vector Database Seçimi: pgvector, SQL Server 2025, Qdrant, Azure AI Search ve Elasticsearch
Önce mevcut veritabanının vector desteğini dene; ANN index'ini de kendi verinde recall ölçerek ayarla. 100.000 vektörlük pgvector tablosunda exact arama 237 ms, HNSW 1 ms sürdü ama varsayılan ef_search ile recall 0.83 kaldı; filtreli sorguda index'e zorlanan HNSW sıfır satır döndürdü, iterative scan 10 satırı buldu. HNSW, IVFFlat, DiskANN, metric seçimi ve beş seçeneğin karşılaştırması.
Chunking Stratejileri: Token-based, Header-based, Semantic, Overlap ve Contextual Retrieval
Tek bir en iyi chunk size yok; stratejiyi recall ile context bütçesini birlikte ölçerek seç. Aynı 30 Türkçe soruda 64 token'lık pencereler doğru bölümü 19, başlık tabanlı chunk'lar 16 kez ilk sıraya koydu; 256 token recall@5'i 28'e çıkardı ama prompt'u 1.122 token'a büyüttü. Sabit boyut, overlap, semantic, parent-child ve gemma3:4b ile Contextual Retrieval'ı gerçek ölçümlerle karşılaştırıyoruz.
Doküman Ingestion: PDF, HTML ve Markdown'dan Temiz Metin, Metadata ve Artımlı Güncelleme
RAG'in kalitesi ingestion'da başlar: PDF'ten gelen "fi" ligature'ı Contains("fiyat") aramasını false yaptı, sayfa numarası bir bölümün ortasına girdi, HTML menüsü chunk'a karıştı. Temiz metin, chunk başına metadata, Microsoft.Extensions.DataIngestion (preview) ile pipeline ve kısmi başarı, içerik hash'iyle artımlı güncelleme ve silinen dokümanların index'ten çıkarılması.
Embedding Model Seçimi: Boyut, Çok Dillilik, Türkçe ve Maliyet
Embedding modelini leaderboard ortalamasına göre değil, kendi dilinde ve kendi soru setinde ölçerek seç: nomic-embed-text aynı içerikte İngilizcede 30 sorunun 26'sında, Türkçede yalnız 16'sında doğru bölümü ilk sıraya koydu. recall@k ve MRR ile ölçüyor; prefix, Matryoshka boyutu, storage, sessiz kesilme ve model değişiminde eski vektörlerin riskini gerçek çıktılarla inceliyoruz.