Membuat kueri hibrid di Azure AI Search

Pencarian hibrid menggabungkan satu atau beberapa kueri kata kunci dengan satu atau beberapa kueri vektor dalam satu permintaan pencarian. Kueri dijalankan secara paralel. Hasilnya digabungkan dan diurutkan ulang oleh skor pencarian baru, menggunakan Reciprocal Rank Fusion (RRF) untuk mengembalikan satu set hasil berperingkat.

Dalam kebanyakan kasus, per pengujian tolok ukur, kueri hibrid dengan peringkat semantik mengembalikan hasil yang paling relevan.

Untuk menentukan kueri hibrid, gunakan REST API 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Search Explorer di portal Azure, atau versi Azure SDK yang lebih baru.

Prasyarat

Menjalankan kueri hibrid di Search Explorer

  1. Di Search Explorer, pastikan versi API adalah pratinjau 2023-10-01 atau yang lebih baru.

  2. Di bawah Tampilan, pilih tampilan JSON.

  3. Ganti templat kueri default dengan kueri hibrid, seperti yang dimulai pada baris 539 untuk contoh mulai cepat vektor. Untuk brevity, vektor dipotong dalam artikel ini.

    Kueri hibrid memiliki kueri teks yang ditentukan dalam search, dan kueri vektori yang ditentukan di bawah vectorQueries.vector.

    Kueri teks dan kueri vektor harus setara atau setidaknya tidak bertentangan. Jika kueri berbeda, Anda tidak mendapatkan manfaat hibrid.

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. Pilih Telusuri.

Permintaan kueri hibrid (REST API)

Kueri hibrid menggabungkan pencarian teks dan pencarian vektor, di mana search parameter mengambil string kueri dan vectorQueries.vector mengambil kueri vektor. Mesin pencari menjalankan kueri teks lengkap dan vektor secara paralel. Penyatuan semua kecocokan dievaluasi untuk relevansi menggunakan Reciprocal Rank Fusion (RRF) dan satu set hasil dikembalikan dalam respons.

Hasil dikembalikan dalam teks biasa, termasuk vektor dalam bidang yang ditandai sebagai retrievable. Karena vektor numerik tidak berguna dalam hasil pencarian, pilih bidang lain dalam indeks sebagai proksi untuk kecocokan vektor. Misalnya, jika indeks memiliki bidang "descriptionVector" dan "descriptionText", kueri dapat cocok pada "descriptionVector" tetapi hasil pencarian dapat menampilkan "descriptionText". select Gunakan parameter untuk menentukan hanya bidang yang dapat dibaca manusia dalam hasilnya.

Contoh berikut menunjukkan konfigurasi kueri hibrid.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [{
        "vector": [
            -0.009154141,
            0.018708462,
            . . . 
            -0.02178128,
            -0.00086512347
        ],
        "fields": "DescriptionVector",
        "kind": "vector",
        "exhaustive": true,
        "k": 10
    }],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": "10"
}

Poin utama:

  • String kueri vektor ditentukan melalui vectorQueries.vector properti . Kueri dijalankan terhadap bidang "DescriptionVector". Atur kind ke "vektor" untuk menunjukkan jenis kueri. Secara opsional, atur exhaustive ke true untuk mengkueri konten lengkap bidang vektor.

  • Pencarian kata kunci ditentukan melalui search properti. Ini dijalankan secara paralel dengan kueri vektor.

  • k menentukan berapa banyak kecocokan tetangga terdekat yang dikembalikan dari kueri vektor dan diberikan kepada peringkat RRF.

  • top menentukan berapa banyak kecocokan yang dikembalikan dalam all-up respons. Dalam contoh ini, respons mencakup 10 hasil, dengan asumsi setidaknya ada 10 kecocokan dalam hasil gabungan.

Pencarian hibrid dengan filter

Contoh ini menambahkan filter, yang diterapkan ke filterable bidang nonvektor indeks pencarian.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

Poin utama:

  • Filter diterapkan ke konten bidang yang dapat difilter. Dalam contoh ini, bidang ParkingIncluded adalah boolean dan ditandai sebagai filterable dalam skema indeks.

  • Dalam kueri hibrid, filter dapat diterapkan sebelum eksekusi kueri untuk mengurangi permukaan kueri, atau setelah eksekusi kueri untuk memangkas hasil. "preFilter" adalah defaultnya. Untuk menggunakan postFilter, atur mode pemrosesan filter seperti yang ditunjukkan dalam contoh ini.

  • Saat Anda memfilter hasil kueri, jumlah hasil mungkin kurang dari top-n.

Dengan asumsi Bahwa Anda mengaktifkan peringkat semantik dan definisi indeks Anda menyertakan konfigurasi semantik, Anda dapat merumuskan kueri yang menyertakan pencarian vektor dan pencarian kata kunci, dengan peringkat semantik di atas kumpulan hasil gabungan. Secara opsional, Anda dapat menambahkan keterangan dan jawaban.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

Poin utama:

  • Peringkat semantik menerima hingga 50 hasil dari respons gabungan. Atur "k" dan "atas" ke 50 untuk representasi yang sama dari kedua kueri.

  • "queryType" dan "semanticConfiguration" diperlukan.

  • "keterangan" dan "jawaban" bersifat opsional. Nilai diekstrak dari teks verbatim dalam hasil. Jawaban hanya dikembalikan jika hasilnya menyertakan konten yang memiliki karakteristik jawaban atas kueri.

