Yapay zeka hızla gelişiyor ancak Büyük Dil Modelleri (LLM'ler) hala kritik bir sınırlamadan muzdarip: yalnızca eğitildikleri verileri biliyorlar. Bu durum, özel verilere, güncel olaylara veya alana özgü bilgilere yaklaşırken önemli bir boşluk yaratır. Geri Alım-Artırılmış Üretim (RAG), yapay zekanın yanıt üretmeden önce dış kaynaklardan ilgili bilgileri almasını sağlayarak bu boşluğu kapatır. Bu kılavuzda, LangChain ve Vektör Veritabanları kullanarak sağlam bir RAG işlem hattı nasıl oluşturulacağını keşfedeceğiz.
RAG Mimarisi Anlamak
Özünde bir RAG sistemi iki ana aşamadan oluşur: dizin oluşturma (indexing) ve geri alma (retrieval). Dizin oluşturma aşamasında, yapılandırılmamış verileri (PDF'ler, markdown dosyaları veya veritabanı kayıtları gibi) işler ve bunları gömme (embeddings) adı verilen sayısal temsillere dönüştürür. Bu görmeler, benzerlik aramasına olanak tanıyan bir vektör veritabanında saklanır. Geri alma aşamasında, bir kullanıcı bir soru sorduğunda sistem sorguyu bir görmeye dönüştürür, veritabanındaki en benzer belgeleri bulur ve bu belgeleri LLM'e doğru ve temellendirilmiş bir yanıt üretmesi için bağlam olarak besler.
Ortamı Hazırlama
Koda dalmadan önce Python'un yüklü olduğundan emin olun. Birkaç temel kütüphaneye ihtiyacımız olacak: orkestrasyon çerçevesi için langchain, belirli entegrasyonlar için langchain-community ve bir vektör deposu. Bu örnekte yerel depolama için faiss-cpu kullanacağız, ancak üretim ortamları genellikle Pinecone, Weaviate veya Elasticsearch kullanır.
Bağımlılıkları pip kullanarak yükleyin:
pip install langchain langchain-community langchain-openai faiss-cpython python-dotenv
OpenAI API anahtarınızı güvenli bir şekilde saklamak için bir .env dosyası oluşturun:
OPENAI_API_KEY=buraya_api_anahtarınız
Adım 1: Belge Yükleme ve Parçalama
LLM'lerin bağlam penceresi sınırları vardır, bu nedenle belgelerimizi daha küçük parçalara bölmemiz gerekir. Anlamsal anlamın korunmasını sağlayarak metni yönetilebilir parçalara ayırmak için RecursiveCharacterTextSplitter kullanacağız.
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader
# Belgeleri yükle
loader = PyPDFLoader("ornek.pdf")
documents = loader.load()
# Parçalara ayır
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
Adım 2: Görmeler ve Vektör Depolama
Ardından, bu metin parçalarını vektörlere dönüştürmemiz gerekir. OpenAI'nin gömme modelini ve bir FAISS vektör deposunu kullanacağız. Bu adım, sohbet botumuzun "hafızasını" oluşturur.
from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
Adım 3: Geri Alıcıyı ve Zinciri Oluşturma
Artık sohbet botunun bilgiyi nasıl geri alacağını tanımlıyoruz. Vektör deposumuzdan bir geri alıcı oluşturuyoruz ve nihai zinciri oluşturmak için bunu bir LLM ile birleştiriyoruz. İşte RAG'ın "Üretim" kısmının gerçekleştiği yer. LLM, geri alınan bağlamı ve kullanıcının sorusunu alarak bir yanıt oluşturur.
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# Geri alma soru-cevap zincirini oluştur
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
Adım 4: Sohbet Botu ile Etkileşim
Son olarak, RAG sistemimize sorgu gönderebiliriz. Bir kullanıcı bir soru sorduğunda, sistem PDF'ten ilgili parçaları geri alır, bunları LLM'e besler ve yalnızca sağlanan metne dayalı bir yanıt döndürür.
query = "Belgedeki temel bulgular nelerdir?"
result = qa_chain.invoke({"query": query})
print(result["result"])
Sonuç
RAG destekli bir sohbet botu oluşturmak, statik LLM'leri dinamik ve bilgiye sahip asistanlara dönüştürür. Vektör veritabanlarından ve LangChain'den yararlanarak geliştiriciler, yalnızca zeki değil, aynı zamanda doğru ve güncel olan uygulamalar oluşturabilir. Bu örnek FAISS ve yerel PDF'leri kullansa da, aynı ilkeler kurumsal ölçekli veri göllerine ve gerçek zamanlı veritabanlarına uygulanır. Uygulamanızı iyileştirirken, performansı belirli kullanım durumunuz için optimize etmek üzere farklı gömme modelleri, parçalama stratejileri ve geri alma teknikleri denemeyi düşünün.