Bir RAG Sistemi Neden Tek Bir Arama Yöntemine Güvenmemeli?
Bir kullanıcı sisteminize şu soruyu soruyor:
"İade süreci nasıl işliyor?"
Sistem doğru cevabı buluyor.
Sonra başka bir kullanıcı geliyor ve sadece şunu yazıyor:
"İade süresi"
Bu sefer sistem aynı bilgiyi bulmakta zorlanabiliyor.
İlk bakışta garip geliyor. Sonuçta iki kullanıcı da neredeyse aynı şeyi arıyor.
Ama bir RAG sistemi için bu iki sorgu aslında oldukça farklı.
Biri doğal bir cümle. Diğeri ise arama motoruna yazılmış kısa bir anahtar kelime.
Passage üzerinde retrieval sistemini geliştirirken karşılaştığım en önemli problemlerden biri tam olarak buydu.
Tek bir arama yöntemi, her kullanıcı alışkanlığında aynı performansı göstermiyordu.
Herkes aynı şekilde arama yapmıyor
Bir RAG sistemi geliştirirken kullanıcıların sorularını genellikle doğal cümleler şeklinde hayal ediyoruz.
Örneğin:
"Ürünü iade etmek için ne yapmam gerekiyor?"
Bu tarz bir soruda semantic search oldukça başarılı çalışıyor.
Semantic search, kelimelerin birebir eşleşmesine bakmak yerine sorunun anlamını anlamaya çalışıyor. Kullanıcı "para iadesi" dese, dokümanda "geri ödeme" yazsa bile aradaki anlam ilişkisini kurabiliyor.
Ancak gerçek kullanıcılar her zaman böyle yazmıyor.
Bazıları Google'da arama yapar gibi sorgu giriyor:
"İade süresi"
"Kargo ücreti"
"Garanti"
Bu kısa sorguların problemi şu: Bağlam çok az.
"Iade süresi" yazan bir kullanıcının tam olarak neyi öğrenmek istediğini anlam modeli her zaman doğru yorumlayamayabiliyor.
Ve burada semantic aramanın tek başına yeterli olmadığını fark ettim.
Peki anahtar kelime araması kullansak?
Bu noktada çözüm oldukça basit gibi görünüyor.
Semantic search yerine klasik anahtar kelime araması kullanabiliriz.
Kullanıcı "iade süresi" yazdıysa, içerisinde "iade" ve "süre" geçen dokümanları buluruz.
Kısa sorgularda bu yaklaşım oldukça başarılı olabilir.
Ama bu sefer başka bir problem ortaya çıkıyor.
Kullanıcı şöyle sorarsa:
"Param ne zaman geri gelir?"
Dokümanda ise şu ifade varsa:
"İade işlemleri 14 gün içerisinde tamamlanır."
Anahtar kelime araması bu iki ifadeyi birbirine bağlamakta zorlanabilir.
Çünkü kullanıcı "param" ve "geri gelir" diyor, doküman ise "iade işlemi" diyor.
Kelimeler farklı.
Anlam ise aynı.
Yani bu noktada başka bir gerçekle karşılaşıyoruz:
Semantic search anlamı anlıyor ama kısa sorgularda zorlanabiliyor. Anahtar kelime araması ise kelimeleri yakalıyor ama anlamı kaçırabiliyor.
İkisini de tek başına kullanmak eksik kalıyor.
Tek bir yöntemi seçmek yerine ikisini birlikte kullandım
Passage'da bu problemi çözmek için semantic search ve anahtar kelime aramasını birlikte çalıştırmaya başladım.
Sistem artık kullanıcı sorgusunu iki farklı şekilde arıyor:
Semantic Search
Sorgunun ne anlama geldiğini anlamaya çalışıyor.
Keyword Search
Sorguda geçen kelimeleri ve ifadeleri doğrudan yakalıyor.
Daha sonra bu iki aramanın sonuçlarını bir araya getiriyorum.
Burada kullandığım yöntemlerden biri Reciprocal Rank Fusion (RRF).
Teknik olarak RRF'nin yaptığı şey oldukça basit bir fikre dayanıyor:
Bir sonuç iki farklı aramada da üst sıralarda çıkıyorsa, muhtemelen gerçekten alakalıdır.
Örneğin bir doküman semantic search sonuçlarında ikinci sıradaysa ve keyword search sonuçlarında da üst sıralarda yer alıyorsa, sistem bu sonucu daha güçlü bir aday olarak değerlendirebiliyor.
Bu sayede iki yöntemin güçlü olduğu alanlardan aynı anda faydalanabiliyorum.
Ama sonuçları birleştirmek de yeterli değil
İki farklı aramadan daha fazla sonuç getirmeniz, daha iyi sonuç bulacağınız anlamına gelmiyor.
Hatta bazen tam tersi olabilir.
Sistemin önüne çok fazla içerik koyduğunuzda, gerçekten önemli bilgi arada kaybolabilir.
Bu nedenle bir sonraki adımda sonuçları tekrar değerlendiriyorum.
Burada devreye reranking giriyor.
Reranker, kullanıcı sorusuna ve bulunan içeriklere tekrar bakarak şu soruya cevap vermeye çalışıyor:
"Bu içerik gerçekten kullanıcının sorusuyla ne kadar alakalı?"
Bu sayede ilk arama aşamasında bulunan adaylar arasından daha doğru sonuçları üst sıralara taşıyabiliyorum.
Kısaca sistemin çalışma mantığı şöyle:
Ara → Sonuçları birleştir → Tekrar değerlendir → En alakalı bilgiyi seç
Bu yapı ilk başta biraz daha karmaşık görünse de, kullanıcıların farklı arama alışkanlıklarını desteklemek için daha esnek bir yapı oluşturuyor.
Her sorguda Hybrid Search kullanmak doğru mu?
İlginç olan nokta burada.
Bu sistemi geliştirirken benim için asıl soru:
"Hybrid Search daha iyi mi?"
değildi.
Asıl soru şuydu:
"Hangi sorgularda gerçekten daha iyi?"
Çünkü sisteme her yeni katmanı eklemek bir maliyet getiriyor.
Daha fazla işlem.
Daha fazla gecikme.
Daha fazla karmaşıklık.
Eğer semantic search zaten doğru sonucu buluyorsa, sırf daha gelişmiş göründüğü için farklı yöntemler eklemenin bir anlamı yok.
Bu nedenle sistemi varsayımlarla değil, test ederek geliştirmek istedim.
Bunu test etmek için kendi kalite kontrol panelimi oluşturdum
Hybrid Search'ün gerçekten işe yarayıp yaramadığını anlamak için yalnızca sonuçlara bakmak yeterli değildi.
Sistemin hangi sonucu neden seçtiğini görebilmem gerekiyordu.
Bu nedenle Passage için küçük bir kalite kontrol paneli geliştirdim.
Panel üzerinden her sorguda şunları takip edebiliyorum:
- ·Sonuç semantic search'ten mi geldi?
- ·Keyword search sonucu mu?
- ·İki yöntemde de bulundu mu?
- ·Sonuç neden üst sıralarda?
- ·Sisteme gönderilen bağlam ne kadar?
- ·Hangi içerikler kullanıldı?
Daha sonra farklı kullanıcı davranışlarını temsil eden bir test seti hazırladım.
Bu sette:
- ·Doğal cümlelerle yazılmış sorular,
- ·Kısa ve anahtar kelime tarzı sorgular,
- ·Birden fazla kaynaktan bilgi gerektiren sorular,
- ·Sistem kapsamı dışındaki sorular,
- ·Ve bir prompt injection denemesi
yer aldı.
Sonuçlar tahmin ettiğim şeyi doğruladı
Doğal cümlelerle yazılmış sorularda semantic search zaten oldukça başarılıydı.
Bu sorguların büyük bölümünde anahtar kelime aramasının ek bir katkısı olmadı.
Ancak kullanıcılar kısa ve arama motoru tarzında sorgular yazdığında tablo değişti.
Örneğin:
"İade süresi"
"Kargo ücreti"
"Garanti şartları"
gibi kısa sorgularda keyword search önemli bir rol oynamaya başladı.
Hazırladığım testlerde, kısa sorguların tamamında getirilen doğru sonuçlar anahtar kelime aramasından da geçti.
Bu da bana şunu gösterdi:
Hybrid Search her sorguda daha iyi değil. Ama doğru sorgu tipinde ciddi bir fark yaratabiliyor.
Asıl mühendislik kısmı ise sistemi mümkün olduğunca karmaşık hale getirmek değil.
Hangi yöntemin, hangi problemde gerçekten gerekli olduğunu anlamak.
RAG sistemlerinde en iyi yöntem diye bir şey yok
Bu projede öğrendiğim en önemli şeylerden biri şu oldu:
Bir RAG sistemi için "en iyi retrieval yöntemi" diye tek bir cevap yok.
Sistemin nasıl kullanılacağı önemli.
Kullanıcılar uzun ve doğal sorular soruyorsa semantic search yeterli olabilir.
Kullanıcılar Google alışkanlığıyla kısa sorgular yazıyorsa keyword search önemli hale gelebilir.
Bazı sistemlerde ise ikisini birleştirmek gerçekten daha iyi sonuç verebilir.
Ancak bunu anlamanın yolu daha fazla teknoloji eklemek değil.
Ölçmek.
Benim için bu geliştirme sürecindeki en önemli nokta da buydu.
Hybrid Search ve reranking eklemekten daha önemli olan şey, bunların gerçekten gerekli olup olmadığını test edebilmekti.
Sonuç olarak Passage'ın retrieval hattı bugün semantic search, keyword search, RRF ve reranking kullanıyor.
Ama bu yapının en önemli tarafı kullanılan teknolojiler değil.
Her katmanın sisteme neden eklendiğini ölçebiliyor olmam.
Çünkü bir RAG sistemi geliştirirken doğru soru:
"En gelişmiş yöntemi nasıl kullanırım?"
değil.
Belki de daha doğru soru şu:
"Kullanıcının gerçekten hangi problemi var ve bunu çözdüğümü nasıl kanıtlayabilirim?"