Vector Databases

Gerçek Zamanlı Kişiselleştirme İçin Vespa: Vektör Aramada Kullanıcı-Etkileşim Modellerinin Uygulanması

"Anında" hissi veren öneri sistemleri oluşturmak, modern yazılım mimarisindeki en zorlu görevlerden biridir. Geleneksel yaklaşımlar, sorgu sırasında benzerlik puanlarını hesaplatırken gecikme artışlarından muzdarip olabilir. Vespa, açık kaynaklı bir arama ve veri analitiği platformu olarak, sorgu işleme motorunda vektör aramayı yerel olarak destekleyerek benzersiz bir avantaj sunar. Bu, ayrı ve yavaş çıkarım servislerine ihtiyaç duymadan gerçek zamanlı kişiselleştirme sağlar.

Vektör Arama İçin Neden Vespa Seçilmeli?

Karmaşık filtreleme veya yapılandırılmış veri birleştirmelerinde zorlanabilen saf vektör veritabanlarının aksine, Vespa aramayı, vektör benzerliğini ve analitiği tek bir sistemde birleştirir. Kişiselleştirme için bu hayati önem taşır, çünkü öğeleri yalnızca anlamsal benzerliğe dayalı olarak önermek istemezsiniz. Kullanıcı tercih gömme vektörlerine (embedding) dayalı olarak öğeleri puanlarken, aynı zamanda envanter, kullanıcı konumu veya abonelik durumuna göre filtrelemeniz gerekir.

Temel mekanizma, öğe gömme vektörlerini (embeddings) Vespa'da depolamak ve sorgu sırasında verimli en yakın komşu algoritmaları kullanarak benzerlik puanlarını hesaplamaktır. Vespa, yüksek boyutlu vektörler için HNSW (Hierarchical Navigable Small World) dahil olmak üzere birden fazla indeksleme yöntemini destekler ve milyonlarca öğe ile bile milisaniye düzeyinde yanıt sürelerini garanti eder.

Veri Modelinin Tanımlanması

Bir kullanıcı-öğe etkileşim modeli uygulamak için önce şemayı (schema) tanımlarız. Her öğe (örneğin, bir ürün veya makale) için bir gömme vektörü (embedding vector) ve filtreleme için meta veriler depolayacağız. İşte örnek bir .sd (Şema Tanımı) dosyası:

schema items {
    document items {
        field title type string {
            indexing: index | summary
        }
        field category type string {
            indexing: index
        }
        field embedding type tensor[x(768)] {
            indexing: index
        }
    }
    indexes {
        vector embedding {
            dimension: 768
            distance-metric: euclidean
            max-posting-list-size: 100
        }
    }
}

vector indeks tanımına dikkat edin. Boyutu (768, BERT tarzı gömme vektörleri için tipik) ve mesafe metrikini belirtiriz. Normalize edilmiş gömme vektörleri için Öklid mesafesi standarttır, ancak vektörlerin işleme (ingestion) öncesinde normalize edilmesiyle kosinüs benzerliği elde edilebilir.

Kişiselleştirme ile Sorgulama

Vespa'nın gücü sorgu aşamasında ortaya çıkar. Vektör benzerliğini iş mantığıyla birleştirebiliriz. Geçmiş etkileşimlerinden üretilmiş kendi gömme vektörüne sahip bir kullanıcı profili olduğunu varsayalım. Kullanıcının vektörüne en yakın öğeleri getiren, ancak stokta olmayan öğeleri filtreleyen bir sorgu gönderebiliriz.

{
  "query": {
    "root": {
      "id": "root",
      "timeout": "50ms",
      "inputs": {
        "query.user_embedding": [0.1, 0.5, -0.2, ... 765 more values]
      }
    }
  },
  "yql": "select * from items where userembedding(query.user_embedding) and category in filter('category')"
}

Burada, userembedding(), depolanan öğe vektörü ile kullanıcının sorgu vektörü arasındaki benzerliği hesaplayan yerleşik bir Vespa sorgu operatörüdür. Sonuç, sıralama için kullanılabilen bir puandır. YQL (Vespa Sorgu Dili) içinde doğrudan filtreler ekleyerek, yalnızca uygun öğelerin dikkate alındığından ve vektör aramanın erken aşamada budandığından (pruned), performansın iyileştirildiğinden emin oluruz.

Gerçek Zamanlı Güncellemelerin İşlenmesi

Kişiselleştirmedeki temel zorluklardan biri, modelin güncelliğini korumaktır. Vespa, yeni öğelerin ve kullanıcı gömme vektörlerinin gerçek zamanlı indekslemesine olanak tanır. Bir kullanıcı yeni bir öğeyle etkileşime girdiğinde, profil gömme vektörünü güncelleyebilir ve bunu Vespa'nın update uç noktasına (endpoint) gönderebilirsiniz. Vektör indeksi artımlı olarak güncellendiğinden, sonraki sorgular servisi yeniden başlatmadan kullanıcının en son tercihlerini yansıtacaktır.

Ayrıca, Vespa birden fazla düğüm arasında dağıtık aramayı destekler. Kataloğunuz büyüdükçe, içerik gruplarının sayısını artırarak vektör indeksini ölçeklendirebilirsiniz. Sorgu katmanı, vektör aramayı düğümler arasında otomatik olarak dağıtır ve sonuçları birleştirir, düşük gecikmeyi korur.

Pratik Örnek: E-Ticaret Önerileri

10 milyon ürüne sahip bir e-ticaret sitesini düşünün. Kullanıcılar ve ürünler için gömme vektörleri üretmek için iki kuleli (two-tower) bir sinir ağı kullanıyoruz. Kullanıcı kulesi, tarama geçmişlerine dayalı olarak 128 boyutlu bir vektör üretirken, ürün kulesi ürün özelliklerine dayalı olarak 128 boyutlu bir vektör üretir.

Vespa'da ürün vektörlerini depolarız. Sorgu sırasında, ön yüz (frontend) kullanıcının 128 boyutlu vektörünü gönderir. Vespa, YQL sorgusunu çalıştırır, kullanıcının bölgesindeki stokta olan öğeleri filtreler ve bunları kosinüs benzerliğine göre sıralar. İlk 50 sonuç, "Sizin İçin Önerilenler" bölümünde görüntülenmeye hazır olmak üzere 10ms'den kısa bir sürede döndürülür.

Sonuç

Vespa, vektör araması aracılığıyla gerçek zamanlı kişiselleştirme uygulamak için sağlam ve ölçeklenebilir bir çözüm sunar. Vektör benzerliğini tek bir sorgu motorunda yapılandırılmış filtrelemeyle birleştirerek, geliştiriciler ilgiliyi iş kurallarıyla dengeleyen, tepkisel öneri sistemleri oluşturabilir. İster bir haber akışı ister bir e-ticaret platformu geliştiriyor olun, Vespa'nın düşük gecikmeyle büyük ölçekli vektör işlemlerini ele alma yeteneği, onu modern veri odaklı uygulamalar için güçlü bir seçim haline getirir.

Share: