Retrieval-Augmented Generation (RAG), büyük dil modellerinin (LLM) harici bilgi kaynaklarına erişmesini sağlayarak çıktı kalitesini ve doğruluğunu artıran güçlü bir yaklaşımdır. LangChain, RAG pipeline'ları oluşturmak için esnek ve modüler bir çerçeve sunar. Bu adım adım rehberde, LangChain ile nasıl bir RAG sistemi kuracağınızı, belge yüklemeden sorgu yanıtlamaya kadar tüm süreci öğreneceksiniz.
1. LangChain ve Gerekli Kütüphaneleri Kurun
İlk adım, Python ortamınızda LangChain ve yardımcı kütüphaneleri kurmaktır. Aşağıdaki komutları kullanın:
pip install langchain langchain-community langchain-core langchain-openai chromadbBu kurulumda Chromadb vektör veritabanı olarak kullanılacak, langchain-openai ise OpenAI modellerine erişim sağlayacak. Alternatif olarak Hugging Face embedding'leri de tercih edebilirsiniz.
2. Belgeleri Yükleyin ve Parçalara Ayırın
RAG sisteminin temelinde, sorgulanacak belgelerin yüklenmesi ve anlamlı parçalara (chunk) ayrılması vardır. LangChain'de DocumentLoader ve TextSplitter kullanılır.
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = TextLoader("belge.txt")
belgeler = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
parcalar = splitter.split_documents(belgeler)İpucu: Chunk boyutunu belgenizin yapısına göre ayarlayın. 500-1000 karakter arası genellikle iyi sonuç verir. Aşırı küçük chunk'lar bağlam kaybına, büyük chunk'lar ise gürültüye neden olur.
3. Embedding Model Seçin ve Oluşturun
Parçaları vektörlere dönüştürmek için bir embedding modeli kullanılır. OpenAI'nin text-embedding-ada-002 modeli yaygın ve başarılıdır. LangChain ile kullanımı:
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")Daha hafif bir alternatif olarak Hugging Face modelleri de kullanabilirsiniz (örn. sentence-transformers/all-MiniLM-L6-v2). Seçim, projenizin performans ve bütçe gereksinimlerine bağlıdır.
4. Vektör Deposu Oluşturun
Embedding'leri Chromadb'ye yükleyerek bir vektör deposu oluşturun:
from langchain.vectorstores import Chroma
vektor_deposu = Chroma.from_documents(
documents=parcalar,
embedding=embeddings,
persist_directory="./chroma_db"
)
vektor_deposu.persist()Bu adım, belgelerinizin vektör temsillerini diske kaydeder. Sorgulama sırasında bu depo kullanılır.
5. LLM Modelini ve Sorgu Zincirini Oluşturun
Şimdi, kullanıcı sorgularını alıp ilgili belge parçalarını bularak bir yanıt üreten zinciri kurun. Önce bir LLM (örneğin GPT-4) tanımlayın, ardından bir RetrievalQA zinciri oluşturun.
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(model="gpt-4", temperature=0)
qa_zinciri = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vektor_deposu.as_retriever()
)chain_type="stuff" en basit yaklaşımdır; tüm parçaları tek bir bağlamda birleştirir. Alternatif olarak map_reduce veya refine kullanarak daha karmaşık işlemler yapabilirsiniz. Bu konuda daha fazla bilgi için RAG ile LLM Çıktı Kalitesini Artırma yazımıza göz atın.
6. Zinciri Çalıştırın ve Test Edin
Hazırladığınız sorgu zincirini bir örnek soru ile test edin:
soru = "Makine öğreniminde overfitting nasıl önlenir?"
yanit = qa_zinciri.invoke({"query": soru})
print(yanit["result"])Elde ettiğiniz yanıt, belgelerinizdeki ilgili parçalara dayanarak üretilmiş olacaktır. Yanıt kalitesini artırmak için sistem prompt'larını iyileştirebilir veya fine-tuning seçeneklerini değerlendirebilirsiniz (bkz. Fine-Tuning API Seçenekleri ve Fine-tuning vs. Prompt Engineering).
7. Pipeline'ı İyileştirin ve Ölçeklendirin
RAG pipeline'ınızı üretime almadan önce aşağıdaki iyileştirmeleri düşünün:
- Belge ön işleme: Gereksiz bilgileri temizleyin, başlık ve meta veri ekleyin.
- Chunk stratejisi: Farklı chunk boyutları ve overlap değerleri deneyin.
- Retriever ayarları: Benzerlik eşiği (score threshold) veya top-k parametrelerini optimize edin.
- Cache mekanizması: Sık sorulan sorular için yanıtları önbelleğe alın.
Ayrıca, LangChain'in sunduğu LLM Prompt Chaining özelliğiyle çok adımlı iş akışları kurabilirsiniz. Bu yöntem, RAG'ı diğer görevlerle birleştirerek daha karmaşık uygulamalar geliştirmenize olanak tanır.
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
- Embedding modeliyle belge arasında dil uyumsuzluğu: Türkçe belgeler için Türkçe destekli embedding modelleri tercih edin.
- Chunk overlap'ın ihmal edilmesi: Overlap, parçalar arasında bağlam kaybını önler; %10-20 overlap iyi bir başlangıçtır.
- LLM'in talimatlarına uygun prompt verilmemesi: RAG yanıtlarının yalnızca belgelere dayanmasını sağlamak için sistem prompt'unda açık talimat verin.
- Vektör deposunun güncellenmemesi: Belgeler değiştiğinde indeksi yeniden oluşturun veya artımlı güncelleme kullanın.
Bu rehberle LangChain kullanarak temel bir RAG pipeline'ı kurabilir ve ihtiyaçlarınıza göre özelleştirebilirsiniz. Unutmayın, başarılı bir RAG sistemi için deneme-yanılma ve sürekli iyileştirme şarttır.
Sık Sorulan Sorular
LangChain nedir ve RAG için neden kullanılır?
LangChain, dil modelleriyle uygulama geliştirmek için modüler bir framework'tür. RAG pipeline'ları oluşturmayı kolaylaştırır; belge yükleme, parçalara ayırma, embedding ve sorgu zincirleri gibi bileşenleri birleştirir.
Hangi embedding modelini seçmeliyim?
Projenizin diline ve bütçesine bağlıdır. OpenAI'nin text-embedding-ada-002 genel amaçlı iyi bir seçimdir. Türkçe için multilingual modeller (örn. paraphrase-multilingual-MiniLM-L12-v2) daha başarılı olabilir.
Vektör veritabanı olarak ne kullanmalıyım?
Chromadb, başlangıç için ideal, hafif ve yerel bir seçenektir. Ölçeklendirme gerektiğinde Pinecone, Qdrant veya Weaviate gibi bulut tabanlı çözümler değerlendirilebilir.
RAG ile LLM çıktı kalitesi nasıl artar?
RAG, LLM'in eğitim verisinde olmayan güncel ve özel bilgilere erişmesini sağlar. Bu sayede halüsinasyon riski azalır, yanıtlar daha doğru ve güvenilir olur.
Chunk boyutu nasıl belirlenir?
Belge türüne ve LLM'in bağlam penceresine göre ayarlanır. 500-1000 karakter genellikle iyi bir denge sağlar. Küçük chunk'lar hassasiyeti artırırken, büyük chunk'lar daha fazla bağlam sunar.






