📑 İçindekiler
- 1. RAG Nedir?
- 2. Neden RAG Kullanmalıyız?
- 3. RAG Mimari Bileşenleri
- 4. Embedding Modelleri
- 5. Vektör Veritabanları
- 6. Chunking Stratejileri
- 7. Retrieval Yöntemleri
- 8. Re-ranking Teknikleri
- 9. Hibrit Arama
- 10. Değerlendirme Metrikleri
- 11. İleri RAG Teknikleri
- 12. Uygulama Örneği
- 13. Sıkça Sorulan Sorular
Büyük dil modelleri (LLM'ler) son yıllarda inanılmaz bir gelişim gösterdi. Ancak bu modellerin en büyük zayıf noktalarından biri, eğitim verilerinin belirli bir tarihe kadar sınırlı olması ve hallüsinasyon üretme eğilimleridir. RAG (Retrieval-Augmented Generation) mimarisi, bu sorunlara çözüm sunan devrim niteliğinde bir yaklaşımdır. Bu kapsamlı rehberde RAG'ın tüm yönlerini derinlemesine inceleyeceğiz.
1. RAG Nedir?
RAG (Retrieval-Augmented Generation), bir büyük dil modelinin (LLM) yanıt üretmeden önce harici bilgi kaynaklarından ilgili verileri alarak (retrieve) bu bilgileri bağlam olarak kullanmasını sağlayan bir mimari kalıptır. Bu yaklaşım, 2020 yılında Facebook AI Research (şimdiki Meta AI) tarafından yayınlanan bir araştırma makalesinde tanıtılmıştır.
Geleneksel LLM yaklaşımında model, yalnızca eğitim sırasında öğrendiği bilgilere dayanarak yanıt üretir. RAG ise bu sürece bir "bilgi alma" (retrieval) adımı ekleyerek modelin dış kaynaklardan güncel ve doğru bilgilere erişmesini sağlar.
💡 Temel Kavram
RAG = Retrieval (Bilgi Alma) + Augmented (Zenginleştirilmiş) + Generation (Üretim). Model, harici bilgi tabanından ilgili dokümanları çeker ve bu bilgileri kullanarak daha doğru, güncel ve kaynak gösterilebilir yanıtlar üretir.
RAG'ın Temel İş Akışı
RAG mimarisi üç temel aşamadan oluşur:
- Indexleme (Ingestion): Dokümanlar parçalara ayrılır, embedding vektörlerine dönüştürülür ve vektör veritabanına kaydedilir.
- Bilgi Alma (Retrieval): Kullanıcı sorgusu embedding vektörüne dönüştürülür ve vektör veritabanında benzerlik araması yapılır.
- Üretim (Generation): Alınan bilgiler bağlam olarak LLM'e verilir ve model bu bağlamı kullanarak yanıt üretir.
2. Neden RAG Kullanmalıyız?
RAG mimarisinin tercih edilmesinin birçok kritik nedeni vardır:
RAG, fine-tuning'e kıyasla çok daha düşük maliyetli ve esnek bir çözümdür. Bilgi tabanınızı güncellemek, modeli yeniden eğitmekten çok daha hızlı ve ucuzdur. Ayrıca RAG, modelin yanıtlarını doğrulanabilir kaynaklara dayandırarak güvenilirliği önemli ölçüde artırır.
3. RAG Mimari Bileşenleri
Bir RAG sistemi çeşitli bileşenlerden oluşur ve her biri kritik bir rol oynar. Bu bileşenleri anlamak, etkili bir RAG pipeline'ı tasarlamak için temeldir.
3.1 Doküman Yükleyiciler (Document Loaders)
Doküman yükleyiciler, farklı formatlardaki verileri RAG pipeline'ına almak için kullanılır. PDF, Word, HTML, Markdown, CSV, veritabanı kayıtları ve API yanıtları gibi çeşitli kaynaklardan veri çekilebilir. LangChain, LlamaIndex gibi framework'ler yüzlerce farklı kaynak için hazır yükleyiciler sunar.
3.2 Metin İşleme Pipeline'ı
Ham dokümanlar yüklendikten sonra bir dizi işleme adımından geçer: temizleme (gereksiz karakterlerin kaldırılması), normalleştirme (büyük-küçük harf, Unicode normalizasyonu), metadata çıkarımı (tarih, yazar, bölüm bilgileri) ve yapılandırma (başlık hiyerarşisi, paragraf bölümleri). Bu adımlar, chunking ve embedding kalitesini doğrudan etkiler.
3.3 Orchestration Katmanı
Orchestration katmanı, tüm RAG bileşenlerini bir araya getiren ve iş akışını yöneten merkezdir. Kullanıcı sorgusunun alınması, retrieval'ın tetiklenmesi, sonuçların filtrelenmesi, prompt'un oluşturulması ve LLM'e gönderilmesi bu katmanın sorumluluğundadır. LangChain, LlamaIndex, Haystack ve Semantic Kernel gibi framework'ler bu orchestration'ı kolaylaştırır.
4. Embedding Modelleri
Embedding modelleri, metin verilerini yüksek boyutlu vektör uzayında sayısal temsillere dönüştüren yapay zeka modelleridir. Bu vektörler, metinlerin anlamsal benzerliğini ölçmek için kullanılır ve RAG mimarisinin temel taşlarından birini oluşturur.
4.1 Popüler Embedding Modelleri
4.2 Embedding Seçim Kriterleri
Doğru embedding modelini seçerken şu faktörleri değerlendirmelisiniz: dil desteği (Türkçe için çok dilli modeller tercih edilmeli), boyut (daha yüksek boyut genellikle daha iyi temsil ancak daha fazla depolama ve hesaplama), bağlam uzunluğu (chunk boyutunuza uygun olmalı), maliyet (API tabanlı vs. self-hosted) ve performans (MTEB benchmark sonuçları).
5. Vektör Veritabanları
Vektör veritabanları, embedding vektörlerini depolayan ve bu vektörler üzerinde hızlı benzerlik araması yapılmasını sağlayan özel veritabanlarıdır. RAG mimarisinin performansını doğrudan etkileyen kritik bir bileşendir.
5.1 Popüler Vektör Veritabanları
Pinecone: Tam yönetilen bulut hizmeti olarak sunulur. Otomatik ölçeklendirme, metadata filtreleme ve hibrit arama desteği sunar. Hızlı prototipleme ve üretim ortamları için idealdir.
Weaviate: Açık kaynaklı, GraphQL API desteğiyle gelen bir vektör veritabanıdır. Modüler mimari, çoklu vektörizasyon ve BM25 + vektör hibrit arama desteği sunar.
Qdrant: Rust ile yazılmış, yüksek performanslı açık kaynak vektör veritabanıdır. Zengin filtreleme, payload indeksleme ve dağıtık mimari sunar.
Milvus: Milyarlarca vektörü destekleyen, bulut-native bir vektör veritabanıdır. GPU hızlandırma ve çoklu indeks tipi desteği sunar.
ChromaDB: Geliştirici dostu, hafif bir vektör veritabanıdır. Hızlı başlangıç ve prototipleme için mükemmeldir ancak büyük ölçekli üretim ortamları için sınırlı kalabilir.
pgvector: PostgreSQL eklentisi olarak çalışır. Mevcut PostgreSQL altyapınızı kullanarak vektör araması yapmanızı sağlar. Ayrı bir veritabanı yönetmek istemeyenler için ideal bir seçenektir.
6. Chunking Stratejileri
Chunking, uzun dokümanları daha küçük ve yönetilebilir parçalara ayırma sürecidir. RAG sistemlerinin performansını en çok etkileyen faktörlerden biri doğru chunking stratejisinin seçilmesidir.
6.1 Sabit Boyutlu Chunking
En basit yaklaşımdır. Metin, belirli bir karakter veya token sayısına göre parçalara ayrılır. Genellikle overlap (örtüşme) ile birlikte kullanılır, böylece chunk sınırlarında bilgi kaybı önlenir. Tipik olarak 256-1024 token arası chunk boyutu ve %10-20 overlap önerilir.
# Sabit boyutlu chunking örneği
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50,
separators=["\n\n", "\n", ". ", " ", ""]
)
chunks = splitter.split_text(document_text)
6.2 Semantik Chunking
Semantik chunking, metnin anlamsal yapısına göre parçalara ayırmayı hedefler. Cümleler arasındaki embedding benzerliğini hesaplayarak, anlam değişikliği olan noktalarda chunk sınırı oluşturur. Bu yaklaşım daha anlamlı ve bağlamsal olarak tutarlı parçalar üretir ancak hesaplama maliyeti daha yüksektir.
6.3 Yapısal Chunking
Dokümanın doğal yapısını (başlıklar, bölümler, paragraflar) kullanarak chunking yapar. Markdown, HTML ve yapılandırılmış dokümanlar için idealdir. Her chunk, dokümanın mantıksal bir bölümünü temsil eder ve metadata olarak bölüm başlığı, hiyerarşi bilgisi gibi veriler eklenir.
6.4 Agentic Chunking
En gelişmiş yaklaşımlardan biridir. Bir LLM kullanarak dokümanın içeriğini analiz eder ve en uygun chunk sınırlarını belirler. Her chunk için bağımsız bir özet ve başlık da üretebilir. Maliyet ve gecikme en yüksek olmasına rağmen, kalite açısından genellikle en iyi sonuçları verir.
⚠️ Uyarı
Chunk boyutu, embedding modelinizin maksimum token sınırını aşmamalıdır. Ayrıca çok küçük chunk'lar bağlam kaybına, çok büyük chunk'lar ise gürültüye neden olabilir. Optimal boyutu deneysel olarak belirlemeniz önerilir.
7. Retrieval Yöntemleri
Retrieval (bilgi alma), kullanıcı sorgusuna en uygun doküman parçalarını bulmak için kullanılan yöntemlerdir. Doğru retrieval stratejisi, RAG sisteminin başarısını belirleyen en kritik faktörlerden biridir.
7.1 Yoğun Retrieval (Dense Retrieval)
Embedding vektörleri kullanarak anlamsal benzerlik araması yapar. Sorgu ve dokümanlar aynı vektör uzayında temsil edilir ve kosinus benzerliği, iç çarpım veya Öklid mesafesi gibi metriklerle karşılaştırılır. Anlamsal olarak benzer ancak farklı kelimeler kullanan sorguları yakalamada çok etkilidir.
7.2 Seyrek Retrieval (Sparse Retrieval)
BM25, TF-IDF gibi geleneksel bilgi alma yöntemlerini kullanır. Kelime eşleştirmesine dayalıdır ve özellikle teknik terimler, ürün kodları ve özel isimler gibi kesin eşleşmelerde yoğun retrieval'dan daha iyi performans gösterebilir. Hesaplama maliyeti düşüktür ve anlaşılması kolaydır.
7.3 Çok Sorgulu Retrieval (Multi-Query Retrieval)
Orijinal kullanıcı sorgusundan birden fazla farklı sorgu varyasyonu oluşturur ve her biri için ayrı ayrı retrieval yapar. Sonuçlar birleştirilerek (union veya intersection) daha kapsamlı bir bilgi kümesi elde edilir. Bu yöntem, özellikle belirsiz veya çok yönlü sorguların ele alınmasında etkilidir.
# Multi-query retrieval örneği
from langchain.retrievers import MultiQueryRetriever
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=ChatOpenAI(model="gpt-4o"),
prompt=custom_prompt # Sorgu varyasyonları oluşturmak için
)
results = retriever.get_relevant_documents(query)
7.4 Parent Document Retrieval
Küçük chunk'lar üzerinde arama yaparak eşleşme hassasiyetini artırır, ancak LLM'e gönderirken bu chunk'ların ait olduğu daha büyük üst dokümanı (parent) kullanır. Böylece hem kesin eşleşme hem de yeterli bağlam sağlanmış olur.
8. Re-ranking Teknikleri
Re-ranking, ilk retrieval aşamasından dönen sonuçları daha sofistike bir model kullanarak yeniden sıralama işlemidir. İlk aşamada hız için basit benzerlik araması kullanılırken, re-ranking aşamasında daha doğru ancak yavaş cross-encoder modelleri kullanılır.
8.1 Cross-Encoder Re-ranking
Cross-encoder modelleri, sorgu ve dokümanı birlikte işleyerek bir ilgililik skoru üretir. Bi-encoder (embedding) modellerinden çok daha doğrudur çünkü sorgu-doküman etkileşimini doğrudan modeller. Ancak her sorgu-doküman çifti için ayrı çıkarım gerektiğinden yavaştır ve bu nedenle yalnızca ilk aşamada filtrelenmiş küçük bir aday kümesi üzerinde çalıştırılır.
Popüler re-ranking modelleri arasında Cohere Rerank, BGE Reranker, Jina Reranker ve ColBERT sayılabilir.
8.2 LLM Tabanlı Re-ranking
GPT-4 veya Claude gibi büyük dil modellerini doğrudan re-ranking için kullanmak da mümkündür. LLM'e aday dokümanlar ve sorgu verilir, model bunları ilgililiğe göre sıralar. Bu yöntem en yüksek doğruluğu sağlayabilir ancak maliyet ve gecikme açısından en pahalı seçenektir.
9. Hibrit Arama
Hibrit arama, yoğun (dense) ve seyrek (sparse) retrieval yöntemlerini birleştirerek her iki yaklaşımın güçlü yönlerinden faydalanır. Anlamsal benzerlik araması ile kelime eşleştirmeyi bir arada kullanarak daha kapsamlı ve doğru sonuçlar elde eder.
9.1 Reciprocal Rank Fusion (RRF)
RRF, farklı retrieval yöntemlerinden gelen sıralama sonuçlarını birleştirmek için kullanılan popüler bir tekniktir. Her sonucun farklı listelerdeki sırasını kullanarak birleşik bir skor hesaplar. Basit, etkili ve hiperparametre ayarı gerektirmez.
# RRF formülü
# score(d) = Σ 1 / (k + rank_i(d))
# k genellikle 60 olarak ayarlanır
def reciprocal_rank_fusion(results_list, k=60):
fused_scores = {}
for results in results_list:
for rank, doc in enumerate(results):
if doc.id not in fused_scores:
fused_scores[doc.id] = 0
fused_scores[doc.id] += 1.0 / (k + rank + 1)
return sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
9.2 Ağırlıklı Birleştirme
Farklı retrieval yöntemlerinin sonuçlarını ağırlıklı olarak birleştirmek de mümkündür. Örneğin, vektör araması sonuçlarına 0.7, BM25 sonuçlarına 0.3 ağırlık verilebilir. Bu ağırlıklar, kullanım senaryosuna ve veri türüne göre ayarlanabilir. Weaviate ve Qdrant gibi veritabanları yerleşik hibrit arama desteği sunar.
10. Değerlendirme Metrikleri
RAG sistemlerinin performansını ölçmek ve iyileştirmek için çeşitli metrikler kullanılır. Bu metrikler hem retrieval hem de generation aşamasını değerlendirir.
10.1 Retrieval Metrikleri
10.2 Generation Metrikleri (RAGAS Framework)
RAGAS (Retrieval Augmented Generation Assessment), RAG sistemlerini değerlendirmek için geliştirilmiş özel bir framework'tür. Dört temel metrik sunar:
- Faithfulness (Sadakat): Üretilen yanıtın, sağlanan bağlama ne kadar sadık olduğunu ölçer. Hallüsinasyon tespiti için kritik öneme sahiptir.
- Answer Relevancy (Yanıt İlgililiği): Üretilen yanıtın soruya ne kadar uygun olduğunu değerlendirir.
- Context Precision (Bağlam Hassasiyeti): Alınan bağlamın ne kadarının soruyla ilgili olduğunu ölçer.
- Context Recall (Bağlam Kapsamı): Doğru yanıt için gerekli bilgilerin ne kadarının alınan bağlamda bulunduğunu ölçer.
11. İleri RAG Teknikleri
Temel RAG mimarisinin ötesinde, performansı ve kaliteyi artırmak için çeşitli ileri teknikler geliştirilmiştir. Bu teknikler, karmaşık gerçek dünya senaryolarında RAG sistemlerinin etkinliğini önemli ölçüde artırır.
11.1 Self-RAG (Öz-Değerlendirmeli RAG)
Self-RAG, modelin kendi ürettiği yanıtı değerlendirerek retrieval'ın gerekli olup olmadığına karar vermesini ve yanıtın kalitesini kontrol etmesini sağlar. Model, retrieval gerekli mi, alınan dokümanlar ilgili mi, üretilen yanıt destekleniyor mu ve yanıt faydalı mı gibi soruları kendine sorar.
11.2 Corrective RAG (CRAG)
CRAG, alınan dokümanların kalitesini değerlendiren ve gerektiğinde düzeltici eylemler alan bir yaklaşımdır. Eğer retrieval sonuçları düşük kaliteli ise, sorguyu yeniden formüle eder veya web araması gibi alternatif kaynaklara yönelir. Bu, özellikle bilgi tabanının kapsamının sınırlı olduğu durumlarda çok değerlidir.
11.3 GraphRAG
GraphRAG, bilgi grafiklerini (knowledge graphs) RAG mimarisine entegre eder. Dokümanlardan otomatik olarak varlıklar ve ilişkiler çıkarılır, bir bilgi grafiği oluşturulur ve bu grafik retrieval sürecinde kullanılır. Özellikle karmaşık, çok adımlı sorguların yanıtlanmasında ve varlıklar arası ilişkilerin anlaşılmasında üstün performans gösterir.
11.4 Agentic RAG
Agentic RAG, yapay zeka ajanlarını RAG pipeline'ına entegre ederek daha dinamik ve akıllı retrieval süreçleri oluşturur. Ajan, sorgunun karmaşıklığını analiz eder, hangi bilgi kaynaklarının sorgulanacağına karar verir, gerektiğinde birden fazla adımlı retrieval yapar ve ara sonuçları değerlendirerek stratejisini uyarlar.
11.5 Hypothetical Document Embeddings (HyDE)
HyDE, kullanıcı sorgusunu doğrudan embedding'e dönüştürmek yerine, önce LLM'den soruya varsayımsal bir yanıt üretmesini ister. Bu varsayımsal yanıtın embedding'i, gerçek dokümanların embedding'lerine daha yakın olacağından, retrieval kalitesi önemli ölçüde artabilir. Özellikle kısa ve belirsiz sorgularda etkilidir.
11.6 Contextual Compression
Alınan doküman parçalarını LLM'e göndermeden önce sıkıştırarak yalnızca sorguyla ilgili bilgiyi korur. Bu, token kullanımını azaltır, gürültüyü filtreler ve modelin daha odaklı yanıtlar üretmesini sağlar. LLM tabanlı sıkıştırma veya embedding tabanlı filtreleme kullanılabilir.
12. Uygulama Örneği
Aşağıda Python ve LangChain kullanarak basit bir RAG pipeline'ı oluşturma örneği bulunmaktadır:
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 1. Doküman Yükleme
loader = PyPDFLoader("dokuman.pdf")
documents = loader.load()
# 2. Chunking
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50
)
chunks = splitter.split_documents(documents)
# 3. Embedding ve Vektör Depolama
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. RAG Chain Oluşturma
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True
)
# 5. Sorgulama
result = qa_chain.invoke({"query": "RAG mimarisi nedir?"})
print(result["result"])
💡 İpucu
Üretim ortamında ChromaDB yerine Qdrant, Pinecone veya pgvector gibi daha ölçeklenebilir vektör veritabanlarını tercih edin. Ayrıca re-ranking ve hibrit arama ekleyerek retrieval kalitesini artırabilirsiniz.
13. Sıkça Sorulan Sorular
RAG ile fine-tuning arasındaki fark nedir?
Fine-tuning, modelin ağırlıklarını özel veriyle yeniden eğiterek kalıcı olarak değiştirirken, RAG harici bilgi kaynaklarından dinamik olarak veri çeker. RAG daha esnek, ucuz ve güncellenebilirdir; fine-tuning ise modelin davranışını ve tonunu değiştirmek için daha uygundur. Birçok durumda her ikisi birlikte kullanılabilir.
RAG için minimum ne kadar veri gereklidir?
RAG'ın minimum veri gereksinimi yoktur. Tek bir dokümanla bile çalışabilir. Ancak bilgi tabanının kapsamı ne kadar genişse, sistem o kadar çeşitli soruları yanıtlayabilir. Önemli olan verinin kalitesidir: doğru, güncel, iyi yapılandırılmış ve sorgulanacak konuları kapsayan veriler en iyi sonuçları verir.
Hangi vektör veritabanını seçmeliyim?
Seçim, ölçek ve gereksinimlerinize bağlıdır. Prototipleme için ChromaDB, mevcut PostgreSQL altyapısıyla entegrasyon için pgvector, yüksek performans ve ölçeklenebilirlik için Qdrant veya Milvus, tam yönetilen çözüm istiyorsanız Pinecone idealdir. Hibrit arama gerekiyorsa Weaviate veya Qdrant değerlendirin.
RAG sistemleri hangi dilleri destekler?
RAG sistemlerinin dil desteği, kullanılan embedding modeline ve LLM'e bağlıdır. Çok dilli embedding modelleri (BGE-M3, Cohere embed-v3, OpenAI text-embedding-3) ile Türkçe dahil onlarca dilde çalışabilirsiniz. LLM olarak GPT-4o, Claude veya Gemini gibi çok dilli modeller kullanarak herhangi bir dilde RAG sistemi kurabilirsiniz.
RAG sistemini nasıl optimize edebilirim?
RAG optimizasyonu birçok boyutta yapılabilir: chunk boyutunu ve overlap'i deneysel olarak ayarlayın, hibrit arama (dense + sparse) kullanın, re-ranking ekleyin, metadata filtreleme uygulayın, sorgu genişletme (query expansion) teknikleri kullanın, RAGAS gibi framework'lerle düzenli değerlendirme yapın ve sonuçlara göre iteratif iyileştirmeler uygulayın.
RAG hallüsinasyonları tamamen ortadan kaldırır mı?
RAG, hallüsinasyonları önemli ölçüde azaltır ancak tamamen ortadan kaldırmaz. Model, alınan bağlamı yanlış yorumlayabilir veya bağlamda bulunmayan bilgileri ekleyebilir. Bu riski minimize etmek için faithfulness metriğini izleyin, prompt'larda "yalnızca verilen bilgilere dayanarak yanıtla" talimatı verin ve Self-RAG gibi öz-değerlendirme tekniklerini kullanın.