Sublime Text İçine Wsl Bash Ekleme

 Sublime Text İçine Wsl Bash Ekleme      Buradaki adımlarla Sublime Text'e Terminus Package ile bash eklenebilir.      Öncelikle Termin...

Açık Kaynak Arama Motoru

Merhaba, 

bu yazıda İspanya'nın en büyük süpermarket zinciri olan Mercadona'nın kendi arama motorunu geliştirerek nasıl %94'e varan kâr elde ettiğinden bahsedeceğim. Ramon Agüera tarafından yazılan makalenin tam çevirisini yapıp detayları olabildiğince anlatmaya çalıştım. 

"Mühendislik ekipleri aylardır benzer bir şey düşündüklerini ancak nereden başlayacaklarını bilmediklerini söylüyordu. Teknik olmayan kişiler modern bir arama motorunun ardında gerçekten ne olduğunu anlamak istiyordu.

Bu makale tüm bu soruları yanıtlıyor. Ve sonunda, aynı yöntemi kullanarak kendi projenize başlamanız için Claude Code'a verebileceğiniz indirilebilir bir dosya bulunuyor.


Neden her şeyi anlatıyorum?

Mercadona'da Toplam Kalite Yönetimi adında bir modelimiz var . Bu bir belge veya kılavuz değil: mağazada rafları yeniden düzenleyen kişiden yönetim kuruluna kadar şirkette çalışan herkesin kararlarını yönlendiren bir sistem. İki yol arasında seçim yapmanız gerektiğinde, model size hangi yolun gerekenlere ve hangi sırayla saygı gösterdiğini söyler.