Pencarian hibrid semantik dengan filter

Berikut adalah kueri terakhir dalam koleksi. Ini adalah kueri hibrid semantik yang sama dengan contoh sebelumnya, tetapi dengan filter.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

Poin utama:

  • Mode filter dapat memengaruhi jumlah hasil yang tersedia untuk reranker semantik. Sebagai praktik terbaik, cerdas untuk memberi peringkat semantik jumlah maksimum dokumen (50). Jika prafilter atau postfilter terlalu selektif, Anda mungkin mendasari peringkat semantik dengan memberikan kurang dari 50 dokumen untuk dikerjakan.

  • Prafilter diterapkan sebelum eksekusi kueri. Jika prafilter mengurangi area pencarian menjadi 100 dokumen, kueri vektor dijalankan melalui bidang "DescriptionVector" untuk 100 dokumen tersebut, mengembalikan kecocokan terbaik k=50. 50 dokumen yang cocok tersebut kemudian diteruskan ke RRF untuk hasil gabungan, lalu ke ranker semantik.

  • Postfilter diterapkan setelah eksekusi kueri. Jika k=50 mengembalikan 50 kecocokan di sisi kueri vektor, maka pasca filter diterapkan ke 50 kecocokan, mengurangi hasil yang memenuhi kriteria filter, meninggalkan Anda dengan kurang dari 50 dokumen untuk diteruskan ke peringkat semantik

Mengonfigurasi respons kueri

Saat Anda menyiapkan kueri hibrid, pikirkan tentang struktur respons. Responsnya adalah set baris yang diratakan. Parameter pada kueri menentukan bidang mana yang ada di setiap baris dan berapa banyak baris dalam respons. Mesin pencari memberi peringkat pada dokumen yang cocok dan mengembalikan hasil yang paling relevan.

Bidang dalam respons

Hasil pencarian terdiri dari retrievable bidang dari indeks pencarian Anda. Hasilnya adalah:

  • Semua retrievable bidang (default REST API).
  • Bidang secara eksplisit tercantum dalam parameter "pilih" pada kueri.

Contoh dalam artikel ini menggunakan pernyataan "pilih" untuk menentukan bidang teks (nonvector) dalam respons.

Catatan

Vektor tidak direkayasa balik menjadi teks yang dapat dibaca manusia, jadi hindari mengembalikannya dalam respons. Sebagai gantinya, pilih bidang nonvektor yang mewakili dokumen pencarian. Misalnya, jika kueri menargetkan bidang "DescriptionVector", kembalikan bidang teks yang setara jika Anda memilikinya ("Deskripsi") dalam respons.

Jumlah hasil

Kueri mungkin cocok dengan sejumlah dokumen, sebanyak semuanya jika kriteria pencarian lemah (misalnya "search=*" untuk kueri null). Karena jarang praktis untuk mengembalikan hasil yang tidak terikat, Anda harus menentukan maksimum untuk respons:

  • "k": n hasil untuk kueri khusus vektor
  • "top": n hasil untuk kueri hibrid yang menyertakan parameter "pencarian"

"k" dan "atas" bersifat opsional. Tidak ditentukan, jumlah default hasil dalam respons adalah 50. Anda dapat mengatur "atas" dan "lewati" ke halaman melalui lebih banyak hasil atau mengubah default.

Jika Anda menggunakan peringkat semantik, ini adalah praktik terbaik untuk mengatur "k" dan "top" menjadi setidaknya 50. Ranker semantik dapat mengambil hingga 50 hasil. Dengan menentukan 50 untuk setiap kueri, Anda mendapatkan representasi yang sama dari kedua subsistem pencarian.

Peringkat teratas

Beberapa set dibuat untuk kueri hibrid, dengan atau tanpa reranking semantik opsional. Peringkat hasil dihitung oleh Reciprocal Rank Fusion (RRF).

Di bagian ini, bandingkan respons antara pencarian vektor tunggal dan pencarian hibrid sederhana untuk hasil teratas. Algoritma peringkat yang berbeda, metrik kesamaan HNSW dan RRF adalah kasus ini, menghasilkan skor yang memiliki besaran yang berbeda. Perilaku ini secara desain. Skor RRF dapat muncul cukup rendah, bahkan dengan kecocokan kesamaan tinggi. Skor yang lebih rendah adalah karakteristik algoritma RRF. Dalam kueri hibrid dengan RRF, lebih banyak timbal balik dokumen berperingkat disertakan dalam hasil, mengingat skor dokumen berperingkat RRF yang relatif lebih kecil, dibandingkan dengan pencarian vektor murni.

Pencarian Vektor Tunggal: @search.score untuk hasil yang diurutkan oleh kesamaan kosinus (fungsi jarak kesamaan vektor default).

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Pencarian Hibrid: @search.score untuk hasil hibrid yang diberi peringkat menggunakan Fusion Peringkat Timbal Balik.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Langkah berikutnya

Sebagai langkah selanjutnya, sebaiknya tinjau kode demo untuk Python, C# atau JavaScript.