Retrieval-Augmented Generation (RAG)

Anlamsal Aramayı Ustalaşmak: Modern RAG Sistemlerinin Omurgası

Geleneksel anahtar kelime tabanlı arama motorları bağlamı anlayamaz. Bir kullanıcı "kırık bir boruyu nasıl onarırım" arattığında, anahtar kelime araması "tesisat tamiri" veya "sızıntı çözümü" içeren belgeleri kaçırabilir. İşte Anlamsal Aramanın parladığı yer burasıdır. Metni yüksek boyutlu vektör temsilcilerine (gömme) dönüştürerek, yalnızca tam eşleşen dizgeleri değil, içeriğin altındaki anlamı yakalayabiliriz. Geri Beslemeli Üretim (RAG) sistemleri geliştiren geliştiriciler için anlamsal arama yalnızca bir optimizasyon değil, Büyük Dil Modellerinin (LLM) ilgili bağlamı alması için kritik ilk adımdır.

Anlamsal Arama Nasıl Çalışır?

Anlamsal arama, vektörler arasındaki kosinüs benzerliği veya nokta çarpımı mesafesi ilkesine dayanır. Süreç iki ana aşamadan oluşur:

  1. Gömme Üretimi: Ön-eğitilmiş bir dönüştürücü modeli (Sentence-BERT veya OpenAI'nin Gömme API'si gibi) kullanarak, metin parçacıkları sayısal vektörlere dönüştürülür. Benzer anlamlar, çok boyutlu uzayda birbirine yakın vektörlere yol açar.
  2. Vektör Geri Getirme: Bir sorgu yapıldığında, bu da gömme olarak işlenir. Sistem daha sonra, sorgu vektörüne en yakın $K$ komşuyu (KNN) bulmak için bir vektör dizininde arama yapar.

FAISS ile Anlamsal Arama Uygulaması

Facebook AI Benzerlik Araması (FAISS), yoğun vektörlerde verimli benzerlik araması için popüler bir kütüphanedir. Aşağıda, Python, FAISS ve Hugging Face'in transformers'ı kullanarak bir anlamsal arama hattı kurmanın pratik bir örneği verilmiştir.

import faiss
import numpy as np
from transformers import AutoTokenizer, AutoModel

def get_sentence_embeddings(sentences, model_name='sentence-transformers/all-MiniLM-L6-v2'):
    """Bir cümle listesi için normalize edilmiş gömme üretir."""
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModel.from_pretrained(model_name)
    
    inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
    with torch.no_grad():
        output = model(**inputs)
        embeddings = output.last_hidden_state[:, 0, :]  # [CLS] token
        embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1)
    return embeddings.cpu().numpy()

# 1. Veri Hazırlama
documents = [
    "The sky is blue during the day.",
    "Python is a popular programming language.",
    "Machine learning models require large datasets.",
    "The ocean is vast and deep."
]

# 2. Belge Gömmelerini Üretme
doc_embeddings = get_sentence_embeddings(documents)
doc_embeddings = np.float32(doc_embeddings)

# 3. FAISS Dizini Oluşturma (İç Çarpım)
dimension = doc_embeddings.shape[1]
index = faiss.IndexFlatIP(dimension)
index.add(doc_embeddings)

# 4. Arama Yapma
query = "What is the weather like outside?"
query_embedding = get_sentence_embeddings([query])
query_embedding = np.float32(query_embedding)

# En alakalı 2 belgeyi ara
k = 2
distances, indices = index.search(query_embedding, k)

for i, doc_idx in enumerate(indices[0]):
    print(f"Score: {distances[0][i]:.4f} | Doc: {documents[doc_idx]}")

Üretim Sistemleri İçin En İyi Uygulamalar

  • Parçalama Stratejisi: Gömme hassasiyetini artırmak için büyük belgeleri daha küçük, bağlamsal olarak tam parçalara (ör. 100-500 token) ayırın.
  • Hibrit Arama: En iyi sonuçları almak için anlamsal aramayı BM25 (anahtar kelime araması) ile birleştirin. Bu, nadir özel isimlerin veya belirli kodların hâlâ geri getirilebilir olmasını sağlar.
  • Yeniden Sıralama: Son doğruluğu artırmak için vektör aramasının döndürdüğü en üst $N$ aday için bir çapraz kodlayıcı (cross-encoder) modeli kullanın.

Sonuç

Anlamsal arama, yapılandırılmamış veriler ile zekâ uygulamaları arasındaki köprüdür. Vektör veritabanlarını ve sağlam gömme modellerini kullanarak, RAG hatlarının performansını önemli ölçüde artırabilir ve LLM'lerinizin olası en alakalı bağlama erişimini sağlayabilirsiniz. FAISS ile küçük başlayın, ancak veri hacminiz büyüdükçe Pinecone, Weaviate veya Milvus gibi özel vektör veritabanlarına ölçeklendirmeyi düşünün.

Share: