Geleneksel Arama Destekli Üretim (RAG) sistemleri, genellikle alınan belgelerin kullanıcının sorgusuyla her zaman ilgili olduğunu varsayar. Ancak gerçek dünya senaryolarında, belirsiz sorgular, güncelliğini yitirmiş vektör depoları veya yetersiz gömme hizalaması nedeniyle arama motorları başarısız olabilir. Bir RAG sistemi, alakasız bir bağlama dayalı olarak yanıt ürettiğinde sonuç genellikle bir halüsinasyon olur. Düzeltici RAG (CRAG), bu sorunu ele alarak, alınan parçacıkların kalitesini değerlendiren ve gerektiğinde web araması gibi yedek mekanizmaları tetikleyen otomatik bir değerlendirme katmanı tanıtarak çözüme kavuşturur.
CRAG'ın Mimarisi
CRAG'ın arkasındaki temel felsefe "değerlendir, sonra eyleme geç"tir. Alınan belgeleri Büyük Dil Modeline (LLM) körü körüne iletmek yerine CRAG, üst sıradaki sonuçların (top-k) ilgili olup olmadığını yargılamak için hafif bir sınıflandırıcıyı veya LLM'nin kendisini kullanır. Bu yargı genellikle aramayı üç duruma sınıflandırır:
- Doğru: Alınan belgeler, sorguyu yanıtlamak için yeterli bilgi içerir. Sistem standart RAG ile devam eder.
- Belirsiz: Belgeler yardımcı olabilir ancak eksiklikleri vardır. Sistem aramayı iyileştirebilir veya istemi (prompt) genişletebilir.
- Yanlış: Belgeler alakasızdır. Sistem yerel bağlamı atar ve taze, güvenilir bilgi bulmak için bir web araması tetikler.
İlgililik Değerlendirmesinin Uygulanması
Özel sınıflandırma modelleri kullanılabilirken, CRAG için yaygın ve etkili bir yaklaşım, arama kalitesinin sıfır atışlı (zero-shot) veya az atışlı (few-shot) sınıflandırmasını LLM ile gerçekleştirmektir. Aşağıda, bu mantığı nasıl yapılandırabileceğinizi gösteren LangChain kullanan bir Python örneği bulunmaktadır.
from langchain_community.llms import OpenAI
from langchain.prompts import ChatPromptTemplate
def assess_relevance(query: str, context: str, llm: OpenAI) -> str:
"""
Alınan bağlamın sorguyla ilgili olup olmadığını değerlendirmek için bir LLM kullanır.
'Doğru', 'Belirsiz' veya 'Yanlış' döndürür.
"""
prompt_template = ChatPromptTemplate.from_template(
"""
Sen bir ilgililik sınıflandırıcısısın. Aşağıdaki sorguyu ve alınan bağlamı analiz et.
Sorgu: {query}
Bağlam: {context}
Bağlamın sorguya olan ilgililiğini belirle.
- Doğru: Bağlam, sorguyu doğrudan yanıtlıyor.
- Belirsiz: Bağlam kısmen ilgili ancak önemli detaylar eksik.
- Yanlış: Bağlam tamamen alakasız.
Sadece bir kelimeyle yanıt ver: Doğru, Belirsiz veya Yanlış.
"""
)
chain = prompt_template | llm
return chain.invoke({"query": query, "context": context}).content.strip()
# Örnek kullanım mantığı
query = "Paris Anlaşması'nın son durumu nedir?"
retrieved_context = "Dünya, Güneş'ten üçüncü gezegendir..."
relevance_score = assess_relevance(query, retrieved_context, llm)
if relevance_score == "Yanlış":
# Web Araması Yedeğini Tetikle
print("Arama başarısız oldu. Web araması tetikleniyor...")
# web_search_results = search_engine(query)
# final_context = web_search_results
elif relevance_score == "Belirsiz":
print("Arama belirsiz. Ek kaynaklarla genişletiliyor...")
else:
print("Arama başarılı. Yerel bağlam kullanılıyor.")
Web Araması Yedekleme Mekanizması
Değerlendirme "Yanlış" sonucunu verdiğinde, CRAG bilgi bulma yükünü statik vektör veritabanından dinamik web arama API'lerine aktarır. Bu, LLM'nin güncel ve fiilen doğru verilere erişimini sağlayarak halüsinasyon oranlarını önemli ölçüde azaltır. Maliyetleri ve API kotalarını etkili bir şekilde yönetmek için bu web aramaları için hız sınırlaması ve önbellekleme uygulamak kritiktir.
Sonuç
Düzeltici RAG, sağlam LLM uygulamaları oluşturma konusunda önemli bir ilerleme temsil etmektedir. Arama sürecine körü körüne güvenmemekle, geliştiriciler kendini düzelten ve karmaşık kullanıcı sorgularına uyan sistemler oluşturabilir. CRAG'ın uygulanması, değerlendirme adımı için ek hesaplama gücü gerektirir, ancak bu ödün, yanıt doğruluğunu ve güvenilirliğini büyük ölçüde artırarak onu üretim düzeyindeki RAG boru hatları için vazgeçilmez bir kalıp haline getirir.