Mercadona Modeli, şirketin aynı anda karşılaması gereken beş bileşeni belirli bir sırayla tanımlar: önce Patron (Mercadona'da müşteriye verdiğimiz isim), sonra Çalışan , sonra Tedarikçi , sonra Toplum ve son olarak Sermaye . Beş bileşenin hepsi aynı anda, ancak bu öncelik sırasına göre. Şirket içinde tekrar tekrar dile getirilen ifade şudur: "Uçağın uçabilmesi için fiziğin tüm yasalarının aynı anda yerine getirilmesi gerekir": düzeni kaybetmeden herkese özen göstermek.

Bugün beni ilgilendiren bileşen dördüncüsü: Toplum. Şirketi çevreleyen insanlar, kuruluşlar ve yerler. Juan Roig, onunla yakından çalışan herkesin bir noktada ondan duyduğu bir ifadeyle bunu özetliyor: " Hayalim modeli paylaşmak . " Eğer birileri işleri doğru yapmayı öğrenirse, girişimciler olur. Girişimciler varsa, şirketler olur. Şirketler varsa, işler olur. İşler varsa, zenginlik olur. İyi yönetilen zenginlik varsa, refah olur.

Öğrendiklerimizi paylaşmak, Mercadona Modeli çerçevesinde Toplum bileşenini yerine getirmenin doğal yollarından biridir.

Bu nedenle bu makale sadece anekdotlardan ibaret değil. Arama motorumuzun tam olarak nasıl oluşturulduğunu, hangi algoritmaları içerdiğini, her katmanda hangi kararları aldığımızı, neden bazı bariz alternatifleri elediğimizi, öğrenme modeline hangi yönetim kurallarını uyguladığımızı ve hangi OpenStack platformlarının bunu kopyalayabileceğini açıklayacağım. Ve sonunda, herhangi bir ekibin, büyüklüğüne bakılmaksızın, başlangıç noktası olarak kullanabileceği indirilebilir bir kılavuz sunacağım.

Eğer paylaştığım bilgiler, dünyanın herhangi bir yerindeki üç kişilik bir ekibin pahalı bir arama motorunu kendi daha iyi ve daha kontrol edilebilir arama motorlarıyla değiştirmesine yardımcı olursa, bu makale amacına ulaşmış olacaktır.

Bu kimlere hizmet ediyor?

Ayrıntılara girmeden önce, bundan kimlerin faydalanacağını açıklığa kavuşturmakta fayda var.

Bu makale, birbirinden çok farklı iki okuyucu kitlesine yöneliktir. Birincisi, teknik bir geçmişi olmayan ve modern bir arama motorunun nasıl çalıştığını gerçekten anlamak isteyen biridir: neden bazen aradıklarını buluyor, bazen bulamıyor, bir sistem tıklamalardan nasıl "öğreniyor" ve bazı çevrimiçi mağazaların arama motorları sanki zihninizi okuyormuş gibi çalışırken, diğerlerinin neden absürt sonuçlar gösterdiği gibi soruların cevaplarını bulmak istiyor. Bu okuyucu için, her kavramı kullanmadan önce açıklayacak ve gereksiz teknik terimlerden kaçınacağım.

İkinci okuyucu, sistemi kopyalamak isteyen teknik bir kişidir. Bu okuyucu için, nihai kılavuzun anlamlı olmasını sağlayacak kadar ayrıntı vereceğim: belirli algoritma adları, parametreler, doğrulama kararları ve ölçütler. Makalenin yoğun görünmesinden korktuğum için ilgili hiçbir şeyi atlamayacağım.

Teorim şu ki, yapı sağlam olduğu sürece her iki okuyucu tipi de aynı metin içinde bir arada bulunabilir. Teknik yön nedenini açıklıyor. Kavramsal yön ise ne olduğunu açıklıyor. Ve birlikte, şu soruya verilebilecek tek dürüst cevabı sunuyorlar : Bir arama motoru nasıl yapılır? Kısa bir cevabı yok, ama sihir de değil.

Neden özel bir arama motoru?

Çevrimiçi bir mağazada, arama motoru ana giriş kapısıdır. İnsanlar ne istediklerini zaten biliyorlarsa kataloglara göz atmazlar: adını yazarlar ve görünmesini beklerler. Görünmezse, ayrılırlar. Tekrar satın almazlar, keşfetmezler, tekrar denemezler. Ayrılırlar.

Çevrimiçi mağazamızda, arama motoru haftada 4,4 milyon aramayı işliyor . Eğer bunların %4'ü sonuç vermezse, bu haftada yaklaşık 176.000 kullanıcının alakalı bir şey yazıp hiçbir şey bulamadığı anlamına gelir. Bizim başımıza gelen de tam olarak buydu. Ve olabilecek en kibar şey buydu: sonuç veren diğer aramalar da daha iyi olabilirdi. Sadece bizi uyaran bir kırmızı bayrağımız yoktu.

Standart bir arama motorunun sorunu – ister SaaS olsun ister e-ticaret platformunuzla birlikte gelen olsun – herhangi bir katalogla iyi çalışacak şekilde tasarlanmış olmasıdır. Bu kulağa hoş geliyor, ancak kataloğunuzun sıradan bir katalog olmadığını hatırladığınızda işler değişiyor. Kullanıcılarınız diğer mağazaların kullanıcıları gibi yazmıyor. İşletmeniz, rakibinizin sunduğu sonuçları ödüllendirmiyor. Ve hepsinden önemlisi, arama motorunun düzgün bir şekilde kullanamayacağı gerçek davranışsal verilere sahipsiniz – ne arıyorlar, neye tıklıyorlar, ne satın alıyorlar – çünkü bu verilere sahip değil.

Kendi arama motorunuzu kurmak size üç somut fayda sağlar. Birincisi, sıralama üzerinde kontrol: Hangi sinyallerin en çok ağırlık taşıdığına, nasıl ağırlıklandırıldıklarına, sık sık görünen ancak nadiren satın alınan ürünlerle ne yapılacağına ve henüz satış geçmişi olmayan yeni ürünlerle ne yapılacağına siz karar verirsiniz. İkincisi, hedefli iyileştirme: Verdiğiniz her karar, sentetik bir kıyaslama ölçütüne değil, gerçek iş verilerinize göre ölçülür. Bir karar kataloğunuzun sıralamasını %1 artırırsa, bunun karşılığını alırsınız. Üçüncüsü, sahiplik: En kritik iş kararlarından biri artık harici bir sağlayıcıya bağlı olmaktan çıkar ve ekip içinde kalan bir bilgi haline gelir. Dördüncü

bir neden daha var, daha az romantik ama aynı derecede önemli: maliyet. Makul derecede sağlam bir SaaS arama motoru, bizimki gibi bir hacim için ayda birkaç bin dolara mal oluyor. İyi tasarlanmış, özel bir arama motoru bunun çok daha azına mal oluyor. Bu tek başına yeterli bir neden değil – kalite satın almak için para harcıyorsanız, para harcayın – ancak kendi arama motorunuzu kurmak aynı zamanda kaliteyi de artırıyorsa, hesaplama bir karar olmaktan çıkıp bir sonuca dönüşüyor.

Kendi sistemimizi kurmaya karar verdik. İşte bunu nasıl yaptığımızın ayrıntılı açıklaması.

Mimari, tek sayfada

Her bir bileşene geçmeden önce, zihninizde bir imge oluşturmak faydalı olacaktır. Modern bir arama motoru karmaşık görünebilir, ancak dört adımlı bir süreç olarak ele alırsanız o kadar da karmaşık değildir.

Hayal edin ki, aradığınız kitaptan üç kelime yazdığınız bir kağıtla devasa bir kitapçıya giriyorsunuz. Kitabı bulmak için iki kişi gönderiyorsunuz. Birincisi, başlığında tam olarak bu üç kelimeyi içeren tüm kitapları arıyor. İkincisi ise, tam olarak bu kelimeleri kullanmasa da aynı konuyu ele alan kitapları arıyor. Her ikisi de listeleriyle geri dönüyor. Listeleri karşılaştırıyorsunuz, o kitapçıda olmayan kitapları eliyorsunuz ve bir katalog uzmanı, işletme hakkındaki bilgisine dayanarak kalanları düzenliyor: en sık ödünç alınan kitaplar hangileri, hangileri yeni ve hangileri isteğinize en uygun. Gördüğünüz şey nihai liste.

Bu, bizimki gibi bir arama motorunun yaptığı işin neredeyse birebir aynısı. "Kitaplar" yerine "ürünler", "iki kişi" yerine "iki arama algoritması" ve "katalog uzmanı" yerine "öğrenme modeli" koyarsanız, tüm mimariyi elde edersiniz.

Şimdi parçalara bakalım.

1. Danışma sürecini standartlaştırın

Birisi "Café Molido" (Öğütülmüş Kahve) yazdığında, sistem bu metni standart biçimine dönüştürür: küçük harflerle, aksan işaretleri olmadan, kelimelere ayrılmış şekilde. "Café Molido" iki öğeden oluşan bir liste haline gelir: "cafe" (kahve) ve "molido" (öğütülmüş). Altın kural: sorgulama için kullanılan normalleştirme, kataloğu indekslemek için kullanılan normalleştirmeyle tam olarak aynı olmalıdır. Eğer aksan işaretiyle indekslerseniz ve aksan işareti olmadan ararsanız, eşleşme olmaz. Kataloğumuzda, kullanıcıların %100'ünün aksan işareti olmadan yazdığını keşfettik: bu, kuralın gerektirdiği şeydir.

2. İki paralel arama

Standartlaştırılmış sorgu söz konusu olduğunda, sistem aynı anda iki arama başlatır.

İlk yöntem sözcüksel aramadır: Adında, markasında veya açıklamasında kullanıcının yazdığı kelimeleri tam olarak içeren ürünleri arar. "Süt" yazarsanız, içinde "süt" kelimesi geçen ürünleri bulur. Bunu, kelimenin kaç kez geçtiğine ve katalogda ne kadar nadir olduğuna (nadir kelimeler daha yüksek puan alır) göre her ürünü puanlayan klasik bir algoritma olan BM25 ile yapar. Ayrı bir küme olmadan, servise entegre edilmiş, Rust dilinde yazılmış bir motor olan Tantivy üzerinde çalışır. En iyi 100 adayı döndürür.

İkinci yöntem anlamsaldır: sorguyu "anlamını" temsil eden 384 sayıdan oluşan bir vektöre dönüştürür ve bu alanda en benzer ürünleri bulmak için önceden hesaplanmış bir ürün dizisinde arama yapar. İlk yöntemin gözden kaçırdığı şeyleri bulur: "ovmak" kelimesini ararsanız, "ovmak" kelimesini içermese bile "ovma pedi" döndürebilir. Vektörleri oluşturan model e5-small olarak adlandırılır (açık, çok dilli, hafif) ve biz onu ONNX INT8 olarak çalıştırıyoruz; bu, 6 MB belleğe sığan ve grafik kartı olmadan milisaniyeler içinde yanıt veren optimize edilmiş bir sürümdür. En iyi 50 adayı döndürür.

3. İki listeyi birleştirin.

Bazen örtüşen, bazen de örtüşmeyen iki aday listemiz var. Bunları birleştirmek için kullandığımız teknik Karşılıklı Sıralama Birleştirme olarak adlandırılıyor: her ürün, her listedeki konumuna ters orantılı olarak puan alıyor. Bir listede birinci, diğerinde beşinci sırada yer alıyorsa, her ikisi için de puan alıyor. Sadece bir listede yer alıyorsa, o liste için puan alıyor. Sağlam bir yöntemdir ve ağırlıkların kalibrasyonunu gerektirmez: yalnızca konumları kullanır, mutlak puanları değil; bu da BM25 ve anlamsal benzerliğin farklı ölçeklerde çalıştığı gerçeğini göz ardı etmesini sağlar.

Birleşmenin ardından yaklaşık 60 adaydan oluşan bir liste kalıyor. Daha sonra bir filtre uygulanıyor: kullanıcının belirli mağazasının ürün yelpazesinde yer almayan ürünler eleniyor. Bu filtreyi verimli bir şekilde nasıl uygulayacağımız başlı başına ilginç bir karar; bunu bir sonraki bölümde açıklayacağım.

4. Makine öğrenimi kullanarak yeniden sıralama

Geriye kalan 60 aday makul ölçüde filtrelenmiş olsa da, iyi bir sıralamaya sahip değiller. Hangi ürünün zirveye çıkacağına karar vermek, önceki puanlardan daha fazlasını gerektirir: gerçek iş verileri üzerinde eğitilmiş bir model gerektirir.

Bu modele Sıralama Öğrenme (Learning to Rank) adı verilir. Bizim örneğimizde, sıralama problemleri için optimize edilmiş, karar ağacı tabanlı bir algoritma olan CatBoost YetiRank kullanılıyor . Her biri için 14 özellik (BM25 puanı, anlamsal benzerlik, son haftalarda kaç kez satın alındıkları, düzenli müşteriler arasındaki popülerlikleri ve kataloğa ne kadar süre önce eklendikleri) ile birlikte 60 adayı alır ve nihai sıralamayı oluşturur. Bunu yapmak bir milisaniyeden daha kısa sürer.

Tüm bunlara ek olarak , kullanıcının yazarken karşısına çıkan otomatik tamamlama özelliği de bulunuyor. Bu tam bir arama değil; saniyeler içinde, yazdığınız kelimeyle başlayan ürünleri listeleyen bir Trie (ön eklerden oluşan bir ağaç) yapısıdır. Önerileri sıralamak için üç sinyal kullanılır: eşleşmenin hangi alanda göründüğü, kelimenin tamamının mı yoksa sadece ön ekin mi eşleştiği ve isim içindeki konumu.

Toplam bütçe

Tüm bileşenler neredeyse algılanamaz bir sürede çalışır: sorguların %99'u için 15 milisaniyeden daha kısa bir sürede. Pratikte, ortalamamız 12 ms'dir. Bir göz kırpması yaklaşık 300 ms sürer; tüm arama motoru bir göz kırpmasından yaklaşık 20 kat daha hızlı yanıt verir. Her bileşenin kendi bütçesi vardır ve herhangi bir bileşen bu bütçeyi aşarsa, sistem zamanında yanıt vermeyi durdurur ve kullanıcı deneyimi bozulur. Bu kısıtlama, takip eden kararları şekillendirir.

Bir prototipi gerçek bir arama motorundan ayıran beş karar

Aşağıdaki kararlar alınması en zor olan ve en büyük farkı yaratan kararlardı. Her biri bağımsızdır: herhangi bir projede ayrı ayrı benimsenebilirler. Ve her biri, ilk başta açık görünen ancak sonunda yanlış olduğu ortaya çıkan bir alternatifi temsil etmektedir.

1. Hibrit arama: İkisi de ayrı ayrı çalışmaz.

İlk akla gelen seçenek, sözcük tabanlı veya anlamsal arama olmak üzere ikisinden birini seçmektir. Sözcük tabanlı arama hızlı, tahmin edilebilir ve ucuzdur. Anlamsal arama ise akıllıca çalışır, eş anlamlı kelimeler bulur ve soruları doğal dilde ele alır. Peki neden ikisini de yapmalıyız?

Çünkü tek başlarına kötüler. Sadece sözcük tabanlı arama kullanırsanız, sorguların %33'ü sonuç vermez: biri "bulaşık yıkamak için" yazar, "yıkamak" kelimesi hiçbir ürün açıklamasında geçmez ve sistem pes eder. Sadece anlamsal arama kullanırsanız, her şey bir şey bulur, ancak bu "bir şey" genellikle gürültüdür: model "maden suyu"nu "hidrojen peroksit"e benzer sanır ve sıralamada bunları karıştırır.

İkisi birbirini tamamlıyor. Anlam bilimi, geri çağırmayı (her zaman adayların olmasını) sağlarken, sözcük bilimi de doğruluğu (açık adayların orada olmasını) sağlar. Verilerimizde, geri çağırma oranı 0,547'den (sadece sözcük bilimi) 0,853'e (hibrit) yükseliyor. Sonuçsuz aramaların yüzdesi %33'ten %0'a düşüyor. Ve daha sonra, birleştirilmiş iki listede, öğrenme modeli son yargıç görevi görüyor: tıklamalardan hangi sonuçların gerçekten iyi olduğunu ve hangi sonuçların, alakalı görünseler bile, kullanıcılar tarafından göz ardı edildiğini öğreniyor.

Durumunuzda nasıl karar vereceksiniz: Kataloğunuzda açık bir kelime dağarcığı, doğal dil sorguları veya ilgili eş anlamlı kelimeler varsa, anlamsal katmana ihtiyacınız vardır. Kataloğunuz küçükse ve kullanıcılar her zaman kataloğun kelime dağarcığını kullanarak yazıyorsa, yalnızca sözcüksel katmanla başlayıp anlamsal katmanı daha sonra ekleyebilirsiniz. Ancak gerçek dünyadaki çoğu katalog her ikisine de ihtiyaç duyar.

2. Her depolama alanı için ayrı bir dizin yerine, bit kümeleri içeren tek bir ana dizin.

Ürün çeşitliliği mağazadan mağazaya değişir: tüm mağazalar aynı ürünleri stoklamaz. Bunu ele almanın en basit yolu, her mağaza için ayrı bir arama dizini oluşturmaktır. Bizim durumumuzda bu, 762 dizin anlamına gelir; bunları farklı arama sonuçları için çoğaltın, güncel tutun ve ürün çeşitliliği her değiştiğinde birini yeniden dizinleyin.

Bizim benimsediğimiz alternatif şu: Tüm kataloğu içeren tek bir ana dizin ve her mağaza için bir bit kümesi (bitmap, yani her bitin "bu ürün burada mevcut, evet veya hayır" anlamına geldiği ikili bir dizi) tutuyoruz. Birisi bir mağazadan arama yaptığında, aramayı ana dizine karşı çalıştırıyoruz ve bulunan ürünlerin kimlikleri ile mağazalarının bit kümesi arasında bir AND işlemi gerçekleştirerek sonucu filtreliyoruz.

Rakamlar her şeyi açıklıyor: Her biri 813 bayt uzunluğunda 254 bit kümesi, toplam 200 KB. Bir bit kümesi üzerinde AND işlemi yalnızca mikrosaniyeler sürüyor. Bir diziyi güncellemek, tüm bir bit kümesini değiştirmek anlamına geliyor, bu da oldukça basit bir işlem. 762 ayrı fiziksel dizini korumaya kıyasla, bu bin kat daha basit bir işlem ve bin kat daha fazla depolama tasarrufu sağlıyor.

Sizin durumunuzda nasıl karar verilir: Çakışan kataloglara (mağazalar, markalar, bölgeler, diller) sahip çoklu kiracılık söz konusu olduğunda, "ana dizin + her kiracı için bit kümesi" modeli kazanır. Kural şudur: Kataloğun büyük kısmı tüm kiracılar için ortak mı? Evet → bit kümeleri. Her kiracının tamamen farklı bir kataloğu mu var? O zaman evet, ayrı dizinler.

3. İleriye dönük doğrulama: tıklamaları asla rastgele karıştırmayın.

Sıralama modeli eğitirken, verilerinizi eğitim ve test verilerine ayırmanız gerekir. Makine öğreniminde standart yöntem, tüm verileri alıp rastgele karıştırmak ve %20'sini test için ayırmaktır. Buna rastgele k-katlı çapraz doğrulama denir.

Arama motorlarında bu yanlış. Tıklamaların zamansal bir yapısı vardır: mevsimsellik, ürün lansmanları, iç kampanyalar ve diğer günlere göre daha yüksek trafikli günler. Tıklamaları rastgele karıştırırsanız, geçmiş ve gelecek verileri karıştırırsınız ve model, üretimde bilemeyeceği şeyleri "öğrenir". Sonuç olarak, şişirilmiş metrikler ortaya çıkar: modeliniz, üretimde gerçekte olacağından %5-10 daha fazla iyileşmiş gibi görünür.

Doğru yaklaşım ileri doğru adım olarak adlandırılır: 1., 2. ve 3. haftalarla eğitim yaparsınız ve 4. haftayla doğrulama yaparsınız. Ardından pencereyi kaydırabilirsiniz: 2., 3. ve 4. haftalarla eğitim yapar ve 5. haftayla doğrulama yaparsınız. Ve böyle devam eder. Model her zaman gerçek bir geleceğe karşı değerlendirilir, önceden bildiği bir geleceğe karşı değil.

Sizin durumunuzda nasıl karar vereceksiniz: Verilerin zamansal bir boyutu olduğunda –ki arama motorlarında bu her zaman geçerlidir– ileriye dönük analiz zorunludur. İsteğe bağlı değildir. Bu, metodolojik bir ayrıntı gibi görünen ancak gerçekte iş metriklerini iyileştiren bir modelin uygulanması ile onları kötüleştiren bir modelin uygulanması arasındaki farkı belirleyen kararlardan biridir.

4. Konum yanlılığını düzeltin: tıklamalar alaka düzeyiyle aynı şey değildir.

Kullanıcı tıklamalarına dayalı bir model eğitmenin ince bir sorunu var: Kullanıcılar, alaka düzeyine bakılmaksızın ilk sonuçlara daha çok tıklıyor. Bu konuda ciddi çalışmalar var: Beşinci sonuç tamamen aynı kalitede olsa bile, ilk sonuca yaklaşık altı kat daha fazla tıklanıyor. Eğer "tıklama = alaka düzeyi" varsayımıyla bir model eğitirseniz, model her zaman zaten en üstte olan ürünleri yerleştirmeyi öğrenir. Model kendini güçlendirir; en üstteki ürünler baskın hale gelir, iyi ama daha az görünür ürünler asla ortaya çıkmaz, katalog çeşitliliği çöker ve kalite siz fark etmeden düşer. Buna geri bildirim döngüsü veya Bilgi Erişimi öncülerinin kullandığı adıyla Alaka Düzeyi Geri Bildirimi denir.

Standart düzeltme, Ters Eğilim Ağırlıklandırması (IPW) olarak adlandırılır : her tıklamaya, konumuna ters orantılı bir ağırlık verilir. Kullandığımız formül, konumun 2 tabanına göre logaritmasının artı bire bölünmesidir. 1. konumdaki bir tıklama az önem taşır; 8. konumdaki bir tıklama çok daha fazla önem taşır, çünkü kullanıcı ona ulaşmadan önce yedi sonucu göz ardı etmek zorunda kalmıştır. Bu, alaka düzeyinin güçlü bir işaretidir.

Ve bunu arama motoru optimizasyonu ile tamamlıyoruz: aramaların %5'inde sistem, 3., 5. ve 7. pozisyonlara kasıtlı olarak 2-3 rastgele sonuç yerleştiriyor. Garip gelebilir, ancak gerekli: arama olmadan yeni ürünler asla tıklama almaz ve sonsuza dek en altta kalır. Bu %5, sürekli olarak optimum olmayan bir dengeyi önlemek için katlanılabilir bir maliyettir.

Sizin durumunuzda nasıl karar vereceksiniz: Eğer modeliniz tıklamalardan öğreniyorsa, IPW (İnternet Üzerindeki Çalışma) zorunludur, keşif de öyle. Makul bir alternatif yok.

5. -2% Koruma bariyeri: daha kötü model yoksa otomatik olarak geçer.

Bir modeli her hafta yeniden eğitmek kulağa hoş geliyor, ta ki bir gün yeniden eğitim daha kötü bir model üretene kadar. Eğer modeli olduğu gibi kullanıma sunarsanız, kullanıcılar aramaya devam edecek, tıklamalar gelmeye devam edecek çünkü başka alternatifleri yok ve bir sonraki yeniden eğitiminiz kötü bir model tarafından çarpıtılmış verilerle yapılacak. Bozulma görünmezdir ve birikir.

Kullandığımız savunma mekanizması otomatik bir güvenlik önlemidir: Yeniden eğitim süreci, yalnızca dört ölçütün hiçbirinde üretim modeline kıyasla %2'den fazla düşüş olmazsa modeli devreye alır. Dört ölçüt, hem geçici test kümesinde (ileriye dönük test) hem de ideal yanıtın manuel olarak etiketlendiği 500 sorgudan oluşan statik bir altın kümede değerlendirilen MRR ve NDCG'dir . Altın küme asla değiştirilmez: geri bildirim döngüsüne karşı bağışık olan tek referanstır.

Süreç üç olası karar üretir: Adayın performansı %0,5'ten fazla artarsa YÜKSELT, -%2 ile +%0,5 arasında nötr bir aralıkta kalırsa BEKLET (karantinaya alınır ve dağıtılmaz) ve %2'den fazla düşerse REDDET. YÜKSELT durumunda bile, gerçek dağıtım tetiklenmeden önce bir saat bekler ve bu süre zarfında herhangi bir ekip üyesi işlemi iptal edebilir. Bu, son insan müdahalesi aşamasıdır.

Kendi durumunuzda nasıl karar vereceksiniz: Modelleri otomatik olarak dağıtıyorsanız, bir güvenlik önlemine ihtiyacınız var. Tam eşik, hassasiyetinize bağlıdır: %-2 katıdır ancak kritik trafiğe sahip bir arama motoru için yeterlidir. Daha az riskli bir sistem için %-5 kullanabilirsiniz. Ancak model—otomatik kurallar + sistemden bağımsız ölçüt (altın küme) + dağıtımdan önce insan incelemesi—evrenseldir.

Yığın (her şey açık, her şey çoğaltılabilir)

Bunu inşa ederken en şaşırtıcı şeylerden biri, kullanılan teknoloji yığınının ne kadar sıradan olması. Özel grafik kartları, vektör veritabanları ve ücretli harici hizmetler yok. Bundan sonra gelen her şey açık kaynaklı, bir Python deposuna sığıyor ve standart makinelerde çalışıyor.

Sözcük arama motoru: Tantivy

Anahtar kelime araması için, Apache Lucene'den (günümüzde gördüğünüz tüm arama motorlarının atası, 25 yıldan fazla önce Xerox Park'ta Doug Cutting tarafından yaratıldı) esinlenilmiş Rust tabanlı bir kütüphane olan Tantivy'yi kullanıyoruz . Tantivy'nin en önemli özelliği performansı (binlerce ürün kataloğu için milisaniyelik yanıt süreleri mükemmel) değil, hizmetin kendi içinde çalışmasıdır. Ayrı bir küme, özel arama sunucuları ve bakımı yapılacak bir JVM yok. İndeks yaklaşık 20 MB bellek kaplar ve kodun geri kalanıyla aynı işlemde çalışır.

