RAG Sistemi

Retrieval-Augmented Generation (RAG) ile LLM'lerinizi özel belgelerinizle güçlendirin. Gerçek zamanlı bilgi akışı, vektör veritabanları ve sorgu optimizasyonu.

rag_chain.invoke("Sorunuz nedir?")

RAG Nedir?

RAG (Retrieval-Augmented Generation), büyük dil modellerinin (LLM) yanıtlarını, dinamik olarak alınan (retrieved) dış bilgilerle zenginleştiren bir mimaridir. Geleneksel LLM'ler sadece eğitildikleri statik veriye dayanırken, RAG sistemi özel belgelerinizden veya güncel bilgilerden gerçek zamanlı olarak bilgi alır.

Örneğin, şirketinizin son çeyrek finansal raporunu RAG sistemine yüklediğinizde, LLM bu belgeyi okuyup "Şirketimizin son çeyrek geliri ne kadar?" gibi sorulara doğru yanıt verebilir.

💡 Pro İpucu: RAG, LLM'nin halüsinasyon (yanlış bilgi uydurma) yapma eğilimini büyük ölçüde azaltır çünkü yanıtlar, gerçek belgelerden alınan kanıtlarla desteklenir.
RAG'ın Temel Bileşenleri:
  • • Retriever (Alıcı): Sorguya en uygun belgeleri veritabanından çeker.
  • • Vector Database (Vektör Veritabanı): Belgelerin sayısal temsillerini (embedding) saklar.
  • • Generator (Üreteç): LLM, alınan belgeleri kullanarak yanıtı oluşturur.
Tarihçe
Facebook AI Research (FAIR) tarafından 2020 yılında önerilen RAG, LLM'lerin bilgi sınırlarını aşmanın en etkili yollarından biri haline geldi.

RAG, LLM'leri "statik bilgi kutusu" olmaktan çıkarıp, "dinamik bilgi asistanı" haline getirir. Bu, kurumsal uygulamalar için devrim niteliğindedir.

Neden RAG Kullanmalısınız?

LLM'lerin en büyük zayıflıklarından biri, eğitim verilerinin tarihinden sonra olan olaylar veya özel belgeler hakkında bilgi sahibi olmamalarıdır. RAG bu sorunu çözer.

# Geleneksel LLM vs RAG Karşılaştırması
# Geleneksel LLM
# Soru: "Şirketimizin 2024 stratejik hedefleri nelerdir?"
# Yanıt: "Üzgünüm, bu özel bilgiye sahip değilim."
# RAG Sistemi
# Soru: "Şirketimizin 2024 stratejik hedefleri nelerdir?"
# Yanıt: "2024 yılında %20 büyüme, yeni pazarlara açılma ve dijital dönüşümü tamamlama hedeflerimiz var. (Kaynak: 2024 Strateji Belgesi, Sayfa 3)"
💡 Pro İpucu: RAG, modelinizi yeniden eğitmeden (fine-tuning) özel bilgilerle güçlendirmenin en hızlı ve en ucuz yoludur.

RAG'ın Avantajları:

  • Güncellenebilirlik: Yeni belge eklediğinizde sistem hemen güncellenir, modeli yeniden eğitmenize gerek yok.
  • Kaynak Gösterme: Hangi belgeden hangi bilgiyi aldığını gösterir (audit trail).
  • Maliyet Etkin: Fine-tuning'e göre çok daha ucuz ve hızlıdır.
  • Esneklik: Farklı veri kaynaklarıyla (PDF, web sayfası, veritabanı) entegre olabilir.
Gerçek Dünya Uygulamaları
Müşteri Destek Botları: Ürün kılavuzları ve SSS belgelerinden bilgi alarak doğru yanıt verir.
İç Kurumsal Arama: Şirket içi tüm belgelerde arama yapar.
Eğitim Asistanları: Ders kitapları ve notlardan öğrenci sorularını yanıtlar.
Sınırlamalar: RAG, belgelerde olmayan bilgileri çıkaramaz. Ayrıca, belge kalitesi doğrudan sistem performansını etkiler.

RAG Mimarisi ve Çalışma Prensibi

Bir RAG sistemi iki ana aşamadan oluşur: İndeksleme (Indexing) ve Sorgulama (Querying).

💡 Pro İpucu: İndeksleme, bir kez yapılır (veya belge eklendiğinde güncellenir). Sorgulama ise her kullanıcı isteğinde gerçekleşir.

