Anlamak İçin Python ile Sıfırdan RAG İnşa Ettim
Altı ay boyunca üretim ortamında LangChain kullandım. Nasıl çalıştığını açıklayamıyordum. Neden belirli metrikleri seçtiğimi veya metnin nasıl vektörlere dönüştüğünü bilmiyordum. Kütüphane mantığı gizliyordu.
Bunu düzeltmek için framework'ü sildim. 500 satırlık yalın Python kullanarak sıfırdan bir RAG pipeline'ı yazdım.
Yığını manuel olarak inşa ederken öğrendiklerim şunlar:
Kara Kutuların Sorunu Üst düzey kütüphaneler kullandığınızda kontrolü kaybedersiniz. Modellerin gerçekleri uydurduğunu (hallucinate) veya yanlış atıflar verdiğini gördüm. Hatanın chunker'da mı, embedding modelinde mi yoksa prompt'ta mı olduğunu anlayamıyordum.
Kendiniz inşa ettiğinizde, her katman incelenebilir olur. LLM'e gönderilen tam chunk'ları yazdırabilirsiniz. Bir cümlenin tam olarak nerede bölündüğünü görebilirsiniz.
RAG'ın Beş Katmanı RAG tek bir algoritma değildir. Bir araya getirilmiş beş farklı süreçten oluşur:
- Chunking: Metnin nasıl bölüneceğine karar verme.
- Embedding: Metni matematiğe dönüştürme.
- Retrieval: Doğru parçaları bulma.
- Prompt Construction: Modele nasıl davranacağını söyleme.
- Generation: Nihai cevabı alma.
İnşa Sürecinden Dersler
Chunking en önemli adımdır Çoğu eğitim bunu atlıyor. Eğer overlap (örtüşme) kullanmazsanız, sınır noktalarında bağlamı kaybedersiniz. Karakter düzeyinde overlap içeren bir sliding window (kayan pencere) kullandım. Bu, modelin iki chunk arasındaki bağlantıyı görmesini sağlar.
Mesafe metrikleri önemlidir Kötü arama sonuçlarını hata ayıklamak için saatler harcadım. Sorun veride değildi; sorun metrikti. ChromaDB varsayılan olarak L2 mesafesini kullanır. Semantik arama için Cosine similarity'ye ihtiyacınız vardır. Tek bir satır kod her şeyi değiştirdi.
Prompt'ların kısıtlamalara ihtiyacı vardır Bir LLM bir kahin değil, bir tamamlayıcıdır. Eğer belirsiz bir soru sorarsanız, bir cevap uyduracaktır. Katı bir reddetme şablonu kullanmayı öğrendim. Modele şunu söyledim: "Eğer bağlam cevabı içermiyorsa, bilmediğini söyle." Bu, halüsinasyonları %40'tan %5'e düşürdü.
İsteklerinizi gruplandırın (batch) Her chunk için tek bir HTTP isteği göndermek yavaştır. Bunları batch'ler halinde göndermek çok daha hızlıdır. Bu, yerel modelin işi pipeline şeklinde yürütmesine olanak tanır.
Aşağıdan yukarıya test edin Testleri en sonda yazmayın. Önce chunker'ınızı test edin. Sonra embedder'ınızı test edin. Sonra store'unuzu test edin. Eğer en son test ederseniz, mantığı değil hataları test etmiş olursunuz.
Eğer AI stack'inizi gerçekten anlamadığınızı hissediyorsanız, onu kendiniz inşa edin. Hedef kod yazmak değil, düşünme biçimidir.
İsteğe bağlı öğrenme topluluğu: https://t.me/GyaanSetuAi