Tantivy, gerçek bir arama motoru için ihtiyaç duyduğunuz her şeyi doğal olarak destekler: yapılandırılabilir belirteçleme, otomatik tamamlama için önek araması, filtreler için yönler (kategoriye, markaya vb. göre) ve eşleşen terimlerin vurgulanması. Genellikle kullanılan alternatifler olan Elasticsearch veya OpenSearch, Wikipedia'nınki gibi büyük kataloglar için tasarlanmıştır: kataloğunuzda 100.000'den az belge varsa, Tantivy muhtemelen doğru seçimdir.

Anlamsal model: ONNX Runtime ile yürütülen e5-small

Anlamsal katman için, Microsoft Research tarafından yayınlanan çok dilli-e5-small adlı açık kaynaklı bir gömme modeli kullandık . "Small" ifadesi, modelin yaklaşık 118 milyon parametreye sahip olduğu anlamına gelir: modern modeller açısından küçük, ancak kısa ürün adları için fazlasıyla yeterli. Sorgu başına ve belge başına 384 boyutlu vektörler üretir.

Bu modeli orijinal haliyle (PyTorch) çalıştırmak, CPU sorgusu başına yaklaşık 20 ms sürüyor. Bu, gecikme bütçemiz için çok fazla. Standart çözüm, onu ONNX (Open Neural Network Exchange) formatına dönüştürmek ve son derece optimize edilmiş bir çıkarım kütüphanesi olan ONNX Runtime ile çalıştırmaktır. 8 bitlik tamsayılar (INT8) ile niceleme (ölçülebilir bir kalite kaybı olmaksızın 4 kat hız artışı karşılığında sayısal hassasiyeti azaltan bir teknik) ile model yaklaşık 118 MB bellek kullanır ve tipik bir CPU'da 3-5 ms içinde bir vektör döndürür .

