RAG nedir, neden yerel çalıştırmalıyım?
Büyük dil modelleri etkileyici cevaplar üretebiliyor ancak kaynaklara dayanmayan “halüsinasyon” üretme eğilimleri var. Retrieval-Augmented Generation (RAG), modelin yanıtlarını gerçek belgelerinizden çekilen parçalarla destekleyerek bu sorunu azaltır. Yerel RAG, tüm süreci bilgisayarınızda çalıştırarak gizlilik, düşük gecikme ve maliyet avantajı sağlar. Bu yazıda Ollama + FAISS ikilisiyle, PDF’leriniz, notlarınız veya wiki sayfalarınız üzerinde çalışan pratik bir yerel RAG kurulumunun yolunu göstereceğim.
Mimari bileşenler
1) LLM (Yanıtlayıcı): Yerelde çalıştırmak için Ollama üzerinden Llama 3, Mistral veya benzeri açık modellerden birini seçebilirsiniz. Kuantize edilmiş sürümler (ör. Q4_K_M) düşük donanımda bile kabul edilebilir hız sunar.
2) Vektörleştirici (Embedding): Metni sabit boyutlu vektörlere dönüştürür. Türkçe desteği güçlü olan bge veya e5 tabanlı modeller iyi sonuç verir. Embedding modeli LLM’den ayrı olabilir; bu esneklik performansı artırır.
3) Vektör Veritabanı (FAISS): Belgelerinizin vektörlerini indeksleyip en benzer parçaları hızla getirir. FAISS hafif, açık kaynak ve yerel kurulum için idealdir.
4) Orkestrasyon: Basit bir RAG için ek çerçeve şart değil. Sıra; sorguyu vektörleştir, FAISS’ten en yakın doküman parçalarını getir, bu parçaları bağlam olarak LLM’e ver ve yanıtı oluştur şeklinde ilerler. İsterseniz LangChain veya LlamaIndex kullanabilirsiniz; ancak bu yazı minimal ve anlaşılır yaklaşımı tercih ediyor.
Adım adım kurulum
Önkoşullar: 8–16 GB RAM, modern bir CPU yeterli. GPU varsa daha hızlı olur. İşletim sistemi olarak macOS, Windows (WSL dahil) veya Linux uygundur.
1) Ollama’yı kurun: Ollama resmi sitesinden sisteminize uygun kurulum paketini indirin ve kurun. Terminalde “ollama run llama3” gibi bir komutla modeli test edebilirsiniz. İlk çalıştırmada model indirilecektir.
2) Embedding modelini hazırlayın: Python ortamı kurup sentence-transformers gibi bir kütüphane ile bge veya e5 tabanlı çok dilli bir modeli indirin. Türkçe metinler için bu aileler genellikle dengeli sonuç verir. Üretimde aynı tokenizer ve model sürümünü koruyarak tutarlılık sağlayın.
3) Belgeleri içe aktarın ve parçalara bölün: PDF, Markdown veya HTML kaynaklarınızı metne dönüştürün. Chunking stratejinizi belirleyin: 400–800 kelime aralığı ve %10–20 örtüşme (overlap) çoğu senaryo için iyi bir başlangıçtır. Başlık, bölüm, sayfa numarası gibi meta verileri saklamayı unutmayın.
4) FAISS ile indeks oluşturun: Her parçayı embedding modele verip vektörünü alın ve FAISS’e ekleyin. Büyük veri için IVF+PQ gibi yapılandırmalar disk ve bellek kullanımını dengeler. Küçük veri setlerinde düz L2 veya kosinüs benzerliği yeterli olur.
5) Sorgu akışı: Kullanıcı sorusunu embedding’e çevirin, FAISS’ten top-k (ör. k=5) en yakın parçayı çekin. Bu parçaları bir “bağlam” şablonunda birleştirip Ollama’ya aktarın. Prompt içinde “Sadece aşağıdaki bağlamdan yararlan” gibi net yönergeler verin. Yanıtı kaynak bağlantılarıyla birlikte sunmak güven yaratır.
6) Hafif bir API ekleyin: FastAPI gibi bir çerçeveyle tek uç noktalı bir servis hazırlayabilirsiniz. İstek geldiğinde sorguyu vektörleştirir, FAISS’ten bağlamı getirir, Ollama’ya iletir ve akışlı yanıtı geri döndürür. Böylece masaüstü, web veya mobil istemciler kolayca entegre olur.
7) Değerlendirme ve iyileştirme: Kaliteyi ölçmek için sık sorulan 20–30 soruluk bir test seti hazırlayın. Cevap doğruluğu, kaynak kapsama (coverage) ve ilk token gecikmesi gibi metrikleri izleyin. Top-k, chunk boyutu, MMR (çeşitlilik odaklı getirme) ve sıcaklık (temperature) ayarlarını kademeli değiştirerek A/B testleri yapın.
Performans ve pratik ipuçları
Kuantizasyon: LLM’i Q4 seviyesinde çalıştırmak performans/kalite dengesini iyileştirir. CPU’da dahi kabul edilebilir yanıt hızları elde edilir.
Prompt mühendisliği: Türkçe bağlam sağladığınızda, talimatları da Türkçe verin. “Kaynaklardan alıntı yap, emin değilsen belirt” gibi yönlendirmeler halüsinasyonu azaltır.
Önbellekleme: Sık soruların embedding ve arama sonuçlarını disk üzerinde önbelleğe alın. Bu, hem gecikmeyi hem de CPU yükünü düşürür.
Filtreler: FAISS yanında meta veri filtreleri tutarak tarih, yazar, kategori gibi sınırlamalarla daha doğru sonuçlar alabilirsiniz.
Türkçe desteği: Embedding modelinin Türkçe kapsaması kritiktir. İlk denemelerde Türkçe/multilingual modelleri karşılaştırın; bazen küçük ama iyi eğitilmiş bir embedding modeli büyük bir fark yaratır.
Gizlilik, güvenlik ve bakım
Yerel RAG’in en büyük artısı, belgelerinizin makine dışına çıkmamasıdır. Yine de PII içeren veri setlerini şifreli depolamak, cihazınızda tam disk şifreleme kullanmak ve indeks dosyalarına erişimi kısıtlamak önemlidir. Modelleri ve bağımlılıkları düzenli güncelleyin; embedding modelini değiştirdiğinizde indeksinizi yeniden oluşturmanız gerektiğini unutmayın.
Sorun giderme
İndeks tutarsızlığı: Farklı embedding model veya sürüm değişikliği, alakasız sonuçlar doğurur. Tek sürüm standardı belirleyin.
Dil karışması: Çok dilli veri setlerinde karışık diller zayıf eşleşmeye yol açabilir. Belgeleri dil bazında ayrı indekslemek kaliteyi yükseltir.
Kaynak tüketimi: RAM yetmiyorsa daha agresif chunking veya IVF+PQ yapılandırmasına geçin. LLM tarafında daha küçük bir model deneyin.
Sonuç
Ollama ve FAISS ile kurulan yerel RAG, gizliliğe duyarlı ortamlarda hızlı ve güvenilir bir bilgi erişim katmanı sunar. Doğru embedding seçimi, iyi bir chunking stratejisi ve disiplinli değerlendirmeyle; şirket içi dokümantasyondan akademik arşivlere kadar pek çok kullanım senaryosunda arama ve soru-cevap kalitesini belirgin biçimde artırabilirsiniz. Küçük adımlarla başlayın, metriklerle ölçün ve yapı taşlarını gerektikçe büyütün; kısa sürede günlük iş akışınızda fark yaratacaktır.