Bagikan melalui


Membuat kueri hibrid di Azure AI Search

Pencarian hibrid menggabungkan satu atau beberapa kueri teks (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 tataan hasil terpadu.

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

Untuk meningkatkan relevansi:

  • Parameter baru maxTextRecallSize dan countAndFacetMode(pratinjau) memberi Anda kontrol lebih besar atas input teks ke dalam kueri hibrid.

  • Pembobotan vektor baru memungkinkan Anda mengatur bobot relatif kueri vektor. Fitur ini sangat berguna dalam kueri kompleks di mana dua atau beberapa tataan hasil yang berbeda perlu digabungkan, seperti halnya untuk pencarian hibrid.

Prasyarat

Pilih API atau alat

  • Versi stabil 2023-11-01
  • Pratinjau 10-10-2023, menambahkan vektorisasi terintegrasi ke sisi vektor kueri hibrid
  • 2024-03-01-preview, menambahkan jenis data sempit dan kuantisasi skalar ke sisi vektor kueri hibrid
  • Pratinjau 2024-05-01 menambahkan maxTextRecallSize dan countAndFacetMode secara khusus untuk pencarian hibrid
  • Search Explorer di portal Azure (menargetkan perilaku pratinjau 2024-05-01)
  • Paket stabil atau beta yang lebih baru dari Azure SDK (lihat mengubah log untuk dukungan fitur SDK)

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
        },
        {
            "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.

  • "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.

Mengatur maxTextRecallSize dan countAndFacetMode (pratinjau)

Bagian ini menjelaskan cara menyesuaikan input ke kueri hibrid dengan mengontrol jumlah hasil berperingkat BM25 yang mengalir ke model peringkat hibrid. Mengontrol input berperingkat BM25 memberi Anda lebih banyak opsi untuk penyetelan relevansi dalam skenario hibrid.

Tip

Pilihan lain yang perlu dipertimbangkan adalah teknik tambahan atau penggantian, adalah pembobotan vektor, yang meningkatkan pentingnya kueri vektor dalam permintaan.

  1. Gunakan Pencarian - POST atau Pencarian - GET di pratinjau 2024-05-01 untuk menentukan parameter ini.

  2. hybridSearch Tambahkan objek parameter kueri untuk mengatur jumlah maksimum dokumen yang dipanggil kembali melalui hasil kueri hibrid berperingkat BM25. Ini memiliki dua properti:

    • maxTextRecallSize menentukan jumlah hasil berperingkat BM25 untuk diberikan kepada peringkat Reciprocal Rank Fusion (RRF) yang digunakan dalam kueri hibrid. Defaultnya adalah 1.000. Maksimumnya adalah 10.000.

    • countAndFacetMode melaporkan hitungan untuk hasil berpangkat BM25 (dan untuk faset jika Anda menggunakannya). Defaultnya adalah semua dokumen yang cocok dengan kueri. Secara opsional, Anda dapat mencakup "hitungan" ke maxTextRecallSize.

  3. Kurangi maxTextRecallSize jika pencarian kesamaan vektor umumnya mengungguli sisi teks kueri hibrid.

  4. Naikkan maxTextRecallSize jika Anda memiliki indeks besar, dan default tidak menangkap jumlah hasil yang memadai. Dengan kumpulan hasil berperingkat BM25 yang lebih besar, Anda juga dapat mengatur top, skip, dan next untuk mengambil bagian dari hasil tersebut.

Contoh REST berikut menunjukkan dua kasus penggunaan untuk pengaturan maxTextRecallSize.

Contoh pertama berkurang maxTextRecallSize menjadi 100, membatasi sisi teks kueri hibrid menjadi hanya 100 dokumen. Ini juga diatur countAndFacetMode untuk hanya menyertakan hasil tersebut dari maxTextRecallSize.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world", 
      "hybridSearch": { 
        "maxTextRecallSize": 100, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

Contoh kedua naik menjadi maxTextRecallSize 5.000. Ini juga menggunakan atas, lewati, dan di samping menarik hasil dari tataan hasil besar. Dalam hal ini, permintaan menarik hasil berperingkat BM25 mulai dari posisi 1.500 hingga 2.000 sebagai kontribusi kueri teks ke kumpulan hasil komposit RRF.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world",
      "top": 500,
      "skip": 1500,
      "next": 500,
      "hybridSearch": { 
        "maxTextRecallSize": 5000, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

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 terbatas, Anda harus menentukan maksimum untuk respons keseluruhan:

  • "top": n hasil untuk kueri khusus kata kunci (tanpa vektor)
  • "k": n hasil untuk kueri khusus vektor
  • "top": n hasil untuk kueri hibrid (dengan atau tanpa semantik) 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.

Catatan

Jika Anda menggunakan pencarian hibrid di API pratinjau 2024-05-01, Anda dapat mengontrol jumlah hasil dari kueri kata kunci menggunakan maxTextRecallSize. Gabungkan ini dengan pengaturan untuk "k" untuk mengontrol representasi dari setiap subsistem pencarian (kata kunci dan vektor).

Hasil pemeringkat semantik

Catatan

Ranker semantik dapat mengambil hingga 50 hasil.

Jika Anda menggunakan peringkat semantik dalam API pratinjau 2024-05-01, ini adalah praktik terbaik untuk mengatur "k" dan "maxTextRecallSize" untuk menjumlahkan setidaknya 50 total. Anda kemudian dapat membatasi hasil yang dikembalikan kepada pengguna dengan parameter "atas".

Jika Anda menggunakan peringkat semantik di API sebelumnya, lakukan hal berikut:

  • jika melakukan pencarian khusus kata kunci (tidak ada vektor) atur "atas" ke 50
  • jika melakukan pencarian hibrid, atur "k" ke 50, untuk memastikan bahwa ranker semantik mendapatkan setidaknya 50 hasil.

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.