Skip to main content
Temmuz 2, 2026

MATLAB ile Ücretsiz Yerel LLM Kullanarak Uçtan Uca RAG Nasıl Kurulur?

Doğukan Kaygısız
Yapay Zeka ve Makine Öğrenmesi Mühendisi

Büyük dil modelleri eğitim verisinde olmayan teknik dokümanları, proje raporlarını veya şirket içi kılavuzları bilemez ve bu bilmediği yerde genellikle istenen cevabı veremeyebilir. Retrieval-Augmented Generation (RAG) bu sorunu yapısal olarak çözer: model yanıt üretmeden önce belge koleksiyonunuzdan ilgili parçaları bulur, bu bağlamı prompt içine ekler ve kaynaklarınıza dayalı yanıt üretir.

Bu yazıda MATLAB’ın Text Analytics Toolbox ve LLMs with MATLAB Add-On araçlarını kullanarak — BM25, document embedding, hybrid search ve Ollama üzerinden ücretsiz yerel LLM entegrasyonu dahil — uçtan uca bir RAG iş akışını nasıl kurabileceğinizi adım adım ele alıyoruz.

RAG Nedir ve LLM’ler Neden RAG’e İhtiyaç Duyar?

Retrieval-Augmented Generation (RAG), büyük dil modellerinin yanıt üretmeden önce ilgili bilgi parçalarını güvenilir kaynaklardan bulmasını ve ardından bu bağlamı kullanarak cevap üretmesini sağlayan bir yaklaşımdır. Temel fikir oldukça basittir: önce ara, sonra cevap üret.

Bu yaklaşım özellikle teknik dokümanlar, ürün notları, şirket içi veriler ve güncel raporlar gibi modelin eğitim verisinde doğrudan yer almayan içerikler için önemlidir. LLM tek başına güçlü bir dil üreticisi olsa da, güncel veya kuruma özel içeriklerde hatalı ve dayanağı zayıf cevaplar verebilir. RAG, bu sorunu retrieval katmanı ile azaltır.

Kısa Terimler Sözlüğü

TerimAçıklama
LLMLarge Language Model. Büyük metin veri kümeleri üzerinde eğitilmiş ve doğal dil üretimi yapabilen model ailesi.
RAGRetrieval-Augmented Generation. Yanıt üretmeden önce ilgili içeriği bulup modele bağlam olarak veren yaklaşım.
BM25Anahtar kelime tabanlı retrieval yöntemi. Kelime sıklığı ve belge uzunluğuna göre skor üretir.
EmbeddingMetni sabit boyutlu yoğun vektörler hâline dönüştüren temsil yöntemi. Semantik benzerlik için kullanılır.
Hybrid SearchBM25 ve embedding tabanlı aramanın birlikte kullanılması.
RRFReciprocal Rank Fusion. Farklı retrieval sıralamalarını tek listede birleştiren yöntem.
t-SNEYüksek boyutlu vektörleri iki boyuta indirerek benzerlik yapısını görselleştirmeye yarayan yöntem.

MATLAB & Simulink Tarafında Kullanılan Toolbox ve Add-On’lar

Bu blog yazısındaki ana akış doğrudan MATLAB kodu üzerinden ilerler. Simulink tarafı burada zorunlu değildir, kullanılabilir.

  • MATLAB: Temel betik akışı, dosya yönetimi, veri hazırlama ve LLM çağrıları için kullanılır.
  • Text Analytics Toolbox: tokenizedDocument, splitParagraphs, bm25Similarity, documentEmbedding, embed ve cosineSimilarity gibi metin analizi ve retrieval fonksiyonlarını sağlar.
  • Large Language Models (LLMs) with MATLAB Add-On: ollamaChat ve generate gibi fonksiyonlarla Ollama, OpenAI ve Azure OpenAI bağlantılarını mümkün kılar.
  • Text Analytics Toolbox Model Support Package: all-MiniLM-L6-v2 veya all-MiniLM-L12-v2 gibi embedding modellerinin kullanılmasına yardımcı olur.
  • Database Toolbox (opsiyonel): PostgreSQL + pgvector gibi sistemlerle embedding vektörlerini veritabanında saklamak ve sorgulamak için kullanılabilir.
  • Simulink: Bu dokümandaki RAG akışının temel parçası değildir; istenirse sonraki aşamalarda uygulama genişletmesi olarak ele alınabilir.

