Vektör sorgularındaki filtreler

Sorgu yürütmeden önce veya sonra filtreleme yapmak isteyip istemediğinizi belirtmek için vektör sorgusunda vektör filtresi modları ayarlayabilirsiniz.

Filtreler vektör sorgusunun kapsamını belirler. Filtreler dizinde olduğu gibifilterable, seçici olmayan dize ve sayısal alanlar üzerinde ayarlanır ve yinelenir, ancak bir filtrenin amacı vektör sorgusunun ne üzerinde yürütüleceğini belirler: aranabilir alanın tamamı veya arama sonucunun içeriği.

Bu makalede her filtre modu açıklanır ve her birinin ne zaman kullanılacağına ilişkin yönergeler sağlanır.

Filtre öncesi modu

Ön filtreleme, sorgu yürütmeden önce filtreleri uygulayarak vektör arama algoritmasının benzer içeriği arayacağı arama yüzeyi alanını azaltır. Vektör sorgusunda preFilter varsayılan değerdir.

Diagram of prefilters.

Filtre sonrası modu

Filtreleme sonrası, sorgu yürütmeden sonra filtreler uygulayarak arama sonuçlarını daraltıyor.

Diagram of post-filters.

Vektör filtresi modlarının karşılaştırma testi

Bir filtre modunun diğerinden daha iyi performans gösterme koşullarını anlamak için küçük, orta ve büyük dizinler üzerinden sorgu sonuçlarını değerlendirmek için bir dizi test çalıştırdık.

  • Küçük (100.000 belge, 2,5 GB dizin, 1536 boyut)
  • Orta (1 milyon belge, 25 GB dizin, 1536 boyut)
  • Büyük (1 milyar belge, 1,9 TB endeks, 96 boyut)

Küçük ve orta ölçekli iş yükleri için bir bölüm ve bir çoğaltma içeren bir Standart 2 (S2) hizmeti kullandık. Büyük iş yükü için 12 bölüm ve bir çoğaltma ile Standart 3 (S3) hizmeti kullandık.

Dizinler aynı yapıya sahipti: bir anahtar alanı, bir vektör alanı, bir metin alanı ve bir sayısal filtrelenebilir alan. Aşağıdaki dizin, 2023-07-01-preview söz dizimi kullanılarak tanımlanır.

def get_index_schema(self, index_name, dimensions):
    return {
        "name": index_name,
        "fields": [
            {"name": "id", "type": "Edm.String", "key": True, "searchable": True},
            {"name": "content_vector", "type": "Collection(Edm.Single)", "dimensions": dimensions,
              "searchable": True, "retrievable": True, "filterable": False, "facetable": False, "sortable": False,
              "vectorSearchConfiguration": "defaulthnsw"},
            {"name": "text", "type": "Edm.String", "searchable": True, "filterable": False, "retrievable": True,
              "sortable": False, "facetable": False},
            {"name": "score", "type": "Edm.Double", "searchable": False, "filterable": True,
              "retrievable": True, "sortable": True, "facetable": True}
        ],
        "vectorSearch":
        {
            "algorithmConfigurations": [
                {"name": "defaulthnsw", "kind": "hnsw", "hnswParameters": {"metric": "euclidean"}}
            ]
        }
    }

Sorgularda hem ön filtre hem de postfilter işlemleri için aynı filtreyi kullandık. Performanstaki değişimlerin filtre karmaşıklığı değil filtreleme modundan kaynaklanmasını sağlamak için basit bir filtre kullandık.

Sonuçlar SaniyeDeki Sorgu sayısı (QPS) ile ölçüldü.

Paketler

  • Performansın yaklaşık olarak eşit olduğu küçük dizinler dışında, ön filtreleme neredeyse her zaman postfiltering'den daha yavaştır.

  • Daha büyük veri kümelerinde ön filtreleme, daha yavaş büyük bir sipariştir.

  • Peki neredeyse her zaman daha yavaşsa ön filtre neden varsayılandır? Ön filtreleme, sapmanın k hız üzerinde geri çekmeyi ve duyarlığı tercih ettiği dizinde mevcutsa sonuçların döndürüldüğünü garanti eder.

  • Postfiltering, şunları yapan müşterilere yöneliktir:

    • seçim üzerindeki değer hızı (postfiltering sonuçlardan daha k az döndürebilir)
    • aşırı seçici olmayan filtreler kullanma
    • ön filtreleme performansının kabul edilemez olması için yeterli boyutta dizinlere sahip

Ayrıntılar

  • 1536 boyutta 100.000 vektöre sahip bir veri kümesi göz önünde bulundurulduğunda:

    • Veri kümesinin %30'undan fazlası filtrelendiğinde ön filtreleme ve son filtreleme karşılaştırılabilirdi.
    • Veri kümesinin %0,1'inden azını filtrelerken ön filtreleme, postfiltering'den yaklaşık %50 daha yavaştı.
  • 1536 boyutta 1 milyon vektöre sahip bir veri kümesi göz önünde bulundurulduğunda:

    • Veri kümesinin %30'undan fazlasını filtrelerken ön filtreleme yaklaşık %30 daha yavaştı.
    • Veri kümesinin %2'sinden azını filtrelerken, ön filtreleme yaklaşık yedi kat daha yavaştı.
  • 96 boyutta 1 milyar vektöre sahip bir veri kümesi göz önünde bulundurulduğunda:

    • Veri kümesinin %5'inden fazlasını filtrelerken ön filtreleme yaklaşık %50 daha yavaştı.
    • Veri kümesinin %10'undan azını filtrelerken, ön filtreleme yaklaşık yedi kat daha yavaştı.

Aşağıdaki grafikte, filtre öncesi QPS olarak hesaplanan ve filtre sonrası QPS'ye bölünen filtre öncesi göreli QPS gösterilmektedir.

Chart showing QPS performance for small, medium, and large indexes for relative QPS.

Dikey eksen, son filtrelemenin QPS'leri üzerinden ön filtrelemenin QPS'sıdır. Örneğin, 0,0 değeri ön filtrelemenin %100 daha yavaş, dikey eksende 0,5 olması ön filtrelemenin %50 daha yavaş olduğu, 1,0 ise ön filtreleme ve son filtrelemenin eşdeğer olduğu anlamına gelir.

Yatay eksen, filtre uygulandıktan sonra filtreleme oranını veya aday belgelerin yüzdesini temsil eder. Örneğin, 1.00% arama grubunun yüzde birinin filtre ölçütleri tarafından seçildiği anlamına gelir.