Vektör dizini tasarımı ve filtreli arama
Yaklaşık komşu aramasının isabet, gecikme ve bellek üçgenini; dizin ailelerinin çalışma mantığını ve filtreli aramada sıranın neden sonucu değiştirdiğini öğretir.
Önkoşul: Embedding
BU DERSİN SONUNDA
- Dizin ailelerini çalışma mantığı ve bedeli üzerinden ayırt etmek
- Ham vektör bellek bütçesini boyut ve kayıt sayısından hesaplamak
- Arama genişliği parametresini isabet-gecikme eğrisiyle seçmek
- Yetki ve tarih filtrelerini aramanın parçası olarak tasarlamak
- 1
Teori
Kavramın çalışma mantığı
- 2
Örnek
Gerçek bir senaryo üzerinde gösterim
- 3
Lab
Uygulamalı alıştırma
- 4
Test
Kısa ölçüm
- 5
Proje
Rotadaki projeye katkı
Kısa cevap
Vektör veritabanı, yaklaşık en yakın komşu aramasını isabet, gecikme ve bellek arasında bir noktaya sabitler. Dizin ailesi ve parametreleri bu üçgende nerede durduğunuzu belirler; hiçbir parametre üçünü birden iyileştirmez. Filtreli aramada ise sıra kritiktir: koşul aramadan sonra uygulanırsa sonuç kümesi beklenmedik biçimde boşalır; koşul bir yetki kuralıysa sonradan uygulanan filtre güvenlik sorununa dönüşür.
Teori: neden yaklaşık arama#
Tam tarama basittir: sorgu vektörünü tüm kayıtlarla karşılaştırır ve en yakın k tanesini döner. Maliyeti kayıt sayısı ile boyutun çarpımına göre doğrusal büyür, buna karşılık sonuç tanım gereği kesindir. Gecikme hedefinizi tutuyorsa tam tarama yeterlidir ve kesin sonuç ile basit güncelleme avantajını size bırakır; ölçek büyüdükçe her sorgunun tüm dizini okuması bir noktada sürdürülemez hale gelir. O noktanın nerede olduğunu kayıt sayısına bakarak değil kendi donanımınızda ölçerek bulursunuz.
Bellek hesabı boyuttan çıkar. float32 bir sayı 4 bayt tutar; bu örnekte 768 boyutlu vektörler ve bir milyon parça varsayalım: ham vektörler yaklaşık 3 GB yer kaplar. Grafik tabanlı dizinler bunun üstüne komşuluk bağlantıları için ek yük bindirir. Nicemleme ise her boyutu daha az baytla saklayarak tabloyu küçültür; bedeli hızdan değil doğruluktan ödenir, çünkü mesafeler daha kaba temsillerden hesaplanır.
Yaklaşık arama, kesin komşuyu bulma garantisinden vazgeçerek hız kazanır. Her dizin ailesinde bu vazgeçişin miktarını ayarlayan bir arama genişliği parametresi vardır: genişlettikçe isabet artar, gecikme de artar. Bu yüzden dizin parametreleri bir kurulum ayrıntısı değil ürün kararıdır. Doğru sıra şudur: önce hedefi isabet cinsinden yazmak, sonra o hedefi tutan en düşük gecikmeyi aramak.
Dizin aileleri#
| Dizin ailesi | Çalışma mantığı | Güçlü olduğu yer | Bedeli |
|---|---|---|---|
| Tam tarama | Sorguyu bütün vektörlerle karşılaştırır | Küçük dizin, kesin sonuç, sık değişen veri | Sorgu maliyeti kayıt sayısıyla doğrusal büyür |
| Grafik tabanlı | Vektörler komşuluk grafiğiyle bağlanır, arama grafikte yakına doğru yürür | Yüksek isabet ve düşük gecikme | Bellek ek yükü yüksek; silme ve güncelleme pahalı |
| Kümeleme tabanlı | Vektörler kümelere ayrılır, sorgu yalnızca yakın kümelerde aranır | Büyük dizinde bellek dostu ve ayarlanabilir | Küme sınırına düşen komşular kaçabilir; eğitim adımı gerekir |
| Nicemlemeli kümeleme | Vektörler sıkıştırılmış temsille saklanır | Belleğin bağlayıcı kısıt olduğu ölçek | Mesafeler yaklaşık; ilk adayların yeniden puanlanması gerekir |
Filtreli arama: sıranın önemi#
Aramaya yalnızca yürürlükteki belgeler ya da yalnızca bu ekibin görebildiği kayıtlar gibi bir koşul eklemenin üç yolu var. Sonradan filtreleme önce ilk k komşuyu bulur, ardından koşula uymayanları atar; koşul seçiciyse elinizde birkaç sonuç, bazen hiç sonuç kalmaz. Filtre farkındalıklı arama koşulu dizin gezinmesinin içine taşır, böylece yalnızca uygun kayıtlar aday olur. Çok seçici koşullarda üçüncü yol daha makuldür: önce koşulu uygulayıp küçülen küme üzerinde tam tarama yapmak.
{
"sorgu_vektoru": "<768 boyutlu birim vektör>",
"ilk_k": 10,
"arama_genisligi": 120,
"filtre": {
"erisim_grubu": { "$in": ["tum-calisanlar", "ik-ekibi"] },
"yururluk_bitis": { "$gt": "<bugun>" },
"gomme_surumu": "gomme-v3"
},
"not": "Filtre dizin gezinmesine verilir; sonuç kümesi döndükten sonra değil."
}Karar akışı#
- 1İsabet hedefini yaz
Tam taramanın döndürdüğü komşu listesini referans alın ve bu listenin ne kadarını yakalamanız gerektiğini sayıyla belirleyin.
- 2Bağlayıcı kısıtı belirle
Parça sayısı, boyut, bellek bütçesi ve kabul edilebilir gecikmeyi yazın; dizin ailesini bunlardan en dar olanı seçer.
- 3Parametreyi süpür
Arama genişliğini kademeli artırıp her adımda isabet ve gecikmeyi kaydedin; isabetin doyduğu noktadan sonrası boş maliyettir.
- 4Filtreyle birlikte doğrula
En seçici filtrenizle aynı ölçümü yineleyin; filtresiz ölçüm üretimdeki davranışı temsil etmez.
- 5Yazma yükünü sına
Güncelleme ve silme trafiğini ölçüme dahil edin; bazı dizinlerde silinen kayıt yalnızca işaretlenir ve yeniden inşaya kadar aramayı etkiler.
Sık yapılan hata#
- Dizin parametrelerini varsayılanda bırakıp isabeti hiç ölçmemek: sistem çalışır görünür, kaçırılan komşular görünmez.
- Ölçümü filtresiz yapmak: üretimdeki her sorgu yetki ve tarih filtresiyle geliyorsa filtresiz gecikme yanıltıcıdır.
- Silinen kaydı yalnızca uygulama katmanında gizlemek: vektör dizinde kaldığı sürece komşuluk hesabını etkiler.
- Çok kiracılı ayrımı yalnızca filtreye bırakmak: ayrım gereksinimi katıysa ayrı dizin ya da ayrı ad alanı daha güvenlidir.
- Nicemlemeyi bellek için açıp ilk adayların yeniden puanlanmasını atlamak: sıkıştırılmış mesafeler üst sıraları karıştırır.
LAB · UYGULAMALI ALIŞTIRMA
Dizin parametrelerini isabet-gecikme eğrisiyle seçin
- 1Kendi parçalarınızdan elinizdeki en büyük vektör kümesini hazırlayın ve 20 işaretli sorgu seçin; hepsi aynı gömme modeli ve normalizasyon kuralıyla üretilsin.
- 2Referans olarak tam tarama koşun ve her sorgu için ilk beş komşuyu dosyaya yazın; sonraki ölçümler bu listeye göre karşılaştırılacak.
- 3Yaklaşık dizini kurup arama genişliğini en az üç farklı değerle koşturun; her koşuda tam tarama ilk-beşini yakalama oranını ve sorgu başına süreyi kaydedin.
- 4Aynı üç koşuyu, üretimdeki en seçici filtrenizi ekleyerek yineleyin ve sonuç sayısı düşen sorguları ayrıca not edin.
- 5Kayıtların yüzde onunu silip ölçümü tekrarlayın; silme sonrası isabet ve gecikmedeki değişimi yazın.
- 6İsabetin doyduğu en düşük genişliği seçin ve kararı genişlik, isabet ve gecikme sütunlu bir tabloyla gerekçelendirin.
Beklenen çıktı
Filtreli ve filtresiz koşuları içeren bir isabet-gecikme tablosu ve üretim için seçilen dizin ailesi ile parametrelerinin yazılı gerekçesi.
Sık sorulan sorular
Kaç kayıttan sonra yaklaşık aramaya geçmeliyim?
Kayıt sayısı tek başına eşik değildir; bağlayıcı olan sorgu gecikmeniz. Tam tarama gecikme hedefinizi tutuyorsa yaklaşık dizine geçmek size kesin sonuç ve basit güncelleme avantajını kaybettirir. Ölçümü kendi donanımınızda ve kendi vektör boyutunuzla yapın.
Altın cevap yokken dizin isabetini nasıl ölçerim?
Altın cevaba ihtiyacınız yok: tam taramanın sonucu tanım gereği kesin komşu listesidir. Yaklaşık dizinin bu listeyi yakalama oranı, içerik kalitesinden bağımsız olarak dizin ayarını ölçer. Getirilen parçanın soruyu gerçekten cevaplayıp cevaplamadığı ayrı bir ölçümdür.
Filtre alanlarını ayrı bir ilişkisel veritabanında tutabilir miyim?
Kimlik listesini dışarıdan alıp aramaya vermek küçük kümelerde çalışır; liste büyüdükçe sorgu yükü ve tutarsızlık riski artar. Filtreye giren alanları vektörün üst verisinde tutmak hem sıralamayı hem yetkiyi tek yerde karar verilebilir kılar.
LEARN
Generative AI Engineer rotasına devam et
Dersler tek başına da okunabilir, ama sıralı ilerlemek önkoşul boşluklarını kapatır.
