Geri Getirme Artırmalı Üretim (RAG), Büyük Dil Modellerini (LLM) özel veya tescilli verilerle bağlamak için endüstri standardı haline gelmiştir. Ancak, RAG hatlarında en yaygın hata noktası üretim aşaması değil, geri getirme aşamasıdır. Eğer geri getirilen bağlam alakasız, gürültülü veya parçalıysa, altta yatan model ne kadar güçlü olursa olsun, LLM kaçınılmaz şekilde halüsinasyon üretir veya optimum olmayan yanıtlar verir.
Güçlü RAG sistemleri oluşturmak için mühendisler süreci başa almalıdır: değerlendirme, bağlam üreteceye kadar asla geçmeden önce geri getirme adımında gerçekleşmelidir. Bu yazı, RAG hattınızın yüksek kaliteli yanıtlar sunduğundan emin olmak için bağlam ilgililiğini nasıl titizlikle ölçeceğinizi ve gürültü azaltmayı nasıl nicelendireceğinizi inceler.
Kör Üretimin Sorunu
Geleneksel değerlendirme metrikleri olan ROUGE veya BLEU, modern RAG sistemleri için yetersizdir çünkü oluşturulan metni destekleyici bağlamın kalitesini görmezden gelerek, gerçek referans yanıtlarla karşılaştırır. Bir model, geri getirilen "gürültüye" dayalı olarak tutarlı ancak gerçeğe aykırı bir yanıt üretebilir.
Etkili değerlendirme, iki temel metrik üzerine odaklanmayı gerektirir:
- Bağlam Hassasiyeti: Geri getirilen parça gerçekten cevabı içeriyor mu?
- Bağlam Duyarlılığı: Sorguyu yanıtlamak için gereken tüm gerekli bilgiyi geri getirdik mi?
Bağlam İlgililiği Puanlamasının Uygulanması
Bağlam ilgililiğini ölçmenin en etkili yollarından biri, LLM'yi bir hakem olarak kullanmaktır. Bu teknik, genellikle "Hakem Olarak LLM" olarak adlandırılır ve bir değerlendirme modelini, belirli bir geri getirilen metin parçasının verilen sorguyu destekleyip desteklemediğini belirlemesi için istem (prompt) oluşturmayı içerir. İşte Python ve LangChain kullanarak pratik bir uygulama:
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# Hakem LLM'sini başlat
judge_llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# İlgililik değerlendirmesi için istemi tanımla
relevance_prompt = ChatPromptTemplate.from_template("""
Sen bir RAG sistemi için uzman bir değerlendirmecisin.
Bir sorgu ve geri getirilen bağlam parçası verildiğinde, bağlamın ilgili olup olmadığını belirle.
YANITIN SADECE "Evet" veya "Hayır" olmalıdır.
Sorgu: {query}
Bağlam: {context}
""")
def evaluate_relevance(query, context):
chain = relevance_prompt | judge_llm
response = chain.invoke({"query": query, "context": context})
return "Evet" in response.content
# Örnek kullanım
query = "XYZ ürünü için iade politikası nedir?"
context_chunk = "XYZ, premium bir ürün modelidir..."
is_relevant = evaluate_relevance(query, context_chunk)
print(f"Bağlam ilgili mi? {is_relevant}")
Bu yaklaşım, ilgili parçaların toplam geri getirilen parçalara oranı olan bir Bağlam Hassasiyeti Puanı hesaplamanıza olanak tanır. Düşük bir hassasiyet puanı, geri getirme stratejinizin çok fazla gürültü getirdiğini gösterir.
Gürültü Azaltma ve Bağlam Duyarlılığının Ölçülmesi
Hassasiyet bize kalite hakkında bilgi verirken, duyarlılık bütünlük hakkında bilgi verir. Bağlam duyarlılığını ölçmek için "Cevap İlgili Geri Getirme" adlı bir teknik kullanabilirsiniz. Burada, eğer cevap veritabanında varsa, geri getirilebilir olması gerektiği varsayılır. Tüm temel bilgilerin mevcut olup olmadığını görmek için geri getirilen parçaları gerçek bir cevapla karşılaştırabilirsiniz.
Gürültü azaltma için bir çapraz-encoder yeniden sıralama adımı uygulamayı düşünün. Vektör araması (Yoğun Geri Getirme) hızlı olsa da, tam hassas olmayabilir. Bir çapraz-encoder modeli, vektör deposu tarafından döndürülen en iyi K belgeyi, her (sorgu, belge) çifti için bir benzerlik puanı hesaplayarak yeniden sıralayabilir. Bu, alakasız yüksek benzerlik sonuçlarını listenin altına iterek gürültüyü önemli ölçüde azaltır.
from sentence_transformers import CrossEncoder
# Önceden eğitilmiş bir çapraz-encoder modeli yükle
model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
# Vektör aramasından sorgu ve aday belge listesi
query = "Şifre nasıl sıfırlanır?"
candidates = ["Buraya tıklayın...", "Şifre sıfırlama talimatları...", "Siteye hoş geldiniz..."]
# İlgililik puanlarını hesapla
scores = model.predict([(query, doc) for doc in candidates])
# Puanlara göre belgeleri yeniden sırala
ranked_docs = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
print(ranked_docs)
Sonuç
RAG geri getirme kalitesini değerlendirmek, bağlam ilgililiğini ve gürültüyü izlemek için tek seferlik bir görev değil, devam eden bir süreçtir. İlgililik puanlaması için otomatik hakemler uygulayarak ve gürültü azaltma için çapraz-encoder yeniden sıralama kullanarak geliştiriciler, LLM'lerinin yüksek kaliteli, hassas bilgilerle beslendiğinden emin olabilir. Bu, daha güvenilir, doğru ve kullanıcı dostu AI uygulamalarına yol açar. RAG mimarinizin tam potansiyelini açığa çıkarmak için bugün geri getirme kalitenizi ölçmeye başlayın.