GPU'ya veya vektör veritabanına gerek yok. Tüm kataloğun gömme matrisi (384 boyutta yaklaşık 4300 ürün) yalnızca 6 MB RAM kaplıyor. Benzerlik araması, bir NumPy dizisinin çarpılması ve bir argsort algoritmasının kullanılmasıyla gerçekleştiriliyor : tüm ürünler için 1 ms.

Sıralama modeli: CatBoost YetiRank

Son sıralama işlemi, Yandex tarafından açık kaynak olarak yayınlanan bir gradyan artırma kütüphanesi olan CatBoost ile yapılır . Beş algoritma arasında yapılan dahili bir yarışmanın ardından bu kütüphaneyi seçtik: CatBoost YetiRank, XGBoost, LambdaRank ile LightGBM, temel bir Pointwise algoritması ve bir Listwise algoritması. CatBoost YetiRank, en düşük katmanlar arası varyans (MRR 0,867 ± 0,014) ve en iyi çıkarım performansı ile kazandı: eğitilmiş model yaklaşık 5 MB ağırlığındadır ve 60 adayın sırasını bir milisaniyeden daha kısa sürede tahmin eder.

YetiRank, CatBoost'un bünyesine kattığı sıralama problemleri için özel bir kayıp fonksiyonudur : bir değerin (regresyon) veya bir sınıfın (sınıflandırma) tahminini optimize etmek yerine, aynı sorgu için belgeler arasındaki göreceli sıralamayı doğrudan optimize eder. Bu, sıralamayı öğrenmek için teknik olarak doğru yaklaşımdır ve yarışmamızda ampirik olarak da doğru olan yaklaşımdı.

