Retrieval-Augmented Generation (RAG)

Hassasiyeti Ortaya Çıkarmak: Geriye Dönük Üretimde Sorgu Genişletmeyi Ustalaşmak

Hızla gelişen Geriye Dönük Üretim (RAG) ortamında, arama adımının kalitesi sistem performansının tek ve en kritik belirleyicisidir. Geliştiricilerin sık yaptığı bir hata, kullanıcının ham sorgusunun bilgi tabanında kullanılan terminolojiyle mükemmel şekilde eşleştiğini varsaymaktır. Ancak gerçek dünya sorguları genellikle belirsizdir, kısadır veya belirli alan jargonundan yoksundur. İşte burada Sorgu Genişletme sahneye çıkar; lüks olarak değil, yüksek hassasiyetli RAG mimarileri için bir zorunluluk olarak. Sorgu genişletme, vektör araması veya anahtar kelime eşleşmesi gerçekleştirilmeden önce kullanıcının orijinal sorgusunun ek terimlerle, eş anlamlılarıyla veya ilgili kavramlarla zenginleştirilmesi sürecidir. Aramanın anlamsal kapsamını genişleterek, ilgili belgelerin yalnızca tam sözcüksel eşleşmeler paylaşmadıkları için kaçırıldığı "hatırlama başarısızlığı" riskini azaltırız.

Sorgu Genişletmenin Mekanikleri

Etkili sorgu genişletme, hesaplama maliyeti ile arama kalitesi arasında farklı ödünleşimler sunan üç temel düzeyde çalışır. 1. Sözcüksel Eş Anlamlı Genişletme Bu yaklaşım, statik sözlükleri veya sözlükçeleri kullanarak anahtar terimleri değiştirmek veya yanına eş anlamlılar eklemek için kullanılır. Örneğin, bir kullanıcı "otokarlar" hakkında soru sorduğunda, sorguyu "otomobiller", "araçlar" ve "arabalar" terimlerini içerecek şekilde genişletmek, standart terminoloji kullanan belgelerin yine de getirilmesini sağlar. 2. LLM'ler Üzerinden Anlamsal Zenginleştirme Modern RAG hatları, bir sorgunun arkasındaki niyeti anlamak için Büyük Dil Modellerini (LLM) kullanır. Sadece kelimeleri değiştirmek yerine, bir LLM ilgili bir dizi soru üretebilir veya istemi daha spesifik olacak şekilde yeniden yazabilir. Bu, soyut kavramlar için özellikle güçlüdür. Bir kullanıcı "Yavaş bir PC'yi nasıl düzeltirim?" diye sorduğunda, bir LLM bunu "kaydı optimize et", "geçici dosyaları temizle", "sabit diski parçalara ayır" ve "RAM kullanımını kontrol et" gibi terimleri içerecek şekilde genişletebilir. 3. Ayrıştırma (Decomposition) Karmaşık, çok parçalı sorular için sorgu genişletme, tek bir sorguyu birkaç alt sorguya bölmeyi içerebilir. Her alt sorgu vektör veritabanına bağımsız olarak gönderilir ve sonuçlar birleştirilir. Bu, sistemin farklı belgelerde dağılmış olabilecek ayrı bilgi parçalarını getirmesine olanak tanır.

LangChain ile Uygulama Stratejisi

Python'da sorgu genişletmeyi uygulamak, LangChain gibi kütüphaneler kullanılarak kolaylaştırılır. Aşağıda SynonymQueryExpander ve kavramsal bir LLM tabanlı yeniden yazıcı kullanılarak hazırlanmış pratik bir örnek bulunmaktadır.
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import OpenAI

# Vektör mağazanızın 'vectorstore' olarak zaten başlatıldığını varsayalım
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(["Bilgi tabanınızın metni buraya"], embeddings)

# Bir getirici oluşturun
base_retriever = vectorstore.as_retriever()

# Genişletmenin bir formunu simüle etmek için Bağlamsal Sıkıştırma uygulayın
# Gelişmiş kurulumlarda, burada sorguyu getirmeden önce yeniden yazmak için bir LLM çağıran
# belirli bir QueryExpander sınıfı kullanırsınız.

from langchain.retrievers import BM25Retriever, EnsembleRetriever

# Vektör (anlamsal) ve BM25 (anahtar kelime) topluluğu genellikle örtük genişletme olarak işlev görür
bm25_retriever = BM25Retriever.from_documents(your_documents)
ensemble_retriever = EnsembleRetriever(retrievers=[base_retriever, bm25_retriever], weights=[0.7, 0.3])
Üretim ortamında, genellikle girdi sorgusunu alan, bunu "Bu sorgu için 5 ilgili anahtar kelime ve daha spesifik bir versiyon üret" talimatını içeren bir istemle bir LLM'e ileten ve ardından bu terimleri orijinal arama dizgesine ekleyen özel bir BaseQueryExpander sınıfı oluşturursunuz.

Pratik Düşünceler ve Tuzaklar

Sorgu genişletme hatırlamayı (recall) önemli ölçüde iyileştirirken, yeni zorluklar da getirir. Birincil risk doğrulukta (precision) düşüş yaşanmasıdır. Çok fazla gevşek ilişkili terim ekleyerek, LLM tarafından üretilen nihai cevabı sulandırabilecek gürültülü veya alakasız belgeler getirebilirsiniz. Buna karşı koymak için, getirmeden sonra sağlam yeniden sıralama adımları uygulamak çok önemlidir. Cohere Reranker veya Cross-Encoders gibi modeller, genişletilmiş sonuçların alakasını değerlendirebilir ve yalnızca en alakalı belgelerin üretim aşamasına iletilmesini sağlayabilir. Ayrıca, gecikme süresi etkilerini de göz önünde bulundurun. Her ek sorgu veya genişletme adımı, toplam yanıt süresine milisaniyeler ekler. Gecikme süresine duyarlı uygulamalar için, ağır LLM tabanlı yeniden yazıma göre hafif sözcüksel genişletme tercih edilebilir.

Sonuç

Sorgu genişletme, RAG geliştiricisinin araç setindeki güçlü bir kaldıraçtır. Basit anahtar kelime eşleşmesinin ötesine geçerek ve anlamsal zenginleştirmeyi benimseyerek, kullanıcı niyetini gerçekten anlayan sistemler oluşturabiliriz. Basit eş anlamlı sözlükleri olsun veya karmaşık LLM destekli ayrıştırmalar olsun, amaç aynıdır: kullanıcıların soruları nasıl sorduğu ile bilgilerin nasıl depolandığı arasındaki boşluğu doldurmak. RAG hattınızı iyileştirirken, hatırlama ile doğruluk arasında denge kuran genişletme stratejilerine öncelik verin; böylece yapay zeka asistanınız her zaman doğru, bağlama duyarlı yanıtlar sunmuş olur.
Share: