Sıfırdan 2 Ayda 300 Milyon Nöral Gömme ile Bir Web Arama Motoru Kurmak
(blog.wilsonl.in)- Arama motoru kalitesindeki düşüş ve Transformer tabanlı gömme modellerindeki ilerlemelerden hareketle, 2 ay boyunca 300 milyon gömme tabanlı bir web arama motoru geliştirme deneyimi ele alınıyor
- Toplam 200 GPU kümesi, büyük ölçekli dağıtık crawler, RocksDB, HNSW gibi yüksek performanslı altyapı ve algoritmalarla gerçek zamanlı doğal dil anlayışlı arama hayata geçiriliyor
- Anahtar kelime eşleşmesi yerine niyet odaklı soru-cevap hedeflenerek, belge ayrıştırma ve bağlam koruma için normalizasyon, chunking, ifade zincirleme gibi çeşitli NLP/ML teknikleri uygulanıyor
- Pipeline, depolama, service mesh, vektör indeksi gibi her katmanda büyük ölçekli dağıtık sistem tasarımı ile darboğaz ve maliyet optimizasyonu yöntemleri tanıtılıyor
- Sonuçta ultra düşük gecikmeli, büyük ölçekli dağıtık, yüksek doğruluklu kişiselleştirilmiş bir arama motorunun ortaya çıktığı anlatılıyor
Genel Bakış ve Motivasyon
- Yazar, son dönemde arama motoru kalitesindeki düşüş, SEO spam'i ve alakasız içeriklerin artmasıyla ilgili farkındalığı ve Transformer tabanlı gömme modellerinin doğal dili anlama kapasitesinin yükseldiği ortamı birleştirerek bir arama motorunu sıfırdan kurmaya karar veriyor
- Mevcut arama motorlarının sınırları, insan seviyesinde soru anlama yeteneğinin eksikliği ve anahtar kelime tabanlı basit eşleştirmeden kaynaklanıyor
- Amaç, kaliteli içeriğin her zaman üst sıralarda görünmesini sağlamak ve uzun kuyrukta kalan sonuçları da dengeli biçimde keşfeden niyet odaklı sıralama kurmak
- Web arama motoru inşa etme süreci; bilgisayar bilimi, dilbilim, ontoloji, NLP, ML, dağıtık sistemler ve performans mühendisliği gibi pek çok alanı kapsıyor
- Bu proje, 2 ay boyunca altyapı ya da önceden edinilmiş deneyim olmadan tamamen tek başına başlayıp tamamen yeni bir arama motoru gerçekleştirme meydan okuması olarak sunuluyor
Genel Sistem Yapısı
- 200 GPU kümesinde SBERT tabanlı 300 milyon metin gömmesi üretiliyor
- Aynı anda çalışan yüzlerce crawler saniyede 50.000 sayfa topluyor ve toplam 280 milyon indeks oluşturuyor
- RocksDB ve HNSW, 200 çekirdek, 4 TB RAM ve 82 TB SSD üzerinde sharding ile depolanıp indeksleniyor
- Sorgu yanıtı için toplam gecikme yaklaşık 500 ms seviyesinde hedefleniyor
- Genel yapı ve akış; crawler, pipeline, depolama, gömme vektör indeksi, service mesh ve front-end/back-end alanlarına ayrılıyor
Gömme Tabanlı Arama Deneyleri ve İyileştirmeler
Neural Embedding Playground
- SBERT gibi gömme modelleriyle yapılan aramanın, geleneksel anahtar kelime odaklı aramaya göre daha doğal sorgu anlama ve daha yüksek doğruluk sağladığı deneylerle doğrulanıyor
- Girdi sorgusunun niyetini bağlam ve cümle düzeyinde anlayarak gerçekten ilgili doğru yanıtları çıkarmanın mümkün olduğu gösteriliyor
Geleneksel Arama vs. Nöral Arama Örnekleri
- Geleneksel arama: rastlantısal sonuçlar, ağırlıkla anahtar kelime eşleşmesi
- Gömme araması: sorunun bağlamını ve niyetini kavrayıp, doğru çekirdek cümle veya kavram odaklı sonuçlar sunma
- Karmaşık kavram birleşimleri, örtük/bileşik sorular ve kalite sinyali içeren sorgularda anlam tabanlı doğru yanıt araması mümkün oluyor
Web Sayfası Ayrıştırma ve Normalizasyon
-
HTML içinden yalnızca anlamsal metin öğelerini çıkarıp düzen/kontrol öğeleri gibi gürültüleri temizlemeyi amaçlayan normalizasyon hedefleniyor
-
WHATWG, MDN gibi standartlara uygun biçimde
p,table,pre,blockquote,ul,ol,dlgibi yapıların korunması sağlanıyor -
Menü, gezinme, yorumlar, arayüz gibi chrome öğeleri tamamen kaldırılıyor
-
Siteye özel (ör.
en.wikipedia.org) kurallar uygulanarak aşırı/eksik çıkarım sorunları çözülüyor -
Anlam tabanlı yapılandırılmış veriler (
meta, OpenGraph,schema.orgvb.) kullanılarak bilgi grafiği kurma ve sıralamayı iyileştirme de mümkün oluyor
Chunking ve Bağlam Koruma
Cümle Düzeyinde Chunking
- Gömme modellerinin sınırlarını aşmak için tüm sayfa yerine cümle tabanlı chunking uygulanıyor
- Chunking sırasında doğal cümle sınırları, dilbilgisi, kısaltmalar, URL'ler ve gayriresmî ifadeler gibi çok sayıda durum spaCy sentencizer ile doğru biçimde ayrıştırılıyor
Bağlam Koruma ve Bağlantılama
- Cümleler arasındaki bağımlılıklar, başlıklar, paragraflar, tablolar vb. tespit edilerek bağlam bilgisi de birlikte paketlenip gömmeye dahil ediliyor
- Örneğin tablo yapıları da her satırın anlamını kaybetmemesi için üst başlıklar/maddeler zincirleme biçimde bağlanarak ekleniyor
İfade Zincirleme (Statement Chaining)
- DistilBERT sınıflandırıcısı, bir cümleyi önceki cümleyle birlikte analiz ederek bağlama bağımlılığı doğrulama ve zincir çıkarımını otomatikleştiriyor
- Gömme sırasında üst bağımlı cümlelerin tamamı birlikte dahil edilerek bağlamı koruma gücü artırılıyor
Prototip Kullanım Sonuçları
- Sandbox ortamında çeşitli gerçek sorgularla yapılan deneylerde, mevcut yöntemlere kıyasla çok daha doğru (bağlama uyumlu) soru-cevap sonuçları doğrulanıyor
- Anahtar kelime uyumsuzluğu, eksiltme/mecaz/bileşik sorular gibi durumlarda da uygulama niyeti tanıyıp doğru bağlam cümlelerini eşleştiriyor; gizli bilgi ve ilişkileri de etkili biçimde ortaya çıkarıyor
Büyük Ölçekli Web Crawler'ı (Node Tabanlı)
- İş yükü dağıtımı için work stealing, alan adına göre eşzamanlılık/trafik kontrolü, DNS/URL/header doğrulaması gibi çeşitli kararlılık ve verimlilik unsurları dikkate alınıyor
- Crawler; asenkron I/O tabanlı Promise yapıları, DDoS'a dayanıklı mekanizmalar, kaynak yönetimi (bellek, gecikme, backoff) ve gürültülü domain tespiti gibi özelliklerle tasarlanıyor
- URL normalizasyonu, protokol ile port/kullanıcı bilgisi kısıtlamaları ve canonicalization ile yinelenen/anormal URL filtreleme güçlendiriliyor
Pipeline (Dağıtık Görev Kuyruğu)
- Her sayfanın durumu başlangıçta PostgreSQL üzerinde yönetiliyor; ilk aşamada doğrudan polling ve transaction kullanılıyor
- Büyük ölçekli dağıtık ortamda (binlerce crawler) ölçeklenme sorunu ile kuyruk/kilit darboğazları ortaya çıkınca, kuyruk durumunu yönetmek için Rust tabanlı bellek içi coordinator geliştiriliyor
- Görev yapısı; hash map tabanlı indeksler, binary heap, domain grupları, rastgele polling, yer değiştirme (
swap_remove) gibi çeşitli indeksleme tekniklerini içeriyor - Görev başına bellek kullanımı yaklaşık 100B düzeyinde ve 128GB sunucuda 1B görev bile işlenebiliyor
- Daha sonra SQS yerine geçecek, RocksDB tabanlı açık kaynak bir kuyruk da geliştirilerek tek düğümde saniyede 300 bin işlem destekleniyor
Depolama Tasarımı (Oracle → PostgreSQL → RocksDB)
- Başlangıçta Oracle Cloud (düşük maliyetli egress/depolama), ardından PostgreSQL (
TOAST) kullanılsa da, sonunda yazma ölçeklenmesi ve performans sınırlarıyla karşılaşılıyor - PostgreSQL'in MVCC, Write Amplification ve WAL gibi özellikleri nedeniyle büyük ölçekli paralel
INSERTişlemlerinde darboğaz oluşuyor; sonuçta KV store olan RocksDB'ye geçiliyor - RocksDB'nin ayrı blob depolaması (BlobDB), SST dosyaları, çoklu thread ve hash indexing özellikleriyle NVMe SSD'nin azami performansı kullanılıyor
- Sistem 64 RocksDB shard'ına genişletiliyor; her shard
xxHash(key)tabanlı yönlendirme kullanıyor veSerde+MessagePackserileştirmesi uygulanıyor - Son durumda binlerce istemciden (crawler/parser/vectorizer) saniyede 200 bin işlem işleniyor; metadata ve blob'lar ayrıştırılıp sıkıştırılarak saklanıyor
Service Mesh ve Ağ Yapısı
- Altyapı büyüdükçe servis örneklerini otomatik keşfetmek ve iletişimi güvenceye almak için
mTLS+HTTP2tabanlı bir tasarım kuruluyor - Her Node üzerinde root CA tabanlı sertifikalar uygulanıyor;
MessagePackserileştirmesi doğrudan kullanılıyor, iç DNS ve CoreDNS ile özel istemci SDK'ları geliştiriliyor - Daha önce VPN (
ZeroTier,Tailscale) deneyimi bulunsa da ağ, performans ve operasyon sorunları nedeniyle doğrudanHTTP+mTLStercih ediliyor - Sistem servis denetimi (
systemd+cgroup+journald) ile yönetim tekilleştirilip hafifletme ve standardizasyon sağlanıyor
Büyük Ölçekli GPU Gömme Üretim Pipeline'ı
- İlk aşamada OpenAI API kullanılıyor, ancak maliyet nedeniyle daha sonra Runpod gibi yüksek performanslı GPU ortamlarına geçiliyor
- Pipeline'da her aşama asenkron olarak ayrılıyor, GPU verimliliği %90'ın üstüne çıkarılıyor ve 250 GPU ile saniyede 100 bin embedding üretiliyor
- Rust pipeline, Python inference ve named pipe üzerinden IPC kullanılıyor; yapısal backpressure ile kaynaklar otomatik ayarlanıyor
Vektör İndeksleme (HNSW/Sharding)
- HNSW algoritması kullanılarak bellek tabanlı vektör araması yapılıyor; ANN (Approximate Nearest Neighbor) ile ultra düşük gecikme elde ediliyor
- RAM sınırına ulaşıldığında düğümler arasında dengeli sharding (64 düğüm) uygulanıyor ve her shard ayrı HNSW indeksiyle paralel aranıyor
- HNSW'nin doğası gereği yüksek RAM gereksinimi ve canlı güncelleme sınırları bulunuyor; sonunda CoreNN adlı disk tabanlı açık kaynak vektör veritabanına geçiliyor
- CoreNN, 128GB RAM ile tek düğümde bile 3B embedding üzerinde yüksek doğruluklu sorgulama yapabiliyor
Arama Motoru UX'i ve Gecikme Optimizasyonu
- Arama motoru UX'inde ana unsur anında yanıt vermek; bu yüzden yükleme göstergesi yok ve geleneksel SSR kullanılıyor
- Cloudflare Argo vb. ile edge PoP'lara yakınlaştırma yapılıyor,
HTTP/3benimsenerek iletim gecikmesi en aza indiriliyor - Tüm veriler uygulama sunucusu seviyesinde hazır tutuluyor, tek tek API roundtrip'leri en aza indiriliyor ve minify edilmiş, sıkıştırılmış sayfalar anında döndürülüyor
Bu özet, modern doğal dil işleme ve ML teknolojileri kullanan büyük ölçekli bir web arama motorunun nasıl yalnızca 2 ayda uçtan uca kurulabildiğini; sistem, algoritma ve altyapı genelindeki başlıca tasarım ve optimizasyon kararlarıyla birlikte somut biçimde açıklıyor.
Henüz yorum yok.