Örneğin, elinizde bir doküman var ve bu dokümandan bazı çok kısa anahtar bilgilere ihtiyacınız var. Bu durumda RAG yöntemi ile yapay zekaya bu tarama ameleliğini yaptırarak aradığınız anahtar bilgiyi özet olarak almak bazen gerçekten işlevsel olabiliyor. Bu yöntemi kullanarak llama.cpp projesi ile bir çok yaratıcı proje geliştirilebilir.
Bu yöntemin temel mantığı kısaca şöyle: Dokümanı bir dizi yazı, parçalarına ayırıyoruz. Bu yazı parçaları çok uzun olmayacak şekilde olmalı. (Buna karar verirken kullandığınız modelin girdi yapabileceğiniz maksimum uzunluğunu (context size) göz önünde bulundurmalı.) Örneğin paragraf, paragraf bölmekte bir mahsur yok bence. Bu bölümleri ilk aşamada bir dizi sayıya dönüştürüyoruz. Bu işlemin adına tokenizasyon deniyor. Token, yapay zekanın kendi sözlüğünde her bir kelime veya kelimecik için karşılık gelen bir sayısal değerdir. Daha sonra bu sayısal dizilerden her bir yazı bölümü için yapay zekaya bir gömme (embedding) dizisi hesaplattırıyoruz. Gömme (embedding) dizisi hesaplamanın temel nedeni, yazı dizilerini yalnızca sayısal bir formata dönüştürmek değil, aynı zamanda anlamı, ilişkileri ve bağlamı da yansıtan vektör temsillerine dönüştürmektir. Bu sayede model, gömme (embedding) dizisine bakarak dizi içerisindeki bir kelimenin hangi bağlamlarda geçtiğini görür. O kelimenin embedding’i, bu bağlamlara göre güncellenir ve böylece anlamı taşıyan sayısal bir temsil ortaya çıkar.
Şimdi elinizde dökümanın bir dizi yazı bölümlerinin yapay zekaya hesaplattırdığınız gömme (embedding) vektörleri var. Bu vektörleri bir veri tabanı veya bir depolama alanında tutabiliriz. Diyelim ki bu yazı bölümleri ile alakalı anahtar bir bilgiyi yapay zekaya sorduk.
Bu durumda ilk olarak sorduğumuz sorunun gömme(embedding) vektörü ile dökümandan çıkarıp depoladığımız gömme(embedding) vektörlerinin her biri arasındaki benzerlik ilişkilerini çıkarıyoruz Bunu kosinüs benzerliği(cosine_similarty) denen bir yöntem ile yapıyoruz. Kosinüs benzerliği, iki vektör arasındaki hata açısını ölçen matematiksel bir yöntemdir. Embedding vektörleri anlamsal bağlamların sayısal temsilini taşıdıkları için iki embedding vektörünün kosinüs benzerliği değeri bize anlamsal yakınlığı verecektir. Kosinüs bildiğiniz gibi -1 ile 1 arasındadır. -1, zıttı, 1 ise aynısı demektir. Yani bu vektörlerden 0.8 in üzerinde benzerlik gösteren yazı dizilerinin sorduğumuz soruyla alakalı olduğunu söyleyebiliriz.
Kosinüs benzerliği ile elimizdeki vektörklerden hangisi veya hangilerinin yakın anlamı taşıdığını çıkardıktan sonra bu bilgileri de yapay zekaya ek bilgi olarak sunarak sorumuzu tekrar sorduğumuzda yapay zeka bize doğru bilgiyi vermiş olacak. Olayın temel mantığını anlamışsınızdır diye tahmin ediyorum. Yani kısaca yazmam gerekirse algoritmamız kısaca şöyle olacak;
- Dökümanı paragraflara böl
- Her bir paragraf için tokenizasyon yap ve embedding vektörü hesapla
- Hesaplanan embedding vektörlerini hafızada tut
- Bir soru sorulduğunda sorulan sorunun embedding vektörünü hesapla
- Sorunun embedding vektörü ile elimizdeki vektörler arasındaki kosinüs benzerliğini hesapla
- 0.8’in üzerindeki veya yakınındaki kosinüs benzerliğene sahip embedding vektörlerinin yazı karşılıklarını al
- Bu yazıları sorulan sorunun ardına ek bilgi veya system mesajı olarak ekleyip yapay zekaya sor.
- Yapay zeka bu ek bilgileri değerlendirsin ve sana aradığın cevabı dönsün.
Bu anlattıklarımı llama.cpp kullanarak yapabileceğiniz örnek bir c++ projesi yaptım. Bunu github repomdan bulabilirsiniz. Şimdilik hoşça kalın. 🙂