Kullanıcı "dizüstü bilgisayar" yazdığında "laptop" içeren belgeyi bulamıyorsanız, kelime eşleşmesi yapmışsınızdır; arama yapmamışsınız. Vektör aramanın sözü budur: metni kelimelerine değil anlamına göre ölçmek. Metin, yüzlerce boyutlu bir sayı dizisine dönüşür; benzer anlamlı metinler bu uzayda birbirine yakın düşer. Böylece "taşımada pil süresi" sorusu, "batarya ömrü" içeren ama tek kelime bile ortak olmayan belgeyi bulur.

Bu, kavramsal bir gösteri değil: arama kalitesindeki farkı ilk günden hissedersiniz. Kelime eşleşmesi "yok" derken anlamsal arama, sorunun ne anlama geldiğini tahmin eden bir kütüphaneci gibi davranır. Tahmin tabii ki hata da yapar; bu yüzden olgun sistemler iki yöntemi birlikte çalıştırır ve sonuçları birleştirir. Buna karma arama denir ve modern içerik sitelerinin çoğunun sessiz tercihidir.

Gömme nedir, benzerlik nasıl ölçülür

Gömme modeli, bir metni sabit boyutlu vektöre çevirir; popüler modeller 384'ten 1536'ya kadar boyutlarda çalışır. İki vektörün benzerliği çoğunlukla kosinüs benzerliğiyle ölçülür: iki yön arasındaki açının ölçüsü. Bir (biri sıfır olmamak üzere) iki vektörün kosinüs benzerliği, aralarındaki açının kosinüsüdür:

-- pgvector: yarı mesafeli en yakın 5 belge
CREATE EXTENSION IF NOT EXISTS vector;

SELECT id, baslik
FROM dokumanlar
ORDER BY gomme <=> '[0.021, -0.113, 0.044, ...]'::vector
LIMIT 5;

Kosinüs +1'e yakınken anlamlar aynı, 0'a yakınken ilgisizdir. Arama motorunun işi, bu uzayda sorgu vektörüne en yakın belgeleri bulmaktır; on binlerce belgede sıralı tarama yeter, milyonlarda ise yaklaşık en yakın komşu indeksleri devreye girer.

Pratikte kurulum

Modern veritabanı motorlarının çoğu gömme saklamayı yerleşik destekler; ayrı bir vektör veritabanı, çoğu projede gereksiz ek bir taşınma maliyetidir. İş akışı üç adımdır: belgeleri parçalara ayırın, her parçayı gömme modelinden geçirin, vektörü ve metni birlikte saklayın. Sorgu anında yalnız soruyu gömün ve en yakın parçaları çekin.

// Parçalama ve saklama iskeleti
const parcalar = metniBol(metin, { boyut: 500, bosluk: 50 });

for (const parca of parcalar) {
  const gomme = await model.embed(parca);
  await db.insert(dokumanlar).values({ icerik: parca, gomme });
}

Parçalama boyutu sessiz karar gibi görünür ama sonucu belirler: çok küçük parçalar bağlamı koparır, çok büyük parçalar ilgisiz cümleleri sonuçlara karıştırır. 300-600 token aralığı ve %10-20 örtüşme, çoğu metin türünde iyi başlangıçtır. Başlıklar ve bölüm adlarını parçanın başına eklemek de ucuza kazanım sağlar: gömme modeli başlığı gövdeden ayıramaz, siz açıkça vermezseniz parça, ait olduğu belgeyi anlatan bağlamı kaybeder.

Özetle vektör arama, anahtar kelime aramasının rakibi değil tamamlayıcısıdır: anahtar kelime tam terimi tutar, vektör anlamı yakalar. En iyi sonuç, iki yöntemin sonuçlarını birleştiren karma yaklaşımdan gelir. Başlangıç için ikinci bir öneri: gömmeleri kendi verinizle ince ayar yapmadan kullanın; genel modeller Türkçe dahil çoğu dilde şaşırtıcı derecede iyidir ve kendi modelinizi eğitmek, çoğu projede gereksiz bir maliyet. Anlamına göre arama yapan bir sistem kurmak artık araştırma projesi değil, bir öğleden sonralık mühendislik işi; matematiği de sandığınız kadar korkunç değil: anlamı sayıya çevirip açı ölçmek, aslında hepsi bu.