1. İndeksleme Aşaması:

  1. Belge Yükleme: PDF, TXT, DOCX, HTML vb. formatlardaki belgeler sisteme yüklenir.
  2. Parçalama (Chunking): Büyük belgeler küçük parçalara (chunk) bölünür (örneğin, 512 token).
  3. Embedding: Her parça, bir embedding modeli kullanılarak sayısal bir vektöre dönüştürülür.
  4. Veritabanına Kaydetme: Vektörler ve orijinal metin parçaları vektör veritabanında saklanır.

2. Sorgulama Aşaması:

  1. Sorgu Embedding'i: Kullanıcının sorusu da aynı embedding modeliyle vektöre dönüştürülür.
  2. Benzerlik Araması: Sorgu vektörü ile veritabanındaki tüm vektörler arasında benzerlik (cosine similarity) hesaplanır.
  3. En İlgili Belgelerin Alınması: En yüksek benzerlik skoruna sahip K belge (örneğin, K=3) seçilir.
  4. Yanıt Üretimi: Seçilen belgeler ve orijinal soru birlikte LLM'ye gönderilir ve yanıt üretilir.
Prompt Formatı
"""Aşağıdaki bağlamı kullanarak soruyu yanıtla. Eğer bağlamda cevap yoksa 'Bilmiyorum' de.
Bağlam: {alınan_belgeler}
Soru: {kullanıcı_sorusu}
Yanıt:"""
Önemli: Parçalama (chunking) stratejisi çok kritiktir. Parçalar çok küçükse bağlam kaybolur, çok büyükse ilgisiz bilgilerle gürültülenir.

Vektör Veritabanı Seçimi

Vektör veritabanı, RAG sisteminin kalbidir. Milyonlarca vektör arasında saniyeler içinde en benzer olanları bulabilen özel veritabanlarıdır.

# ChromaDB ile basit bir vektör veritabanı örneği
import chromadb
from chromadb.utils import embedding_functions
# İstemci ve koleksiyon oluştur
client = chromadb.Client()
collection = client.create_collection("my_documents")
# Embedding fonksiyonu
embed_fn = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")
# Vektörleri ekle
collection.add(
    documents=["Python çok güçlü bir dildir.", "RAG LLM'leri güçlendirir."],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}],
    ids=["id1", "id2"]
)
💡 Pro İpucu: Küçük projeler için ChromaDB veya FAISS yeterlidir. Üretim sistemleri için Pinecone, Weaviate veya Qdrant önerilir.

Popüler Vektör Veritabanları:

  • ChromaDB: Açık kaynak, kolay kullanım, prototipleme için ideal.
  • FAISS (Facebook): Facebook'un geliştirdiği, yüksek performanslı kütüphane.
  • Pinecone: Tam yönetilen bulut hizmeti, ölçeklenebilir.
  • Weaviate: Açık kaynak + bulut, zengin özellikler.
  • Qdrant: Rust ile yazılmış, yüksek performanslı, açık kaynak.
  • Milvus: Kurumsal seviyede, dağıtık mimari.
Hangisini Seçmeli?
Küçük/Hobi Proje: ChromaDB, FAISS
Orta Boy Proje: Weaviate, Qdrant
Büyük Ölçekli Üretim: Pinecone, Milvus
Veri Mahremiyeti: FAISS, Qdrant (kendi sunucunuzda çalıştırabilirsiniz)
Dikkat: Vektör veritabanı seçerken sorgu hızı, ölçeklenebilirlik, maliyet ve kolaylık gibi faktörleri dikkate alın.

Embedding Modelleri

Embedding modeli, metni sayısal bir vektöre dönüştüren derin öğrenme modelidir. Bu vektörler, metnin anlamını yakalar ve benzer metinlerin vektörleri birbirine yakındır.

💡 Pro İpucu: Sorgu ve belgeleri aynı embedding modeliyle vektöre dönüştürmelisiniz. Aksi takdirde benzerlik araması doğru çalışmaz.
from sentence_transformers import SentenceTransformer
# Modeli yükle
model = SentenceTransformer('all-MiniLM-L6-v2')
# Metni vektöre çevir
texts = ["Kedi mutfakta uyuyor.", "Köpek bahçede oynuyor."]
embeddings = model.encode(texts)
print(embeddings.shape) # (2, 384) - 2 metin, 384 boyutlu vektörler
# Benzerlik hesapla
from sklearn.metrics.pairwise import cosine_similarity
sim = cosine_similarity([embeddings[0]], [embeddings[1]])
print(f"Benzerlik: {sim[0][0]:.4f}")
(2, 384) Benzerlik: 0.2847

