Getiri Destekli Üretim (RAG), büyük dil modellerini (LLM) harici bilgiye dayandırarak etkileşim biçimimizi dönüştürmüştür. Ancak, çıktının kalitesi büyük ölçüde getirilen bağlamın kalitesine bağlıdır. Vektör benzerlik araması genel olarak ilgili belgeleri bulmak için etkili olsa da, hassas anlamsal hizalama konusunda genellikle zorluk yaşar ve LLM'i karıştırabilecek "yanlış pozitiflere" yol açabilir. İşte yeniden sıralama devreye girer.
Neden Yeniden Sıralama Temeldir
Standart vektör arama algoritmaları genellikle sorguyu ve belgeyi bağımsız olarak kodlayan çift kodlayıcıları (bi-encoder) kullanır. Bu yöntem hızlı ve ölçeklenebilir olsa da, ince ayrıntılı ilişkileri yakalamak için sorgu ve belge token'ları arasındaki etkileşimi ele alma yeteneğinden yoksundur. Yeniden sıralama, ilk arama tarafından döndürülen en üst K adayına, genellikle çapraz kodlayıcıları (cross-encoder) içeren daha hesaplama yoğun bir işlem uygular. Sorgu ile her bir belge arasındaki etkileşimi analiz ederek, yeniden sıralayıcı (re-ranker) daha doğru bir alaka puanı atar ve en alakalı parçaları listenin en üstüne taşır.
Çapraz Kodlayıcılar (Cross-Encoders) vs. Çift Kodlayıcılar (Bi-Encoders)
Farkı anlamak kritiktir. Bir çift kodlayıcı, sorgu ve belge için ayrı gömme (embedding) oluşturur ve bunlar arasındaki kosinüs benzerliğini hesaplar. Öte yandan bir çapraz kodlayıcı, sorguyu ve belgeyi tek bir birleştirilmiş giriş olarak alır ve bunları dönüştürücü (transformer) modeli üzerinden eşzamanlı olarak işler. Bu, bağımsız kodlamada kaybolan bağlam bağımlılıklarını modelin anlamasına olanak tanır. Çapraz kodlayıcılar daha yavaş olsa da, önemli ölçüde daha doğru olduklarından, yalnızca küçük bir belge alt kümesini (örneğin, 1000 belgeden en üst 20'si) işlemek gerektiği yeniden sıralama aşaması için idealdir.
Python'da Yeniden Sıralamanın Uygulanması
Modern yapay zeka çerçeveleri kullanılarak bir yeniden sıralayıcıyı RAG boru hattınıza entegre etmek basittir. Aşağıda, performans ve kullanım kolaylığı dengesi nedeniyle popüler bir tercih olan `sentence-transformers` kütüphanesi ve bir çapraz kodlayıcı modeliyle bir örnek bulunmaktadır.
from sentence_transformers import CrossEncoder
from typing import List, Tuple
class ReRanker:
def __init__(self, model_name: str = "cross-encoder/ms-marco-MiniLM-L-6-v2"):
self.model = CrossEncoder(model_name)
def rerank(self, query: str, documents: List[str], top_k: int = 5) -> List[Tuple[int, float]]:
"""
Belgeleri, sorguya olan alakalarına göre yeniden sıralar.
Args:
query: Arama sorgu dizesi.
documents: Yeniden sıralanacak belge dizi listesi.
top_k: Döndürülecek en üst sonuç sayısı.
Returns:
(belge_indeksi, puan) içeren demetlerin (tuple) listesi.
"""
# Giriş çiftlerini (sorgu, belge) hazırla
inputs = [(query, doc) for doc in documents]
# Çiftleri puanla
scores = self.model.predict(inputs)
# En üst K puanın indekslerini al
top_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:top_k]
# Orijinal indeksleri ve puanları döndür
return [(idx, scores[idx]) for idx in top_indices]
# Kullanım Örneği
query = "Zencefilin sağlık faydaları nelerdir?"
documents = [
"Zencefilin iltihap giderici özellikleri vardır ve bulantıya yardımcı olabilir.",
"Bugün Londra'da hava güneşli.",
"Zencefil çayı, soğuk algınlığı ve sindirim sorunları için popüler bir çaredir.",
"Python popüler bir programlama dilidir.",
"Tarçınlı kurabiyeler, zencefil dahil olmak üzere baharatlarla yapılır."
]
reranker = ReRanker()
results = reranker.rerank(query, documents, top_k=3)
for idx, score in results:
print(f"Puan: {score:.4f} | Belge: {documents[idx]}")
En İyi Uygulamalar ve Dikkat Edilmesi Gerekenler
- Gecikme (Latency) Takasları: Yeniden sıralayıcıya iletilen aday sayısını her zaman sınırlayın. 1000 belgenin yeniden sıralanması gecikmeyi önemli ölçüde artıracaktır. Vektör aramadan gelen en üst 20-50 sonucun yeniden sıralanması ideal bir denge noktasıdır.
- Model Seçimi: Alanınıza benzer verilerle eğitilmiş bir yeniden sıralayıcı seçin.
ms-marco-MiniLMgibi genel amaçlı modeller genel bilgi için iyi çalışır, ancak alanına özgü modeller (örneğin, hukuki veya tıbbi metinler için) daha iyi sonuçlar verebilir. - Entegrasyon: LLM'e iletilen parça sayısını dinamik olarak ayarlamak için yeniden sıralanmış puanları kullanın. En üst puan çok düşükse, daha geniş bir aramaya veya hiç getiri yapmamaya geri düşmeyi düşünün.
Sonuç
Yeniden sıralama, yüksek kaliteli RAG sistemleri oluşturmanın kritik bir bileşenidir. Bu rafineleme katmanını ekleyerek, halüsinasyonları önemli ölçüde azaltabilir ve LLM çıktılarınızın gerçeklik doğruluğunu artırabilirsiniz. Çapraz kodlayıcı modeller hız ve verimlilik açısından gelişmeye devam ettikçe, hızlı yaklaşık arama ile hassas alaka puanlaması arasındaki fark daralacak ve yeniden sıralama, yapay zeka mühendisinin araç setinde giderek daha erişilebilir ve temel bir araç haline gelecektir.