Otomatik Tamamlama: Bir Trie

Otomatik tamamlama arama motorunu kullanmaz. Bunun yerine, her düğümün bir harfi temsil ettiği ve kökten yaprağa giden her yolun katalogdaki bir kelimenin ön ekini oluşturduğu, Trie (ön ek ağacı) adı verilen klasik bir veri yapısı kullanır. "Atu" için öneriler bulmak için, ağaçta üç adım ilerlersiniz ve oradan dallanan tüm kelimeleri döndürürsünüz.

Trie veri yapısında arama süresi milisaniye değil, mikrosaniye mertebesindedir. Bizim durumumuzda, p50 = 3 mikrosaniye, p99 = 388 mikrosaniyedir. Bu, ağın darboğaz haline gelmeden her tuş vuruşuna yanıt vermemizi sağlar.

Geri kalanlar: Python, NumPy, scikit-learn

Tüm bu parçaları bir arada tutan yapıştırıcı Python'dur. Servis katmanı sorguyu alır, Tantivy'yi çağırır, gömme işlemi için ONNX çalışma zamanını çağırır, RRF'yi NumPy ile birleştirir, depolama bit kümesini uygular, kalan adayların 14 özelliğini hesaplar, son sıralama için CatBoost'u çağırır ve sonucu serileştirir. Tüm matematiksel mantık NumPy'de bulunur ve scikit-learn yalnızca çevrimdışı eğitim sırasında kullanılır (veri bölme, metrikler, temel çizgiler).