Popüler Embedding Modelleri:

  • all-MiniLM-L6-v2: Hafif ve hızlı, genel amaçlı.
  • text-embedding-ada-002 (OpenAI): Çok güçlü, API üzerinden erişilir, ücretlidir.
  • BGE (BAAI General Embedding): Son dönemde popüler, güçlü performans.
  • e5 (Microsoft): Çok dilli destek, güçlü performans.
  • multilingual-e5: 100'den fazla dili destekler.
Boyut ve Performans
Küçük Boyutlu (384): Hafif, hızlı, bellek verimli (MiniLM)
Orta Boyutlu (768): Dengeli performans (BGE-small)
Büyük Boyutlu (1024+): Daha güçlü ama yavaş ve bellek tüketici (text-embedding-3-large)
Uyarı: Embedding modelinin dili önemlidir. Türkçe belgeler için emirhan/TF-IDF-MSE-512 veya multilingual-e5 gibi modeller tercih edilmelidir.

LangChain ile RAG Uygulaması

LangChain, LLM tabanlı uygulamalar oluşturmak için geliştirilmiş popüler bir çerçevedir. RAG sistemlerini birkaç satır kodla oluşturmanıza olanak tanır.

💡 Kurulum: pip install langchain langchain-community langchain-openai
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain import hub
# 1. Belgeyi yükle ve parçala
loader = TextLoader("belge.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
LangChain Devamı
Aşağıdaki kod, vektör veritabanını oluşturur, sorgu zincirini tanımlar ve soruyu yanıtlar.
# 2. Vektör veritabanını oluştur
vectorstore = Chroma.from_documents(chunks, OpenAIEmbeddings())
# 3. Retriever oluştur
retriever = vectorstore.as_retriever()
# 4. Prompt şablonunu al (LangChain Hub'dan)
prompt = hub.pull("rlm/rag-prompt")
# 5. LLM'yi tanımla
llm = ChatOpenAI(model_name="gpt-4")
# 6. Zinciri oluştur
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)
# 7. Soruyu sor!
result = rag_chain.invoke("Belgede bahsedilen ana fikir nedir?")
print(result)
Not: Bu örnek OpenAI API'sini kullanır. Ücretsiz alternatifler için Ollama veya HuggingFace entegrasyonlarını kullanabilirsiniz.
LangChain'in Gücü:
  • • Farklı LLM'ler, vektör veritabanları ve belge yükleyiciler arasında kolay geçiş.
  • • Hazır prompt şablonları (hub).
  • • Zincirleme işlemler (chaining) ile karmaşık akışlar oluşturma.
  • • Bellek (memory) desteği ile sohbet geçmişi tutma.

LlamaIndex ile RAG

LlamaIndex (eski adıyla GPT Index), RAG uygulamaları oluşturmak için LangChain'e alternatif olarak geliştirilmiş bir kütüphanedir. Özellikle veri indeksleme ve sorgulama konusunda çok güçlüdür.

💡 Kurulum: pip install llama-index
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.response.pprint_utils import pprint_response
from llama_index.llms.openai import OpenAI
# 1. Belgeleri yükle
documents = SimpleDirectoryReader("./data").load_data()
# 2. İndeks oluştur
index = VectorStoreIndex.from_documents(documents)
# 3. Sorgu motoru oluştur
query_engine = index.as_query_engine(llm=OpenAI(model="gpt-4"))
# 4. Soruyu sor
response = query_engine.query("Belgedeki en önemli bulgu nedir?")
pprint_response(response, show_source=True)
Kaynak Gösterimi
LlamaIndex, yanıtın hangi belgeden (ve hangi parçadan) üretildiğini otomatik olarak gösterir. Bu, RAG sistemlerinin en büyük avantajlarından biridir.

LangChain vs LlamaIndex:

  • LangChain: Genel LLM uygulamaları için, daha esnek, modüler.
  • LlamaIndex: Özellikle RAG ve veri sorgulama için optimize edilmiş, daha yüksek düzey API'ler sunar.
  • Entegrasyon: İkisi birlikte de kullanılabilir! LlamaIndex retriever olarak LangChain'e eklenebilir.
Dikkat: LlamaIndex'in bazı özellikleri (özellikle yeni sürümlerde) ücretli olabilir. Açık kaynak sürümünü kullanmak için dikkatli olun.
💡 Pro İpucu: Basit bir RAG uygulaması için LlamaIndex daha hızlı sonuç verir. Karmaşık iş akışları için LangChain daha uygundur.