Uçtan Uca RAG İş Akışı

Aşağıdaki akış, blog yazısında anlatacağımız uçtan uca RAG yapısını sade bir şekilde özetler. Önce belge toplama ve ön işleme yapılır; ardından retrieval katmanı ile ilgili parçalar bulunur, bu parçalar prompt içine yerleştirilir ve yerel LLM üzerinden yanıt üretilir.

Şekil 1 – MATLAB ile RAG iş akışı (NotebookLM)

Belgeleri İçeri Alma ve Ön İşleme

RAG sürecinin ilk adımı, çalışılacak belgeleri içeri almaktır. Bu belgeler web üzerinden indirilebilir veya doğrudan yerel bir klasörden okunabilir. Amaç, retrieval aşamasında kullanılabilecek temiz ve aranabilir bir doküman koleksiyonu oluşturmaktır.

Aşağıdaki örnek, belgeleri belirli bir klasöre indirir. Böylece aynı veri seti üzerinde tekrar tekrar çalışmak kolaylaşır.

url = [“https://openknowledge.worldbank.org/bitstreams/0c18c872-91f0-51a4-ba91-c36b98893b4a/download”
“https://openknowledge.worldbank.org/bitstreams/476f037b-a17e-484f-9cc2-282a2e5a929f/download”
“https://openknowledge.worldbank.org/bitstreams/0c18c872-91f0-51a4-ba91-c36b98893b4a/download”];
 
localpath = “./data/”;
if ~exist(localpath, “dir”)
    mkdir(localpath);
end
numFiles = numel(url);
for i = 1:numFiles
    filename = “WBD_” + i + “.pdf”;
    localFileName = fullfile(localpath, filename);
    if ~exist(localFileName,”file”)
        websave(localFileName, url{i}, weboptions(Timeout=30));
    end
end
 

Belgeler indirildikten sonra, farklı dosya tipleri tek bir akışta okunabilir. extractFileText fonksiyonu, PDF veya DOCX gibi formatlardan metin çıkarmayı sağlar. Ardından preprocessDocuments yardımcı fonksiyonu ile metin, paragraf tabanlı daha küçük birimlere ayrılır.

readFcn = @extractFileText;
filePattern = [“.txt”,”.pdf”,”.docx”,”.html”,”.htm”];
fds = fileDatastore(localpath,’FileExtensions’,filePattern,’ReadFcn’,readFcn);
 
str = readall(fds);
str = [str{:}];
 
documents = preprocessDocuments(str);

Aşağıdaki yardımcı fonksiyon, belgeleri tokenize eder ve retrieval için uygun paragraf parçalarına dönüştürür.

function allDocs = preprocessDocuments(str)
    tokenized = tokenizedDocument(join(str,[newline newline]));
    allDocs = splitParagraphs(tokenized);
end
 
function wrappedText = wrapText(text)
    s = textwrap(text,80);
    wrappedText = string(join(s,newline));
end

BM25 ile Anahtar Kelime Tabanlı Retrieval

Şekil 2 – BM25  tabanlı Retrieval (ChatGPT)

BM25, klasik ve güçlü bir sparse retrieval yöntemidir. Kullanıcı sorgusundaki kelimeleri belge parçalarıyla karşılaştırır; kelime sıklığı ve belge uzunluğu gibi ölçütlere göre en ilgili parçaları öne çıkarır. Özellikle belirli ürün adları, fonksiyon isimleri veya teknik terimler gibi açık anahtar kelimelerde oldukça etkilidir.

İlk örnek, BM25 skorlarını hesaplar ve dokümanları en yüksek skordan en düşüğe doğru sıralar.

scores = bm25Similarity(documents,query);
[~,idx] = sort(scores,”descend”);
 
rankSparse = 1:length(documents);
rankSparse(idx) = rankSparse;

Pratikte retrieval sonuçlarının tamamı prompt içine gönderilmez. Bunun yerine, en alakalı parçalar seçilir ve toplam kelime sayısı belirli bir sınırda tutulur. Aşağıdaki örnek bu seçimi göstermektedir.

query = “What technical criteria can be used to streamline new approvals for grid-friendly DPV?”;
 
embQuery = bm25Similarity(documents, tokenizedDocument(query));
 
[~, idx] = sort(embQuery, “descend”);
limitWords = 1000;
selectedDocs = [];
totalWords = 0;
 
i = 1;
while totalWords <= limitWords && i <= length(idx)
    totalWords = totalWords + doclength(documents(idx(i)));
    selectedDocs = [selectedDocs; joinWords(documents(idx(i)))];
    i = i + 1;
end

Document Embedding ile Semantik Retrieval

Şekil 3 – Semantik Retrieval (ChatGPT)

BM25 aynı kelimeleri yakalamakta güçlüdür; ancak sorgu ile doküman benzer anlam taşısa bile aynı terimleri kullanmıyorsa bazı ilgili parçalar gözden kaçabilir. Bu nedenle embedding tabanlı retrieval, metinlerin semantik olarak birbirine ne kadar yakın olduğunu ölçmek için kullanılır.

Aşağıdaki örnekte all-MiniLM-L12-v2 modeli ile hem dokümanlar hem de kullanıcı sorgusu vektör uzayında temsil edilir. Daha sonra cosineSimilarity ile benzerlik hesaplanır.

emb = documentEmbedding(Model=”all-MiniLM-L12-v2″);
embeddedDocuments = embed(emb,documents);
embeddedQuery = embed(emb,query);
 
scores = cosineSimilarity(embeddedDocuments,embeddedQuery);
[~,idx] = sort(scores,”descend”);
 
rankDense = 1:length(documents);
rankDense(idx) = rankDense;

Hybrid Search ve Reciprocal Rank Fusion (RRF)

Şekil 4 – Hybrid yaklaşım (BM25 + Embedding) (ChatGPT) 

Birçok gerçek senaryoda en iyi sonuç, yalnızca BM25 veya yalnızca embedding kullanmak yerine bu iki yaklaşımı birleştirmekle elde edilir. BM25 açık terimleri yakalarken, embedding semantik yakınlığı yakalar. Hybrid search bu iki güçlü tarafı bir araya getirir.

Reciprocal Rank Fusion (RRF), sparse ve dense retrieval sıralamalarını tek bir listede birleştirmek için kullanılan pratik bir yöntemdir. Aşağıdaki örnek, iki sıralamayı bir RRF skoru ile birleştirmektedir.

k = 60;
rrfScores = 1./(k*rankSparse) + 1./(k*rankDense);

💡 Neden Hybrid Search?

BM25, sorguda geçen açık terimleri güçlü şekilde yakalar. Embedding retrieval ise farklı kelimeler kullanılsa bile anlamca yakın içerikleri öne çıkarabilir. Hybrid yaklaşım, her iki yöntemin güçlü yanlarını aynı akışta birleştirir.

Örneğin “Büyük kurbağa küçük gölette” ve “Küçük kurbağa büyük gölette” cümleleri aynı kelimeleri içerir; ancak kelimelerin cümle içindeki rolleri değiştiği için anlamları farklıdır. Embedding tabanlı yöntemler, kelime sırasını, bağlamı ve anlamsal ilişkiyi dikkate alarak bu tür farkları yakalamada daha başarılıdır.

Vektörleri Veritabanında Saklama

Küçük örneklerde embedding vektörlerini doğrudan MATLAB değişkenlerinde tutmak yeterli olabilir. Ancak doküman sayısı büyüdüğünde, vektörleri bir veritabanında saklamak ve sorgulamak daha sürdürülebilir bir yapıdır. PostgreSQL + pgvector bu amaçla sık kullanılan bir seçenektir.

Aşağıdaki örnek, embedding modelinin hazırlanmasını ve sorgu vektörünün SQL tarafında benzerlik araması için kullanılmasını göstermektedir.

modelName = “all-MiniLM-L12-v2”;
embeddingModel = documentEmbedding(Model = modelName);
 
query = “Will Federal Fund rate decrease after FOMC meeting in the following 3 months?”
embeddedQuery = embed(embeddingModel,query)
sqlEmbeddedQuery = “‘[” + join(string(embeddedQuery),”,”) + “]'”;
sqlCosineSimilarity = “SELECT text FROM embeddings_FOMC ORDER BY 1 – (embedding <=> ” + sqlEmbeddedQuery + “) DESC LIMIT 30”;
selectedDocs = fetch(conn,sqlCosineSimilarity);
head(selectedDocs,10)

Ollama ile Ücretsiz Yerel LLM’i MATLAB’e Dahil Etme

Retrieval adımı hazır olduğunda sıra, yerel LLM’i sürece dahil etmeye gelir. Ollama, açık kaynak ve ücretsiz modelleri yerel ortamda çalıştırmayı kolaylaştırır. MATLAB tarafında ise LLMs with MATLAB Add-On içindeki ollamaChat fonksiyonu kullanılarak bu modele bağlanılabilir.

Önce kullanılacak model Ollama üzerinden indirilir. Ardından MATLAB içinde bir chat nesnesi oluşturulur.

>> !ollama pull mistral
 
chat = ollamaChat(“mistral-nemo”, …
    “You are a helpful assistant. You will get a ” + …
    “context for each question, but only use the information ” + …
    “in the context if that makes sense to answer the question. ” + …
    “Lets think step-by-step, explaining how you reached the answer.”, …
    TimeOut=600);

Prompt İçine Context Yerleştirme ve Yanıt Üretimi

Bu aşamada retrieval katmanından gelen selectedDocs içeriği, prompt içindeki Context bölümüne eklenir. Böylece model, yalnızca genel bilgisine göre değil, retrieval ile seçilen spesifik bilgi parçalarına dayanarak yanıt üretir.

Aşağıdaki örnek, promptun nasıl kurulduğunu ve generate ile son yanıtın nasıl üretildiğini göstermektedir.

prompt = “Context:” + join(selectedDocs, ” “) + newline + …
    “Answer the following question: ” + query;
response = generate(chat, prompt);
 
wrapText(response)

t-SNE ile Retrieval Sonuçlarını Değerlendirme

Şekil 4 – t-SNE ile sonuçların değerlendirilmesi (Medium- Retheesh Ravi)

Retrieval kalitesini sadece “yanıt iyi görünüyor” şeklinde değerlendirmek yerine, kullanılan vektör temsilini daha analitik biçimde incelemek de mümkündür. Amaç, sorgu ile dönen dokümanların vektör uzayında birbirine ne kadar yakın olduğunu görsel olarak yorumlamaktır.

Sonuç

Bu yazıda, MATLAB kullanarak ücretsiz yerel LLM’lerle uçtan uca bir Retrieval-Augmented Generation (RAG) iş akışının nasıl kurulabileceğini ele aldık. Temel akış; belgelerin içeri alınması, ön işlenmesi, ilgili parçaların retrieval yöntemleriyle seçilmesi, bu parçaların prompt içine context olarak eklenmesi ve yerel LLM üzerinden yanıt üretilmesi adımlarından oluşur.

RAG yaklaşımı, LLM’lerin yalnızca genel bilgisine dayanmak yerine güvenilir dokümanlardan getirilen içerikle yanıt üretmesini sağlar. Bu sayede özellikle teknik dokümanlar, ürün notları, raporlar ve kuruma özel bilgi tabanları üzerinde daha kontrollü ve açıklanabilir cevaplar üretilebilir.

MATLAB tarafında Text Analytics Toolbox ile BM25, document embedding ve hybrid search gibi retrieval yaklaşımları uygulanabilirken, LLMs with MATLAB Add-On ile Ollama üzerinden çalışan yerel modeller sürece dahil edilebilir. Küçük veri setlerinde doküman parçaları ve embedding vektörleri MATLAB değişkenleri içinde yönetilebilir; daha büyük koleksiyonlarda ise PostgreSQL + pgvector gibi veritabanı çözümleri kullanılabilir.

Sonuç olarak, MATLAB ile RAG yalnızca bir LLM çağrısından ibaret değildir. Veri hazırlama, retrieval, context oluşturma, yerel model entegrasyonu ve sonuç değerlendirme adımlarını tek bir teknik iş akışında birleştiren uygulanabilir bir yaklaşımdır.

© FİGES A.Ş. Tüm hakları saklıdır. Tasarım ordek.co.