Bu yığında pip install veya charge add ile kuramayacağınız hiçbir şey yok. Tescilli lisanslar, yinelenen ücretli harici hizmetler ve özel altyapı yok. Bu bilinçli bir yaklaşım: altyapı standartlaştırılırsa, ürettiğiniz bilgi taşınabilir olur ve bileşen ekip içinde kalır.

Bağımlılıkların özeti

  • Sözcük tabanlı arama: Tantivy (Rust, MIT lisansı)
  • Gömülü dosyalar: multilingual-e5-small (MIT)
  • Gömülü veri çıkarımı: ONNX Çalışma Ortamı (MIT)
  • Sıralama: CatBoost (Apache 2.0)
  • Glue: Python + NumPy + scikit-learn (BSD)
  • Dizi depolama: Vektör veritabanı olmadan RAM'de NumPy

Tüm bunlar yaklaşık 100 MB RAM'lik bir işlemde (model + indeks + gömme dizisi + çalışma zamanı) gerçekleşiyor. Orta seviye bir makine bile bunu sorunsuz bir şekilde çalıştırabiliyor.

İş akışı: Claude Code ile bu tarz bir projede nasıl çalışılır?

Daha önceki yazılarımda, ekibin bir bölümünün yapay zekâ ajanıyla etkileşime girmesi durumunda işin nasıl değiştiğinden bahsetmiştim. Bu konuyu burada tekrar ele almayacağım. Bunun yerine, bu projede işin nasıl dağıtıldığını açıklayacağım, çünkü bunun, projeyi tekrarlamak isteyen herkes için en faydalı bilgi olduğuna inanıyorum.

Oyuncular: İnsan karar verir, ajan uygular.

Uyguladığımız temel kural basittir. Tüm keşif işlemleri —veri analizi, yapılandırmaların test edilmesi, alternatiflerin karşılaştırılması, değerlendirme komut dosyalarının yazılması, tabloların oluşturulması— ajan tarafından yapılır. Tüm karar verme işlemleri —hangi mimarinin benimseneceği, hangi doğrulama yönteminin kullanılacağı, hangi güvenlik önlemlerinin uygulanacağı, nelerin atılacağı— insanlar tarafından yapılır.

Bu ayrım önemlidir çünkü her iki kısım da aynı sürecin parçasıdır. Kapsamlı bir keşif olmadan kararlar körü körüne verilir. Kararlar olmadan keşif, yakınsama olmayan bir dizi deneye dönüşür. Ajanın hızı, 5 yerine 175 BM25 konfigürasyonunu keşfetmesine, çalışan ilk modele bağlı kalmak yerine 3 gömme modelini karşılaştırmasına ve en son trendi benimsemek yerine sıralayıcıyı 5 algoritmanın rekabetine karşı doğrulamasına olanak tanır. Bu, "sezgiye dayalı bir kararı" "gerçek katalog verilerine dayalı bir karara" dönüştüren şeydir.

