Retrieval-Augmented Generation (RAG) sistemleri statik varlıklar değildir; arama katmanlarının kalitesiyle yaşar ve ölürler. Bu katman için en ince ama yıkıcı tehditlerden biri gömme kaymasıdır (embedding drift). Korpusunuz büyüdükçe, model sürümleri güncellendikçe veya belge anlamları değiştikçe, saklanan vektörler arasındaki geometrik ilişkiler bozulabilir; bu da alakasız aramalara ve halüsinasyonlu yanıtlara yol açar. Bu rehber, dinamik ortamlarda vektör tutarlılığını korumak için teknik stratejileri ele alır.
Gömme Kaymasını Anlama
Gömme kayması, yeni veya güncellenmiş belgelerin vektör uzayındaki temsilinin, anlamları benzer kalsa bile daha önce saklanan belgelerden sapması durumunda ortaya çıkar. Bu durum şu nedenlerden kaynaklanabilir:
- Model Güncellemeleri: Sentence-Transformer sürüm A'dan B'ye yükseltme, tüm vektör uzayını değiştirir.
- Korpus Kayması: Yeni belgeler yeni sözcük dağarcıkları veya kavramlar getirerek vektör uzayının merkezini kaydırır.
- Ön İşleme Değişiklikleri: Parçalama stratejileri veya normalizasyon tekniklerindeki değişiklikler, metnin vektörlere nasıl eşlendiğini değiştirir.
Strateji 1: Sürüm Kontrolü Yapılmış Vektör Endeksleri
En sağlam çözüm, vektör endekslerini kod sürümleri gibi ele almaktır. Mevcut vektörlerin üzerine asla yazmayın. Bunun yerine, her model veya ön işleme sürümü için yeni endeks bölümleri oluşturun.
import chromadb
from datetime import datetime
# İstemciyi başlat
client = chromadb.PersistentClient(path="./chroma_db")
def create_versioned_index(collection_name, model_version, embedding_fn):
"""
Belirli bir model sürümü için yeni bir koleksiyon oluşturur.
Mevcut veriler DEĞİŞTİRİLMEZ, bu da eski sorgular için tutarlılık sağlar.
"""
versioned_name = f"{collection_name}_v{model_version}"
# Koleksiyonun var olup olmadığını kontrol et
if versioned_name not in client.list_collections():
# Tutarlı mesafe metrikleri için kosinüs benzerliği yapılandır
client.create_collection(
name=versioned_name,
metadata={"hnsw:space": "cosine", "model_version": model_version, "created_at": datetime.utcnow().isoformat()}
)
print(f"Yeni endeks oluşturuldu: {versioned_name}")
else:
print(f"Endeks {versioned_name} zaten mevcut.")
return client.get_collection(versioned_name)
# Kullanım örneği
# col_v1 = create_versioned_index("docs", "1.0.0", lambda x: embed_v1(x))
# col_v2 = create_versioned_index("docs", "2.0.0", lambda x: embed_v2(x))
Strateji 2: Çapa Noktaları ve Normalizasyon
Eğer tek bir endeks kullanmak zorundaysanız (örneğin kaynak kısıtlamaları nedeniyle), çapa noktaları kullanarak bir "kayma algılama" mekanizması uygulayın. Temel kavramları temsil eden küçük ve kararlı bir referans belgeleri seti (çapalar) seçin. Bu çapalar ile mevcut gömmeleri ve tarihsel gömmeleri arasındaki benzerliği düzenli olarak hesaplayın.
import numpy as np
def check_drift(anchor_embeddings_current, anchor_embeddings_history, threshold=0.05):
"""
Çapa noktalarının mevcut ve tarihsel gömmeleri arasındaki kosinüs benzerliğini karşılaştırır.
"""
# Vektörleri normalize et
current_norm = anchor_embeddings_current / np.linalg.norm(anchor_embeddings_current, axis=1, keepdims=True)
history_norm = anchor_embeddings_history / np.linalg.norm(anchor_embeddings_history, axis=1, keepdims=True)
# Çiftli kosinüs benzerliğini hesapla
similarities = np.dot(current_norm, history_norm.T)
# Tüm çapalar üzerinden ortalama benzerlik
avg_similarity = np.mean(similarities)
if avg_similarity < (1 - threshold):
raise Exception(f"Gömme Kayması Algılandı: Ortalama Benzerlik {avg_similarity:.4f}, eşik değerin {1-threshold} altında")
else:
print(f"Kayma Kontrolü Başarılı: Ortalama Benzerlik {avg_similarity:.4f}")
# Örnek:
# current_anchors = get_embeddings(anchor_texts, model_version="v2")
# history_anchors = get_embeddings(anchor_texts, model_version="v1")
# check_drift(current_anchors, history_anchors)
Strateji 3: Sürekli Yeniden Gömme Hattı (Pipelines)
Yeniden gömme işlemini CI/CD hattınıza entegre edin. Bir model güncellemesi tetiklendiğinde, yalnızca farkı (yeni/değişen belgeleri) yeni endeks sürümüne yeniden gömmek için arka planda bir iş zamanlayın. Geçiş döneminde, sorguların hem eski hem de yeni endekslerden ağırlıklı puanlarla sunulduğu bir çift yazma (dual-write) stratejisi kullanın; güven arttıkça ağırlığı kademeli olarak yeni endekse kaydırın.
Sonuç
Gömme kayması, dinamik RAG sistemlerinin kaçınılmaz bir sonucudur, ancak yönetilebilir. Sürüm kontrolü yapılmış endeksleri benimseyerek, çapa tabanlı kayma algılama uygulayarak ve yeniden gömme hatlarını otomatikleştirerek, arama katmanınızın tutarlı ve güvenilir kalmasını sağlayabilirsiniz. Vektör uzayınızı veritabanı şemanızla aynı titizlikle ele alın—izleyin, sürümleyin ve dağıtım öncesi test edin.