Vektör dizini seçmek ve boyutlandırmak
Vektör dizini kararının üç girdisi vardır: vektör sayısı, p95 gecikme bütçesi ve güncelleme sıklığı. Önce sıkıştırmasız tam tarama kurun — hem Recall ölçümünün referansı odur hem de bütçeyi karşılıyorsa yaklaşık aramaya hiç geçmeniz gerekmez. Karşılamıyorsa: sık güncellenen koleksiyonlarda graf tabanlı HNSW, bellek sınırının belirleyici olduğu büyük ve durağan koleksiyonlarda bölütleme tabanlı IVF ve nicemlenmiş varyantları. Bellek hesabı vektör sayısı çarpı boyut çarpı sayı tipi baytıyla başlar (float32 için 4) ve üstüne dizin yapısının payı eklenir.
ÖNKOŞULLAR
- Üretilmiş bir gömme kümesi ve gömme modelinin belgelenmiş boyutu ile uzaklık metriği
- Gerçek kullanıcı sorgularından örneklenmiş, dondurulabilir bir sorgu kümesi
- Uçtan uca cevap süresi bütçesinden geri sayılarak çıkarılmış bir arama gecikmesi hedefi
- Dizini yeniden üretip takma adla değiştirebileceğiniz bir çalışma ortamı
GEREKEN ARAÇLAR
- Yaklaşık ve tam arama birlikte destekleyen bir vektör dizini
- Gecikme dağılımını p95 ve p99 ile raporlayan bir yük üreteci
- Referans komşu kümesini üretecek tam tarama betiği
- Bellek ve disk kullanımını ölçen bir izleme katmanı
- Ayar denemelerinin sonucunu saklayan bir deney kaydı
- 01
Bütçeyi ve doğruluk hedefini rakamla yaz
Kararın üç girdisini yazıya dök: p95 gecikme bütçesi, kabul edilebilir Recall@k düşüşü ve eşzamanlı sorgu yükü. Üçü yazılmadan hiçbir dizin karşılaştırılamaz.
Yaklaşık arama bir ödünleşmedir: doğruluktan feragat ederek gecikme ve bellek kazanırsınız. Hedef yazılmadığında ödünleşmenin hangi tarafında durduğunuzu bilemezsiniz ve karşılaştırma bir tercih tartışmasına döner. Gecikme hedefi tahmin edilmez, uçtan uca cevap bütçesinden geri sayılarak çıkarılır: arama, yeniden sıralama ve üretim adımlarının toplamı kullanıcıya verdiğiniz sözü aşmamalı.
Girdi Nasıl belirlenir Neyi etkiler p95 gecikme bütçesi Uçtan uca cevap bütçesinden geri sayarak Sorgu zamanı parametrelerinin üst sınırı Recall@k hedefi Ürün kalitesi testinden; hangi düşüş fark ediliyor Dizin ailesi ve sıkıştırma kararı Eşzamanlı sorgu yükü Gerçek trafik kayıtlarının tepe saatinden Kopya sayısı ve toplam bellek Filtre seçiciliği dağılımı Sorgu kayıtlarındaki filtrelerin analizinden Filtreleme stratejisi ve yedek yol Vektör sayısı büyüme eğrisi İçerik planı ve kaynak sayısından Parçalama ve donanım planı Bu beş satır doldurulmadan yapılan dizin seçimi, ölçüme değil alışkanlığa dayanır. - 02
Tam tarama ile taban çizgisi kur
Önce sıkıştırmasız tam tarama kur: gerçek en yakın komşuları verir ve Recall ölçümünün referansı olur; bütçeyi zaten karşılıyorsa yaklaşık dizine hiç geçme.
Tam tarama her sorgu vektörünü koleksiyondaki her vektörle karşılaştırır; sonuç tanım gereği doğrudur. Bu iki işe yarar. Birincisi, referans kümeniz olur: yaklaşık dizinin Recall değeri ancak bu sonuca göre hesaplanabilir, mutlak bir isabet oranı diye bir şey yoktur. İkincisi, koleksiyon küçükse ya da sorgu hacmi düşükse tam tarama bütçeyi karşılayabilir ve kurulmayan bir yaklaşık dizin, ayarlanması gerekmeyen bir dizindir.
- 01Gerçek sorgu kayıtlarından temsilî bir küme örnekleyin; sentetik sorgular filtre ve uzunluk dağılımını taklit edemez.
- 02Her sorgu için tam taramayla ilk k komşuyu hesaplayın ve sonucu dondurun.
- 03Referans kümeyi gömme modeli sürümüyle birlikte saklayın; model değişirse referans da geçersizdir.
- 04Aynı kümeyi her ayar denemesinde kullanın; küme değişirse karşılaştırma değil, yeni bir ölçüm yapmış olursunuz.
Taban çizgisini kurarken tam taramanın kendi p95 gecikmesini de ölçün. Eşiğin altındaysa karar verilmiştir ve rehberin geri kalanı sizin için erken bir iyileştirmedir. Hangi koleksiyon boyutunda bunun olacağını genel bir kuralla söylemek mümkün değil; vektör boyutuna, donanıma ve eşzamanlılığa bağlıdır, bu yüzden tahmin etmek yerine ölçün.
- 03
Boyut, metrik ve sayı tipini birlikte seç
Uzaklık metriği gömme modelinin eğitildiği metrikle aynı olmalı; boyutu ancak model kısaltmayı destekliyorsa kes, sayı tipini bellek hesabına bakarak belirle.
Üç karar birbirine bağlıdır, bu yüzden ayrı ayrı verilmez. Metrik model tarafından belirlenir: kosinüsle eğitilmiş bir modelde vektörler birim uzunluğa normalize edilmemişse Öklid uzaklığı da iç çarpım da farklı bir sıralama üretir, çünkü ikisi de vektör boyunu sıralamaya karıştırır. Normalize ettiğinizde üçü aynı sıralamayı verir; birim vektörlerde Öklid uzaklığının karesi kosinüsün azalan bir dönüşümüdür. Yani normalizasyon depolamayı değil yalnızca hesabı sadeleştirir. Boyut ise modelin kendi çıktısıdır: kısaltılabilir boyut için özel olarak eğitilmiş modeller dışında, vektörün sonunu kesmek geometriyi bozar.
Sayı tipi Boyut başına bayt Karşılığında ne verirsiniz float32 4 Referans; bir şey vermezsiniz float16 2 Düşük hassasiyet; çoğu geri getirmede fark edilmez ama ölçülmeden varsayılmaz int8 (skaler nicemleme) 1 Kesinlik; ilk sıralardaki ayrım için yeniden puanlama gerekir İkili (binary) 0,125 Sıralama kalitesi; yalnızca kaba eleme katmanı olarak kullanılır Bayt değerleri tanım gereği sabittir; isabet kaybı ise koleksiyona özgüdür ve kendi referans kümenizde ölçülür. - 04
Bellek hesabını dizin yapısıyla birlikte çıkar
Bellek bütçesi vektör baytıyla başlar ama orada bitmez: graf bağlantıları, kimlik eşlemesi, üst veri ve kopya sayısı da aynı hesaba yazılmalı.
Ham vektör baytı basit bir çarpımdır: vektör sayısı çarpı boyut çarpı sayı tipi baytı. Kurulumların şaşırdığı yer bu değil, üstüne binenler. Graf tabanlı bir dizinde her düğüm komşu kimliklerini saklar; bölütleme tabanlı bir dizinde küme merkezleri ve ters listeler yer kaplar. Buna kimlik eşlemesi, filtrelenebilir üst veri ve kopyalar eklenir. İnşa sırasında geçici bir tepe de oluşur: eski ve yeni dizin bir süre yan yana durur.
python # VARSAYIM: 1.000.000 vektör, 768 boyut, float32, graf derecesi M = 16. # Gerçek sayılar kendi koleksiyonunuzdan gelir; bu satırlar yalnızca hesabın biçimini gösterir. sayi, boyut, tip_bayt, m = 1_000_000, 768, 4, 16 ham_vektor = sayi * boyut * tip_bayt # vektörlerin kendisi graf = sayi * (2 * m) * 4 # taban katman komşuları, komşu başına 4 baytlık kimlik print((ham_vektor + graf) / 1024 ** 3, 'GiB')Bellek kalemi Nasıl hesaplanır Atlandığında ne olur Ham vektörler Sayı çarpı boyut çarpı tip baytı Hesabın tamamı yanlış çıkar Graf bağlantıları Düğüm başına komşu sayısı çarpı kimlik baytı Graf dizinlerde en büyük ikinci kalem gözden kaçar Küme yapısı ve ters listeler Küme sayısı ve kimlik listeleri Bölütleme tabanlı dizinde eksik tahmin Üst veri ve kimlik eşlemesi Belge başına filtrelenebilir alanlar Filtreli sorgular beklenmedik yere bellek yer Kopyalar Tek kopya maliyeti çarpı kopya sayısı Yük dağıtımı planlanamaz İnşa tepesi Eski ve yeni dizin aynı anda Yeniden dizinleme günü ortam dolar - 05
Dizin ailesini güncelleme desenine göre seç
Graf tabanlı dizinler ekleme ve güncelleme ağırlıklı yüklerde, bölütleme tabanlı ve nicemlenmiş dizinler bellek sınırının belirleyici olduğu büyük ve görece durağan koleksiyonlarda tercih edilir.
Ölçüt Tam tarama HNSW (graf) IVF ve nicemlenmiş varyantları Doğruluk Tam; referans budur Ayarlanabilir, sorgu zamanı genişletilir Ayarlanabilir; sıkıştırma varsa tavan düşer Bellek Yalnızca vektörler Vektörler artı graf bağlantıları Vektörler (sıkıştırılabilir) artı küme yapısı Ekleme deseni Anında, yapı yok Artımlı eklemeye uygun Eğitim sonrası dağılım kayarsa bozulur Eğitim adımı Yok Yok Var; temsilî örnek üzerinde kümeleme Ayar yükü Yok Derece, inşa genişliği, sorgu genişliği Küme sayısı, taranan küme sayısı, sıkıştırma Aile kararı aslında iki sorudur: graf mı bölütleme mi, ve sıkıştırma var mı yok mu. Bölütleme tabanlı dizinler bir eğitim adımı ister: temsilî bir örneklem üzerinde küme merkezleri çıkarılır ve vektörler bu merkezlere göre dağıtılır. Eğitimden sonra koleksiyonun içeriği belirgin biçimde değişirse — yeni bir alan, yeni bir dil, yeni bir belge türü eklendiğinde — kümeler dengesini kaybeder ve aynı taranan küme sayısıyla isabet düşer. Bu, periyodik yeniden eğitim gerektiren bir bakım kalemidir ve plana yazılmalıdır.
Pratikte seçenekler saf hâlleriyle değil melez olarak karşınıza çıkar: graf dizininin nicemlenmiş sürümü, bölütleme artı çarpım nicemlemesi, diske taşan varyantlar. Karşılaştırmayı ürün adları üzerinden değil bu iki eksen üzerinden yapın; aynı motorun iki yapılandırması arasındaki fark, iki farklı motor arasındaki farktan büyük olabilir.
- 06
Parametreleri derleme ve sorgu zamanı diye ayır
Sorgu zamanı parametreleri canlıda ayarlanır; derleme zamanı parametreleri değiştiğinde dizin baştan üretilir. Bu ayrım aslında bakım planınızın kendisidir.
Parametreleri tek bir liste olarak görmek, ayar turlarının çoğunun neden yeniden dizinlemeyle bittiğini açıklar. Oysa iki küme var: biri sorgu sırasında okunur ve dağıtım gerektirmeden değiştirilebilir, diğeri dizinin yapısını belirler ve değiştiğinde yapı geçersizdir. Ayarlamaya her zaman birinci kümeden başlanır; ikinciye ancak birinci küme hedefi tutturamıyorsa dokunulur.
Parametre Ne zaman etkili Artırınca ne olur Değiştirmek için Graf derecesi (M) Derleme Bellek ve inşa süresi artar, isabet tavanı yükselir Dizini yeniden üretmek gerekir İnşa genişliği (efConstruction) Derleme Graf kalitesi artar, inşa uzar, sorgu etkilenmez Dizini yeniden üretmek gerekir Sorgu genişliği (ef) Sorgu İsabet ve gecikme birlikte artar Anında, dağıtım gerekmez Küme sayısı (nlist) Derleme ve eğitim Küme başına vektör azalır, eğitim uzar Yeniden eğitim ve yeniden dizinleme Taranan küme (nprobe) Sorgu İsabet ve gecikme birlikte artar Anında, dağıtım gerekmez Ayar yöntemi tek bir döngüdür: referans kümeyi sabitleyin, yalnızca sorgu zamanı parametresini süpürün, her değer için isabet ile p95 gecikmeyi birlikte kaydedin ve eğrinin dirseğini seçin. Dirsek hedefin altındaysa derleme parametrelerine geçin. Tek bir sayı raporlamayın: isabet olmadan gecikme, gecikme olmadan isabet bir sonuç değildir.
- 07
Filtreli sorguyu ayrı ölç
Filtreli sorgular ayrı bir yük profilidir: dar filtrelerde yaklaşık arama yeterli aday bulamaz, bu yüzden seçicilik eşiğine göre tam taramaya düşen bir yedek yol kurulur.
Filtreyi aramadan sonra uygulamak iki sorun üretir. Birincisi sonuç sayısı erir: ilk k aday zaten getirilmiştir ve filtre bunların çoğunu eledikten sonra geriye k'dan az belge kalır. İkincisi, filtre çok seçiciyse graf gezinmesi filtreye uyan bölgeye hiç uğramadan sonlanabilir; sonuç boş döner ama sistem hata vermez. Filtre, aramanın sonrası değil parçası olmalıdır.
Filtre seçiciliği Yaklaşık aramanın davranışı Doğru strateji Geniş: belgelerin çoğu geçiyor Normal çalışır, aday havuzu dolu Filtreyi sorgunun parçası olarak gömün Orta Aday havuzu erir, isabet sessizce düşer Sorgu genişliğini yükseltin, dönen sonuç sayısını izleyin Dar: çok az belge geçiyor Gezinme boşa gider, sonuç boş dönebilir Filtrelenmiş alt kümede tam tarama yapın Eşiğin nerede olduğu koleksiyona özgüdür; kendi filtre dağılımınızda ölçerek bulunur. Doğrulama adımı: sorguları filtre seçiciliğine göre kovalara ayırın ve her kova için ayrı isabet, p95 gecikme ve eksik sonuç oranı raporlayın. Ortalamaya bakan bir panoda dar filtre kovasının çöküşü görünmez, çünkü trafiğin küçük bir kısmıdır — ama genellikle en değerli sorgular oradadır.
- 08
Yeniden dizinleme ve silme planını yaz
Silmeler çoğu dizinde mezar taşıdır, bellek sıkıştırma çalışana kadar geri gelmez; yeniden dizinleme için takma adla yürüyen iki dizinli bir geçiş planı hazırla.
Yeniden dizinlemeyi zorunlu kılan değişiklikler bellidir ve hepsi de seçim anında verilmiş kararlardır: gömme modelinin değişmesi, boyutun değişmesi, uzaklık metriğinin değişmesi, derleme zamanı parametrelerinin değişmesi ve büyük ölçekli silmeler. Bu listeyi baştan yazmak, model seçiminin gerçek maliyetini görünür kılar: taşınma maliyeti, ilk kurulum maliyetinden yüksektir.
- 1Yeni dizini yanda üret
Canlı dizine dokunmadan, aynı kaynaktan ikinci bir dizin inşa edin ve inşa süresini kaydedin; bu süre bakım penceresinin kendisidir.
- 2Referans kümeyle karşılaştır
Dondurulmuş sorgu kümesini iki dizinde de koşturun; isabet ve p95 gecikmeyi yan yana raporlayın.
- 3Takma adı çevir
Uygulama dizine adıyla değil takma adla bağlanmalı; geçiş tek bir takma ad güncellemesiyle yapılır ve geri alınabilir.
- 4Eski dizini bir süre tut
Geri dönüş yolu kapanmadan eski dizini silmeyin; silme kararı, yeni dizinin canlı trafikte bir bakım döngüsü tamamlamasından sonra verilir.
Silme davranışını da bu planın parçası yapın. Çoğu dizinde silinen vektör hemen kaldırılmaz, işaretlenir: arama sonuçlarından çıkar ama belleği ve graf bağlantılarını işgal etmeye devam eder. Sıkıştırma ya da yeniden inşa çalışana kadar bellek geri gelmez; yüksek devirli koleksiyonlarda bu, planlanmadığında sürpriz bir büyüme olarak görünür.
SIK DÜŞÜLEN TUZAKLAR
İsabeti referanssız raporlamak
Tam taramayla üretilmiş gerçek komşu kümesi yoksa Recall diye bir sayı hesaplanamaz. Referanssız raporlanan isabet oranı, dizinin kendi sonucunu kendine göre ölçmesidir ve hiçbir şey ifade etmez.
Ortalama gecikmeye bakmak
Yaklaşık aramanın gecikmesi uzun kuyrukludur; filtreli ve zor sorgular kuyruğa yığılır. Ortalama iyi görünürken p95 bütçeyi aşabilir ve kullanıcı tam olarak o sorgularda bekler.
Nicemlemeyi yeniden puanlamasız açmak
Sıkıştırılmış vektörler kaba elemede iyi, ilk sıraların ayrımında zayıftır. Aday kümesini tam hassasiyetli vektörlerle yeniden puanlamadan sıralama yapmak, isabeti ilk üç sonuçta kaybettirir — yani en görünür yerde.
Silinen vektörün belleği geri verdiğini varsaymak
Silme çoğu dizinde işaretlemedir. Vektör sonuçlardan çıkar ama bellekte ve graf bağlantılarında kalmaya devam eder; sıkıştırma çalışmadan kapasite planı tutmaz.
Derleme parametresini ayar turunda değiştirmek
Graf derecesi ya da küme sayısı değiştiğinde dizin geçersizdir ve tur yeniden inşayla biter. Önce yalnızca sorgu zamanı parametrelerini süpürün; çoğu hedef orada tutturulur.
KONTROL LİSTESİ
- p95 gecikme bütçesi, Recall@k hedefi ve eşzamanlı sorgu yükü yazılı
- Tam taramayla üretilmiş referans komşu kümesi dondurulmuş ve gömme modeli sürümüyle saklanıyor
- Uzaklık metriği gömme modelinin eğitildiği metrikle aynı
- Bellek hesabı vektörleri, dizin yapısını, üst veriyi, kopyaları ve inşa tepesini içeriyor
- Sorgu zamanı ve derleme zamanı parametreleri ayrı belgelenmiş
- Her ayar denemesinde isabet ve p95 gecikme birlikte raporlanıyor
- Filtre seçiciliği kovalarına göre ayrı ölçüm var ve dar filtrede tam taramaya düşen yol kurulu
- Yeniden dizinleme süresi ölçüldü ve takma adlı geçiş en az bir kez denendi
Maddelerin tamamı işaretlenmeden kurulum üretime alınmamalı.
Sık sorulan sorular
HNSW mi IVF mi seçmeliyim?
Güncelleme desenine ve bellek sınırına bakın. Koleksiyon sık ekleme ve güncelleme alıyorsa graf tabanlı HNSW daha az bakım ister; eğitim adımı yoktur ve artımlı eklemeye uygundur. Bellek belirleyici kısıtsa ve koleksiyon büyük ama görece durağansa, bölütleme tabanlı IVF ve nicemlenmiş varyantları aynı donanıma çok daha fazla vektör sığdırır — karşılığında bir eğitim adımı ve periyodik yeniden eğitim yükü gelir. Filtreli sorgular bu kararı tek başına vermez: dar filtrede her iki aile de yeterli aday bulamaz, ikisinde de filtrelenmiş alt kümede tam taramaya düşen bir yedek yol kurulur.
Vektör dizini ne kadar bellek tüketir?
Hesap vektör sayısı çarpı boyut çarpı sayı tipi baytıyla başlar; float32 için bu dört bayttır, float16 için iki, skaler nicemlemede bir. Üstüne dizin yapısı biner: graf tabanlı dizinde düğüm başına komşu kimlikleri, bölütleme tabanlı dizinde küme merkezleri ve ters listeler. Sonra üst veri, kimlik eşlemesi, kopya sayısı ve yeniden inşa sırasındaki geçici tepe eklenir.
Gömme boyutunu kısaltabilir miyim?
Yalnızca model bunu destekliyorsa. Bazı gömme modelleri, vektörün ilk n boyutunun tek başına kullanılabilir olması için özel olarak eğitilir ve dokümantasyonlarında hangi boyutların geçerli olduğunu belirtirler. Model bunu söylemiyorsa vektörün sonunu kesmek geometriyi bozar ve kayıp yalnızca zor sorgularda görünür; bellek kazanmanın güvenli yolu boyutu değil sayı tipini küçültmektir.
Yeniden dizinleme ne zaman zorunlu olur?
Gömme modeli değiştiğinde, vektör boyutu değiştiğinde, uzaklık metriği değiştiğinde, derleme zamanı parametreleri değiştiğinde ve büyük ölçekli silmelerden sonra. Sorgu zamanı parametreleri bunların dışındadır; canlıda değiştirilebilir. Bu ayrımı baştan yazmak, ayar turlarının yeniden inşayla bitmesini engeller.
Kaynaklar
- 01Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs — Yu. A. Malkov, D. A. Yashunin — arXiv · Makale
- 02Product Quantization for Nearest Neighbor Search — H. Jégou, M. Douze, C. Schmid — IEEE TPAMI · Makale
- 03Vektör veritabanı ve dizin motoru dokümantasyonları — Altyapı sağlayıcıları · Dokümantasyon
BUILD
Bu rehberi kurumunuzda uygulayalım mı?
Aynı mimariyi kendi verinizle kurmak için discovery oturumundan üretime kadar birlikte ilerliyoruz.