Projenin dört aşaması

Proje, her biri standart bir deney, sürümlü bir değerlendirme dosyası ve sonunda belgelenmiş bir karar içeren dört iyi tanımlanmış aşamada ilerledi.

0. Aşama: Veri Keşfi . Tek bir satır ürün kodu yazmadan başladık. Aracıyı 479 MB'lık katalog verilerine, analitik verilere, gerçek sorgulara ve satın alma verilerine bağladık ve ondan belirli soruları yanıtlamasını istedik: Ortalama bir sorguda kaç kelime var? Yüzde kaçı aksanlı karakter içeriyor? Hangi kelimeler ne sıklıkla geçiyor? Sonraki kararları değiştiren şeyler öğrendik: Sorguların %93,7'si tek kelime, %100'ü aksansız yazılmış ve aktif kelime dağarcığı yaklaşık 1300 terimden oluşuyor. Bu veriler olmadan, sistemi henüz sahip olmadığımız sorunlar için optimize etmiş olurduk.

1. Aşama: Temel sözlük. İşler karmaşıklaşmadan önce bir temele ihtiyacınız var. Ajan, ızgara aramasında 175 BM25 yapılandırmasını test etti. Kazanan, k1=0,5 ve b=0 olan BM25 oldu; b'deki sıfır önemlidir: belge uzunluğuna göre normalleştirme yapılmadığı anlamına gelir; bu, tipik bir arama motorunda sezgisel olmayan, ancak ürün adlarının kısa ve tekdüze olduğu bir katalogda doğru olan bir durumdur. Bu ancak test yoluyla keşfedilebilir.

2. Aşama: Semantik Katman . Mevcut temel verilerle, ajan üç gömme modelini karşılaştırdı. e5-small, kalite ve hız arasındaki denge nedeniyle kazandı. Bu aşamanın en ilginç yönü, MRR puanı kazanmak değil, semantik aramanın tek başına çok fazla gürültü ürettiğini ve doğru yaklaşımın onu değiştirmek değil, sözcüksel arama ile birleştirmek olduğunu doğrulamaktı.

3. Aşama: Sıralamayı Öğrenme . Bu, en çok zaman alan aşamaydı. Beş model, beş zaman dilimiyle çapraz doğrulama, özellik karşılaştırması ve önem analizi içeriyordu. Nihai karar—14 özellikli CatBoost YetiRank—sezgisel bir yaklaşımdan ziyade kontrollü bir deneyin ürünüydü. Her özelliğin önemi ölçüldü: popülerlik %37,5, gömülü vektörler %29,8 ve BM25 %12,9. Bunu bilmek çok önemliydi: daha sonra kararlarımızı savunma konusunda bize güven verdi; örneğin, modelin zaten yakaladığı sinyalleri tekrarlayan manuel kuralları atmamızı sağladı.

4. Aşama: Kişiselleştirme . Burada acı bir ders aldık. Kişiselleştirilmiş özellikleri (kategori yakınlığı, kullanıcının düzenli kullanıcı olup olmadığı) test ettik. Çevrimdışı etkilerinin %0 olduğu ortaya çıktı. Sonuç "kişiselleştirme işe yaramıyor" değil, "sorgu-kullanıcı eşleştirmesi olmadan çevrimdışı olarak doğrulayamayız, ki bizde bu yok" oldu. Karar: Üretim ortamında A/B testi için ertelemek. Bazen bir aşamanın en faydalı sonucu, o aşamanın hazır olmadığını bilmektir.

Her şeyi bir arada tutan püf noktası: pazarlık konusu olmayan bir CLAUDE.md

Bu yöntemin bağlı olduğu tek bir unsur varsa, o da projenin kök dizininde bulunan ve ajanın her oturumun başında okuduğu kurallar dosyasıdır. Biz buna CLAUDE.md diyoruz. Bu bir dokümantasyon değil; kısıtlamalar dosyasıdır .

Kurallar beş bloğa ayrılmıştır: gecikme bütçeleri (her bileşenin maksimum milisaniyelik gecikmesi), mimari kurallar (hangi algoritmaların açık bir işlem olmadan değiştirilemeyeceği), makine öğrenimi kuralları (IPW, ileriye doğru adım adım ilerleme, altın küme, güvenlik önlemleri), sürekli entegrasyon kuralları (hangi testlerin bir birleştirmeyi engellediği) ve dağıtım kuralları. Her kuralın gerekçesi (nedeni) ve ihlal edilmesinin sonucu vardır. Ajan, herhangi bir oturumda bir kuralı ihlal eden bir şey önerirse, depoya girmeden önce onu durduran bir engelleme mekanizması vardır.

Bu dosya, projenin istikrarlı bilgi tabanıdır. Öğrendiklerimiz ve yeniden öğrenmek istemediklerimiz burada yer alır. Yapay zeka ajanı sürüm değiştirdiğinde, ekip değiştiğinde, bir konuşmanın bağlamı kesildiğinde geriye kalan budur. Tam anlamıyla, vibe kodlama ile oluşturulmuş bir projeyi, sadece bir kez işe yarayan komut dosyaları koleksiyonu değil, bir proje yapan bileşendir.

Ve bundan sonra tam olarak şu geliyor: Kendi arama motorunuz için başlangıç noktası olarak kullanabileceğiniz, indirebileceğiniz CLAUDE.md formatındaki eksiksiz kılavuz.

Yayınladığımız kılavuz

Bu yazının sonunda indirilebilir bir dosya bulacaksınız: searchmo-playbook.md. Bu bir manifesto veya teorik bir kılavuz değil. Kendi arama motorumuzu yöneten kurallar şablonunun, herkesin kullanabileceği şekilde genelleştirilmiş halidir.

İçinde ne var?

Dosya dört bloktan oluşuyor:

