Local AI

Yerel RAG Boru Hattı Oluşturma: Özel Belge Soru-Cevap için Vektör Veritabanlarını llama.cpp ile Entegre Etme

Veri gizliliğinin ön planda olduğu bir çağda, hassas bilgiler için üçüncü taraf Büyük Dil Modeli (LLM) API'lerine güvenmek giderek imkansız hale geliyor. Geliştiriciler, verinin asla makineden ayrılmadığını garantileyen yerel çalışma ortamlarına yöneliyor. Bu amaç için en güçlü mimarilerden biri, bir LLM'nin yanıtlarını belirli, kullanıcıya ait verilerle temellendiren Alıntıyla Artırılmış Üretim (RAG)'dir. llama.cpp'yi verimli yerel çıkarım için sağlam vektör veritabanlarıyla birleştirerek güvenli, çevrimdışı ve son derece doğru bir Belge Soru-Cevap sistemi oluşturabilirsiniz.

Yerel RAG Mimarisi Anlama

Geleneksel bir RAG boru hattı üç temel aşamadan oluşur: emme (ingestion), arama (retrieval) ve üretim (generation). Emme aşaması, belgeleri parçalara ayırma ve bunları yoğun vektör gömme (embedding) dönüşümlerine tabi tutmayı içerir. Arama, en ilgili parçaları bulmak için vektör uzayında arama yapar. Son olarak, üretim bu parçalardan alınan bağlamı kullanarak bir yanıt oluşturur. Bu işlemi yerel olarak gerçekleştirirken, temel zorluk hız ve doğruluğu korurken donanım kısıtlamaları için optimizasyon sağlamaktır. llama.cpp, CPU ve GPU'lardaki donanım hızlandırmadan yarar sağlayan bir C++ arka ucu sunarak burada öne çıkar ve hatta tüketici sınıfı dizüstü bilgisayarlarda bile erişilebilir hale getirir.

Ortamın Hazırlanması

Başlamak için, gerekli kütüphanelerle donatılmış bir Python ortamına ihtiyacınız vardır. Boru hattı düzenlemesi için langchain, hafif vektör depolama için chromadb ve çıkarım motoru için llama-cpp-python kullanacağız. Yerel dizininize indirilmiş, nicemlenmiş bir GGUF modelinin (örneğin Llama-3-8B veya Mistral) olduğundan emin olun.

Bağımlılıkları pip kullanarak yükleyin:


pip install langchain chromadb llama-cpp-python langchain-community sentence-transformers

Vektör Mağazasının Uygulanması

Herhangi bir RAG boru hattındaki ilk adım, yapılandırılmamış metinleri işlemektir. Belgeleri parçalara ayırmamız ve her bir bölüm için gömlemeler (embeddings) oluşturmamız gerekir. LangChain, belge bölenleri ve gömleme modelleri sayesinde bu işlemi basitleştirir. Yerel yürütme için, CPU üzerinde verimli çalışan hafif gömleme modellerini kullanabiliriz.


from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma

# Belgeleri yükle ve parçala
loader = TextLoader("my_private_data.txt")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

# Yerel gömlemeleri başlat
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

# Vektör veritabanını oluştur
db = Chroma.from_documents(texts, embeddings)

Bu kod, veriyi diskinizde kalıcı hale getiren yerel bir ChromaDB örneği oluşturarak tam gizlilik sağlar. all-MiniLM-L6-v2 modeli, hız ve anlamsal doğruluk arasındaki dengesinden dolayı seçilmiştir.

Üretim İçin llama.cpp Entegrasyonu

Arama bileşeni hazır olduğunda, dil modelini yapılandırırız. llama-cpp-python GGUF modellerini doğrudan yüklememize olanak tanır. Modelin soruyu yanıtlamak için yalnızca sağlanan bağlamı kullanmasını söyleyen bir istem şablonu tanımlamalıyız; bu durum halüsinasyonları önler.


from langchain.llms import LlamaCpp
from langchain.chains import RetrievalQA
import os

# Yerel GGUF modelinize işaret edin
model_path = "./models/llama-3-8b-instruct.Q4_K_M.gguf"

llm = LlamaCpp(
    model_path=model_path,
    n_gpu_layers=-1,
    max_tokens=500,
    n_ctx=2048,
    temperature=0,
    verbose=True
)

# RAG zincirini oluştur
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=db.as_retriever(search_kwargs={"k": 2})
)

# Sistemi sorgula
response = qa_chain.run("Metinde belirtilen temel güvenlik protokolleri nelerdir?")
print(response)

Optimizasyon ve En İyi Uygulamalar

RAG'ı yerel olarak çalıştırırken bellek yönetimi kritiktir. Bellek Yetersizliği (OOM) hatalarıyla karşılaşırsanız, modellerinizi daha da nicemlemeyi (örneğin Q3_K_S) veya n_ctx parametresini düşürmeyi düşünün. Ayrıca, parça boyutunuzu ince ayar yapmak, arama doğruluğunu önemli ölçüde etkileyebilir. Çok küçükse bağlam kaybolur; çok büyükse gömleme özgüllüğünü yitirir. 300 ile 800 token arasında parça boyutları üzerinde deneme yapmak iyi bir başlangıç noktasıdır.

Sonuç

llama.cpp ile yerel bir RAG boru hattı oluşturmak, geliştiricilere veri egemenliğinden ödün vermeden büyük dil modellerinin yeteneklerinden yararlanma imkanı tanır. Verimli arama için ChromaDB gibi vektör veritabanlarını entegre ederek ve GGUF modellerinin verimliliğinden yararlanarak, hem gizli hem de performanslı bir sistem yaratırsınız. Donanım gelişmeye devam ederken ve yerel AI modelleri daha karmaşık hale geldikçe, güvenli ve zeki uygulamalar dağıtmanın önündeki engeller daha da azalacaktır. Özel bilgi tabanınızı bugün oluşturmaya başlayın.

Share: