Bagikan melalui


Menambahkan filter dalam kueri vektor di Azure AI Search

Anda dapat menentukan permintaan kueri vektor yang menyertakan ekspresi filter untuk menambahkan kriteria penyertaan atau pengecualian ke kueri Anda. Dalam artikel ini, pelajari cara:

Artikel ini menggunakan REST untuk ilustrasi. Untuk sampel kode dalam bahasa lain, lihat repositori GitHub azure-search-vector-samples untuk solusi end-to-end yang menyertakan kueri vektor.

Anda juga bisa menggunakan Search Explorer di portal Azure untuk mengkueri konten vektor. Jika Anda menggunakan tampilan JSON, Anda dapat menambahkan filter dan menentukan mode filter.

Cara kerja pemfilteran dalam kueri vektor

Filter berlaku untuk filterable bidang nonvektor, baik bidang string atau numerik, untuk menyertakan atau mengecualikan dokumen pencarian berdasarkan kriteria filter. Meskipun bidang vektor tidak dapat difilter sendiri, filter dapat diterapkan ke bidang lain dalam indeks yang sama, termasuk atau mengecualikan dokumen yang juga berisi bidang vektor.

Filter diterapkan sebelum atau sesudah eksekusi kueri berdasarkan vectorFilterMode parameter .

Menentukan filter

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.

Jika Anda tidak memiliki bidang sumber dengan teks atau nilai numerik, periksa metadata dokumen, seperti properti LastModified atau CreatedBy, yang mungkin berguna dalam filter metadata.

2024-07-01 adalah versi stabil untuk API ini. Ini memiliki:

Dalam contoh berikut, vektor adalah representasi dari string kueri ini: "layanan Azure apa yang mendukung pencarian teks lengkap". Kueri menargetkan contentVector bidang . Vektor aktual memiliki 1536 penyematan, sehingga dipangkas dalam contoh ini untuk keterbacaan.

Kriteria filter diterapkan ke bidang teks yang dapat difilter (category dalam contoh ini) sebelum mesin pencari menjalankan kueri vektor.

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

Mengatur vectorFilterMode

Parameter kueri vectorFilterMode menentukan apakah filter diterapkan sebelum atau sesudah eksekusi kueri vektor.

Gunakan 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 prafilter.

Menggunakan mode postfilter

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

Diagram pascafilter.

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 2023-11-03.

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

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.

Bagan memperlihatkan performa QPS untuk indeks kecil, sedang, dan besar untuk QPS relatif.

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.