Aracılığıyla paylaş


Azure AI Search'te vektör sorgusuna filtre ekleme

Sorgularınıza ekleme veya dışlama ölçütleri eklemek için filtre ifadesi içeren bir vektör sorgu isteği tanımlayabilirsiniz. Bu makalede şunların nasıl yapıldığını öğrenin:

Bu makalede çizim için REST kullanılır. Diğer dillerdeki kod örnekleri için vektör sorguları içeren uçtan uca çözümler için azure-search-vector-samples GitHub deposuna bakın.

Vektör içeriğini sorgulamak için Azure portalında Arama Gezgini'ni de kullanabilirsiniz. JSON görünümünü kullanıyorsanız filtreler ekleyebilir ve filtre modunu belirtebilirsiniz.

Vektör sorgusunda filtreleme nasıl çalışır?

Filtreler, filtre ölçütlerine filterable göre arama belgelerini dahil etmek veya dışlamak için bir dize alanı veya sayısal olan nonvector alanlarına uygulanır. Bir vektör alanı kendi kendine filtrelenemese de, aynı dizindeki diğer alanlara, vektör alanları da içeren belgeler dahil veya hariç olmak üzere filtreler uygulanabilir.

Filtreler, parametreye vectorFilterMode göre sorgu yürütmeden önce veya sonra uygulanır.

Filtre tanımlama

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.

Metin veya sayısal değerler içeren kaynak alanlarınız yoksa, meta veri filtresinde yararlı olabilecek LastModified veya CreatedBy özellikleri gibi belge meta verilerini denetleyin.

2024-07-01 , bu API'nin kararlı sürümüdür. Şu şekildedir:

  • vectorFilterMode ön filtre (varsayılan) veya filtre sonrası filtreleme modları için.
  • filter ölçütleri sağlar.

Aşağıdaki örnekte vektör, şu sorgu dizesinin bir gösterimidir: "Hangi Azure hizmetleri tam metin aramayı destekler". Sorgu alanı hedefler contentVector . Gerçek vektörde 1536 ekleme vardır, bu nedenle okunabilirlik için bu örnekte kırpılır.

Filtre ölçütleri, arama altyapısı vektör sorgusunu yürütmeden önce filtrelenebilir bir metin alanına (category bu örnekte) uygulanır.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

vectorFilterMode'yi ayarlama

vectorFilterMode sorgu parametresi, filtrenin vektör sorgusu yürütmeden önce mi yoksa sonra mı uygulanacağını belirler.

Filtre öncesi modunu kullanma

Ö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.

Ön filtrelerin diyagramı.

Postfilter modunu kullanma

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

Son filtrelerin diyagramı.

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-11-03 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,
              "vectorSearchProfile": "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": {
        "algorithms": [
            {
              "name": "defaulthnsw",
              "kind": "hnsw",
              "hnswParameters": { "metric": "euclidean" }
            }
          ],
          "profiles": [
            {
              "name": "defaulthnsw",
              "algorithm": "defaulthnsw"
            }
        ]
      }
    }

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.

Göreli QPS için küçük, orta ve büyük dizinler için QPS performansını gösteren grafik.

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.