Pazarlık edilemez kurallar . Bunlar, projeyi yöneten ve bir yapay zeka ajanının açık bir süreç olmadan ihlal edemeyeceği kısıtlamalardır. Bunlar arasında bileşen başına gecikme bütçeleri (toplam 15 ms, dağıtılmış), mimari kararlar (vektör veritabanı yok, harici küme yok, bit kümeleriyle ana indeks) ve makine öğrenimi kuralları (zorunlu IPW, zorunlu ileriye doğru adım adım ilerleme, zorunlu altın küme, -%2 güvenlik payı) yer almaktadır.

Projenin dört aşaması . Her birinin sonunda ölçülebilir bir hedefle, izlenecek sıra. Aşama 0: Katalog ve sorgu karakterizasyonu. Aşama 1: Izgara arama ile temel sözcük analizi. Aşama 2: Model karşılaştırmalı anlamsal katman. Aşama 3: Algoritma rekabeti ile sıralama öğrenme. Her aşama, Claude Code için önerilen komutları içerir: Izgara aramayı nasıl çalıştıracağınız, gömme karşılaştırıcıyı nasıl kuracağınız ve beş sıralama modelini nasıl eğiteceğiniz.

Beş algoritmik kararın kontrol listesi . Her biri için, onu belirli durumunuzda nasıl uygulayacağınıza karar vermenize yardımcı olan kriterler. Kataloğunuz bu özelliklere sahipse, X kararı. Değilse, Y kararı.

Minimum düzeyde bileşen. Test edilmiş sürümleriyle birlikte belirli bağımlılıklar. Tantivy, multilingual-e5-small, ONNX Runtime, CatBoost, Python, NumPy, scikit-learn. Hepsi açık kaynaklı, hepsi tekrarlanabilir.

Nasıl kullanılır?

  1. Dosyayı indirin ve yeni bir deponun kök dizinine CLAUDE.md olarak kaydedin.

  2. O dizinde Claude Code dosyasını açın.

  3. Ondan kuralları okumasını ve 0. Aşamadan başlamasını isteyin.

  4. Buradan itibaren, deneyleri yürüten ajanla görüşme görüşme, aşama aşama ilerlersiniz ve her birinin sonunda kararları siz verirsiniz.

Tüm süreç bir ay sürdü, ancak işin %70'i (veri keşfi, temel sözcük dağarcığı geliştirme, anlamsal katman ve sıralayıcının ilk sürümü) uzun bir hafta sonu içinde tamamlandı. Ayın geri kalanı ise iyileştirmeye harcandı: model yönetimi, altın küme, yeniden eğitim hattı ve güvenlik önlemleri. Amatör anlamda bir hafta sonu projesi değil. Ama aynı zamanda on beş kişilik bir ekip gerektiren bir proje de değil: iyi muhakeme yeteneğine sahip birkaç kişi ve bir yapay zeka ajanı tarafından halledilebilecek bir proje.

Kılavuzun sizin için çözemediği şeyler

Dosyanın çözemediği üç şey var ve başlamadan önce bunu bilmekte fayda var.

Kataloğunuz . Kılavuz, yöntemi açıklıyor. Katalog verileriniz size ait: hangi ürünlere sahipsiniz, onları nasıl tanımlıyorsunuz, hangi davranışsal sinyalleri kaydettiniz. Bu verilerin kalitesi ne kadar yüksekse -özellikle tıklama günlüğü- sistem o kadar hızlı yakınsar.

Sizin değerlendirmeniz . Beş algoritmik kararın bir nedeni var; bu neden vakaların %80'i için geçerli. Geri kalan %20'lik kısım ise değerlendirme gerektiriyor. Kılavuz size ne sormanız gerektiğini öğretiyor, ne cevap vermeniz gerektiğini değil.

Titizliğiniz . En zorlu kısım algoritmik yön değil: ölçme, değişmez bir altın standart kümesine göre değerlendirme ve kendi modeliniz bozulduğunda güvenlik önlemlerine uyma disiplinidir. İşte bu kısmı siz sağlıyorsunuz.

Paylaş:

Remove New Line Breaks from Text

Line Break Remover

Remove unwanted line breaks from text, especially useful for text copied from PDFs. Preserve paragraphs or remove all breaks.

Ready.
Ready.
Paylaş:

Print Linux Path Without Duplicates on different lines

 If you want to print the path and seeing so many duplicates or seeing everything nn the same line, you can use this solution.

Normally the solution to print path on different lines is:

echo "$PATH" | tr : "\n"

but only this wouldn't remove the duplicates.

To remove the duplicates, open ~/.bashrc and paste this to the end of file:

PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')"
export PATH
alias listpath='echo "$PATH" | tr : "\n"'

This command makes sure that it will remove the duplicates and keep the correct order.

It also creates an alias so using `listpath` command would easily print as we want.



Paylaş:

Sort String Alphabetically

 

Alphabetical Sorter


Sort text items alphabetically. Supports comma or new-line separated lists, with number placement and reverse order options.

Ready to sort.
Ready.
Paylaş:

Number Sum - Average - Min - Max Calculator

Number Sum Calculator


Paste a list of numbers separated by commas or new lines. Non-numeric tokens are skipped automatically.

Sum: —
Numbers detected: —
Average: —
Min / Max: —
Ready.
Paylaş:

Text to/from Bytes or Hex Converter

Text ↔ Hex / Bytes Converter

Convert text to hexadecimal or decimal bytes, and reverse. Supports UTF-8. (Hex with spaces, with 0x prefix, plain, decimal bytes, binary bytes, octal bytes...)

Text → Hex / Bytes

Ready.
Paylaş:

Age Calculator

Age Calculator



Enter birth date and calculate full age details including next birthday info.

Your age: -
Age Status: -
Day of the Week: -
Days Remaining Until Next Birthday: -
Total Days Lived: -
Ready.
Paylaş:

Strong Password Generator

Strong Password Generator (Güçlü Şifre Oluşturucu)


Create strong passwords (open source and safe) instantly with your selected options.

Include 0-9
Include !@#$...
Ready.
Paylaş:

Ara