RAG Performans Optimizasyonu

RAG sisteminizin doğruluğunu ve hızını artırmak için uygulayabileceğiniz pek çok optimizasyon tekniği vardır.

# Reranking ile sonuç kalitesini artırma
from llama_index.postprocessor.cohere_rerank import CohereRerank
# Query engine'e reranker ekle
query_engine = index.as_query_engine(
    llm=OpenAI(model="gpt-4"),
    node_postprocessors=[CohereRerank(top_n=3)]
)
💡 Pro İpucu: İlk retriever aşamasında 10 belge alıp, reranker modeliyle en iyi 3'ü seçmek, LLM'nin daha kaliteli bağlam görmesini sağlar.

Optimizasyon Teknikleri:

  • Parçalama Stratejisi: Sabit boyut yerine cümle veya başlık bazlı parçalama.
  • Metadata Filtreleme: Tarih, yazar, kategori gibi meta verilere göre önceden filtreleme.
  • Hybrid Arama: Vektörel arama + anahtar kelime araması kombinasyonu.
  • Sorgu Genişletme: Kullanıcı sorgusuna ilgili anahtar kelimeler eklemek.
  • Reranking: İlk sonuçları daha güçlü bir modelle yeniden sıralamak.
Performans Metrikleri
Doğruluk (Accuracy): Yanıtın doğruluğu.
MRR (Mean Reciprocal Rank): İlk doğru sonucun sırası.
Latency: Sorgudan yanıta geçen süre.
Throughput: Saniyede işlenen sorgu sayısı.
Ölçümleme: Optimizasyon yapmadan önce temel performans metriklerinizi ölçün. Aksi takdirde geliştirmenin etkisini bilemezsiniz.

Gerçek Dünya Örneği: Kurumsal Bilgi Asistanı

Şimdi, bir şirketin iç bilgi asistanı için tam bir RAG uygulaması oluşturalım. Bu sistem, şirketin politika belgelerini, ürün kılavuzlarını ve SSS'yi tarayarak çalışanların sorularını yanıtlayacak.

💡 Pro İpucu: Üretim sistemlerinde, belgelerin otomatik olarak güncellenmesi için bir CI/CD pipeline oluşturun.
import os
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Qdrant
from langchain_community.llms import Ollama
# 1. PDF belgelerini yükle
loader = PyPDFDirectoryLoader("./company_docs/")
docs = loader.load()
# 2. Daha akıllı parçalama
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=100,
    separators=["\n\n", "\n", ". ", " "]
)
chunks = text_splitter.split_documents(docs)
Devamı
Bu örnek, açık kaynak teknolojilerle (Hugging Face, Ollama, Qdrant) tamamen ücretsiz bir RAG sistemi oluşturur.
# 3. Yerel embedding modeli (ücretsiz)
embeddings = HuggingFaceEmbeddings(model_name="emirhan/TF-IDF-MSE-512")
# 4. Qdrant vektör veritabanı (ücretsiz)
vectorstore = Qdrant.from_documents(
    chunks,
    embeddings,
    location=":memory:",  # RAM'de tut
    collection_name="company_knowledge"
)
# 5. Yerel LLM (Mistral)
llm = Ollama(model="mistral")
# 6. Zinciri tamamla ve çalıştır
# ... (LangChain zinciri oluşturma kodu) ...
print(rag_chain.invoke("Yeni işe başlayanlar için tatil hakkı nedir?"))
Üretim için Ekstra Adımlar:
  • • Hata yönetimi ve loglama ekle.
  • • API sunucusu olarak FastAPI veya Flask kullan.
  • • Docker ile konteynerize et.
  • • Kubernetes veya bulut fonksiyonlarıyla dağıt.
  • • Kullanım metriklerini izle (Prometheus, Grafana).
Güvenlik: Kurumsal belgeler hassas olabilir. Veri sızıntısını önlemek için girdi/çıktı filtreleme ve erişim kontrolü mutlaka uygulanmalıdır.

Yolculuğun Başlıyor!

Son Tavsiyeler
Küçükten Başlayın: Tek bir PDF ile başlayın, sonra sistemi genişletin.
Embedding Modeli: Dilinize ve alanınıza uygun model seçin.
Topluluk: LangChain ve LlamaIndex Discord sunucularına katılın.
Deneyin: Farklı parçalama stratejileri ve vektör veritabanlarını deneyin.

print("Happy RAGging! 🚀")