RAG (Retrieval-Augmented Generation): Kendi Verinizle LLM'leri Eğitmeden Akıllandırmanın Püf Noktası
Büyük Dil Modelleri (LLM’ler) geniş bir bilgiye sahip olsa da, bu bilgi eğitim veri kümesine dayanır ve sabittir. Özel, güncel veya gizli verilerinizle çalışmak için modeli yeniden eğitmek (fine-tuning) maliyetli ve zaman alıcıdır. İşte bu noktada RAG (Retrieval-Augmented Generation) devreye girer. RAG, LLM’leri kendi veri kaynaklarınızla “akıllandırmak” için bir köprü görevi görür. Modeli değiştirmeden, sorgu zamanında harici bilgileri çekip cevap oluşturmak için kullanır.
RAG’ın Çalışma Prensibi: 2 Adımda Güç
RAG’ın temel felsefesi basittir: Önce bul, sonra üret. İşlemi iki ana aşamada inceleyebiliriz:
- Retrieval (Geri Çekme): Kullanıcı bir soru sorduğunda, sistem önce kendi vektör veritabanınızda (kendi belgelerinizin embedding’leri) bu soruyla en ilgili belgeleri veya veri parçalarını arar. Bu, anlamsal bir aramadır; kelime eşleşmesi değil, anlam benzerliği üzerine çalışır.
- Generation (Üretim): Bulunan ilgili belgeler, LLM’e bir “bağlam” (context) olarak verilir. LLM, bu sağlanan bağlamı kullanarak orijinal soruya doğru, güncel ve bağlamsal bir cevap üretir.
Bu süreç, LLM’e anında özel bilgi “hatırlatması” yapar.

RAG vs. Fine-Tuning: Hangisini Ne Zaman Seçmelisiniz?
İki yaklaşımı karşılaştırmak için aşağıdaki tablo yardımcı olacaktır:
| Özellik | RAG (Retrieval-Augmented Generation) | Fine-Tuning (Model Yeniden Eğitimi) |
|---|---|---|
| Temel Mantık | Sorgu zamanında harici bilgi ekle | Modelin iç parametrelerini kalıcı olarak güncelle |
| Veri Gereksinimi | Yüksek (içerik belgeleri) | Orta/Yüksek (etiketlenmiş soru-cevap çiftleri) |
| Maliyet | Düşük (sadece embedding ve retrieval maliyeti) | Çok Yüksek (GPU/TPU eğitim maliyeti) |
| Zaman | Hızlı (anında dağıtım) | Yavaş (eğitim süresi saatler/günler) |
| Bilgi Güncellemesi | Çok Kolay (yeni belge ekle/çıkar) | Zor (tüm eğitim sürecini tekrarla) |
| Esneklik | Yüksek (farklı kaynaklar dinamik) | Düşük (model sabit, yeni veri için yeni eğitim) |
| “Hallüsinasyon” | Azaltır (gerçek kaynaklara dayanır) | Azaltır (model domain’ine adapte olur) |
| Kullanım Alanı | Doküman Q&A, sohbet botları, güncel bilgi | Ton/format değişimi, uzmanlaşma, düşük kaynak |
Kural: Bilginiz sürekli değişiyorsa, güncel kalması kritikse ve büyük bir etiketlenmiş veri kümeniz yoksa RAG ilk tercihiniz olmalıdır. Fine-tuning, modelin nasıl konuştuğunu (tonu, stilini) değiştirmek için daha uygundur.
RAG Mimarisi Bileşenleri
- Document Loader & Splitter: PDF, web sayfaları, veritabanı kayıtları gibi ham verileri yükler ve anlamlı parçalara (chunks) böler.
- Embedding Model: Metin parçalarını sayısal vektörlere (embedding) dönüştürür. Bu vektörler, metnin anlamını matematiksel uzayda temsil eder.
- Vector Database: Oluşturulan embedding’leri hızlı ve ölçeklenebilir bir şekilde saklar (Pinecone, Weaviate, pgvector, ChromaDB gibi).
- Retriever: Kullanıcı sorusunu embedding’e dönüştürür ve vektör DB’de en benzer (cosine similarity) parçaları bulur.
- LLM (Generator): Bulunan parçaları bağlam olarak alır ve kullanıcı sorusuna uygun, akıcı bir cevap üretir (GPT-4, Claude, Llama 2 gibi).
Pratik Bir Uygulama Örneği (Python & LangChain)
Aşağıda, kendi PDF belgelerinizle çalışan basit bir RAG zinciri örneği bulunmaktadır:
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 1. PDF'yi yükle ve parçala
loader = PyPDFLoader("kendi_belgeniz.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# 2. Embedding oluştur ve vektör DB'ye kaydet
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)
vectorstore.save_local("faiss_index") # Daha sonra yüklemek için
# 3. Retriever ve QA zinciri oluştur
retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # En iyi 3 parçayı getir
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(temperature=0),
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 4. Sorgu yap
result = qa_chain("Şirketimizin 2023 yılı karı nedir?")
print("Cevap:", result["result"])
print("Kaynaklar:", [doc.metadata for doc in result["source_documents"]])
İletişim
Herhangi bir sorunuz veya düşünceleriniz varsa email ile ulaşabilirsiniz.