Filter dalam kueri vektor

Anda dapat mengatur mode filter vektor pada kueri vektor untuk menentukan apakah Anda ingin memfilter sebelum atau sesudah eksekusi kueri.

Filter menentukan cakupan kueri vektor. Filter diatur dan diulang melalui string nonvektor dan bidang numerik yang dikaitkan seperti filterable dalam indeks, tetapi tujuan filter menentukan apa yang dijalankan kueri vektor: seluruh ruang yang dapat dicari, atau konten hasil pencarian.

Artikel ini menjelaskan setiap mode filter dan memberikan panduan tentang kapan harus menggunakan masing-masing mode filter.

Mode prafilter

Prafilter menerapkan filter sebelum eksekusi kueri, mengurangi area permukaan pencarian tempat algoritma pencarian vektor mencari konten serupa. Dalam kueri vektor, preFilter adalah default.

Diagram of prefilters.

Mode postfilter

Pasca-pemfilteran menerapkan filter setelah eksekusi kueri, mempersempit hasil pencarian.

Diagram of post-filters.

Pengujian tolok ukur mode filter vektor

Untuk memahami kondisi di mana satu mode filter berkinerja lebih baik daripada yang lain, kami menjalankan serangkaian pengujian untuk mengevaluasi hasil kueri melalui indeks kecil, sedang, dan besar.

  • Kecil (100.000 dokumen, indeks 2,5 GB, 1536 dimensi)
  • Sedang (1 juta dokumen, indeks 25 GB, dimensi 1536)
  • Besar (1 miliar dokumen, indeks 1,9 TB, 96 dimensi)

Untuk beban kerja kecil dan menengah, kami menggunakan layanan Standar 2 (S2) dengan satu partisi dan satu replika. Untuk beban kerja besar, kami menggunakan layanan Standard 3 (S3) dengan 12 partisi dan satu replika.

Indeks memiliki konstruksi yang identik: satu bidang kunci, satu bidang vektor, satu bidang teks, dan satu bidang numerik yang dapat difilter. Indeks berikut didefinisikan menggunakan sintaks pratinjau 2023-07-01.

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"}}
            ]
        }
    }

Dalam kueri, kami menggunakan filter yang identik untuk operasi prafilter dan pascafilter. Kami menggunakan filter sederhana untuk memastikan bahwa variasi performa disebabkan oleh mode pemfilteran, dan bukan kompleksitas filter.

Hasil diukur dalam Kueri Per Detik (QPS).

Poin-poin penting

  • Prafilter hampir selalu lebih lambat daripada postfiltering, kecuali pada indeks kecil di mana performanya kira-kira sama.

  • Pada himpunan data yang lebih besar, prafilter adalah urutan besarnya lebih lambat.

  • Jadi mengapa prafilter default jika hampir selalu lebih lambat? Prafilter menjamin bahwa k hasil dikembalikan jika ada dalam indeks, di mana bias mendukung pengenalan dan presisi atas kecepatan.

  • Postfiltering adalah untuk pelanggan yang:

    • kecepatan nilai atas pilihan (postfiltering dapat mengembalikan kurang dari k hasil)
    • gunakan filter yang tidak terlalu selektif
    • memiliki indeks dengan ukuran yang memadai sehingga performa prafilter tidak dapat diterima

Detail

  • Mengingat himpunan data dengan 100.000 vektor pada dimensi 1536:

    • Saat memfilter lebih dari 30% himpunan data, prafilter dan postfilter sebanding.
    • Saat memfilter kurang dari 0,1% himpunan data, prafilter sekitar 50% lebih lambat daripada postfilter.
  • Mengingat himpunan data dengan 1 juta vektor pada 1536 dimensi:

    • Saat memfilter lebih dari 30% himpunan data, prafilter sekitar 30% lebih lambat.
    • Saat memfilter kurang dari 2% himpunan data, prafilter sekitar tujuh kali lebih lambat.
  • Mengingat himpunan data dengan 1 miliar vektor pada 96 dimensi:

    • Saat memfilter lebih dari 5% himpunan data, prafilter sekitar 50% lebih lambat.
    • Saat memfilter kurang dari 10% himpunan data, prafilter sekitar tujuh kali lebih lambat.

Grafik berikut menunjukkan QPS relatif prafilter, dihitung sebagai QPS prafilter dibagi dengan QPS postfilter.

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

Sumbu vertikal adalah QPS prafilter atas QPS postfiltering. Misalnya, nilai 0,0 berarti prafilter 100% lebih lambat, 0,5 pada sumbu vertikal berarti prafilter 50% lebih lambat, 1,0 berarti prafilter dan pemfilteran pasca setara.

Sumbu horizontal mewakili laju pemfilteran, atau persentase dokumen kandidat setelah menerapkan filter. Misalnya, 1.00% berarti bahwa satu persen dari korpus pencarian dipilih oleh kriteria filter.