Membuat kueri hibrid di Azure AI Search
Pencarian hibrid menggabungkan kueri teks (kata kunci) dan vektor dalam satu permintaan pencarian. Semua subkueri dalam permintaan 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.
Dalam artikel ini, pelajari cara:
- Menyiapkan permintaan dasar
- Merumuskan kueri hibrid dengan lebih banyak parameter dan filter
- Meningkatkan relevansi menggunakan peringkat semantik atau bobot vektor
- Mengoptimalkan perilaku kueri dengan mengontrol input teks dan vektor
Catatan
Baru dalam pratinjau 2024-09-01 adalah kemampuan untuk menargetkan filter hanya ke subkueri vektor dalam permintaan hibrid. Ini memberi Anda lebih banyak presisi tentang bagaimana filter diterapkan. Untuk informasi selengkapnya, lihat menargetkan filter ke subkueri vektor di artikel ini.
Prasyarat
Indeks pencarian yang berisi
searchable
bidang vektor dan nonvektor. Kami merekomendasikan wizard Impor dan vektorisasi data untuk membuat indeks dengan cepat. Jika tidak, lihat Membuat indeks dan Menambahkan bidang vektor ke indeks pencarian.(Opsional) Jika Anda menginginkan peringkat semantik, layanan pencarian Anda harus tingkat Dasar atau lebih tinggi, dengan peringkat semantik diaktifkan.
(Opsional) Jika Anda ingin konversi teks ke vektor bawaan dari string kueri, buat dan tetapkan vektorizer ke bidang vektor dalam indeks pencarian.
Pilih API atau alat
Search Explorer di portal Azure (mendukung sintaks pencarian API yang stabil dan pratinjau) memiliki tampilan JSON yang memungkinkan Anda menempelkan permintaan hibrid.
Versi stabil 2024-07-01 atau versi API pratinjau terbaru jika Anda menggunakan fitur pratinjau seperti maxTextRecallSize dan countAndFacetMode(pratinjau).
Untuk keterbacaan, kami menggunakan contoh REST untuk menjelaskan cara kerja API. Anda dapat menggunakan klien REST seperti Visual Studio Code dengan ekstensi REST untuk membangun kueri hibrid. Untuk informasi selengkapnya, lihat Mulai Cepat: Pencarian vektor menggunakan REST API.
Paket stabil atau beta yang lebih baru dari Azure SDK (lihat mengubah log untuk dukungan fitur SDK).
Menyiapkan kueri hibrid di Search Explorer
Di Search Explorer, pastikan versi API adalah 2024-07-01 atau versi API pratinjau yang lebih baru.
Di bawah Tampilan, pilih tampilan JSON sehingga Anda bisa menempelkan dalam kueri vektor.
Ganti templat kueri default dengan kueri hibrid, seperti contoh "Jalankan kueri hibrid" yang dimulai pada baris 539 di mulai cepat vektor. Untuk brevity, vektor dipotong dalam artikel ini.
Kueri hibrid memiliki kueri teks yang ditentukan dalam
search
, dan kueri vektor yang ditentukan di bawahvectorQueries.vector
.Kueri teks dan kueri vektor bisa setara atau berbeda, tetapi umum bagi mereka untuk berbagi niat yang sama.
{ "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 } ] }
Pilih Cari.
Tip
Hasil pencarian lebih mudah dibaca jika Anda menyembunyikan vektor. Di Opsi Kueri, aktifkan Sembunyikan nilai vektor di hasil pencarian.
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=2024-07-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". Aturkind
ke "vektor" untuk menunjukkan jenis kueri. Secara opsional, aturexhaustive
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=2024-07-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 menggunakanpostFilter
, atur mode pemrosesan filter seperti yang ditunjukkan dalam contoh ini.Saat Anda memfilter hasil kueri, jumlah hasil mungkin kurang dari top-n.
Pencarian hibrid dengan filter yang menargetkan subkueri vektor (pratinjau)
Dengan menggunakan pratinjau 2024-09-01, Anda dapat mengambil alih filter global pada permintaan pencarian dengan menerapkan filter sekunder yang hanya menargetkan subkueri vektor dalam permintaan hibrid.
Fitur ini memberikan kontrol terperinci dengan memastikan bahwa filter hanya memengaruhi hasil pencarian vektor, sehingga hasil pencarian berbasis kata kunci tidak terpengaruh.
Filter yang ditargetkan sepenuhnya mengambil alih filter global, termasuk filter apa pun yang digunakan untuk pemangkasan keamanan atau pencarian geospasial. Dalam kasus di mana filter global diperlukan, seperti pemangkasan keamanan, Anda harus secara eksplisit menyertakan filter ini di filter tingkat atas dan di setiap filter tingkat vektor untuk memastikan keamanan dan batasan lainnya diberlakukan secara konsisten.
Untuk menerapkan filter vektor yang ditargetkan:
Gunakan pratinjau terbaru Cari Dokumen REST API atau paket beta Azure SDK yang menyediakan fitur .
Ubah permintaan kueri, menambahkan parameter baru
vectorQueries.filterOverride
yang diatur ke ekspresi filter OData.
Berikut adalah contoh kueri hibrid yang menambahkan penimpaan filter. Filter global "Peringkat gt 3" diganti pada waktu proses oleh filterOvrride.
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview
{
"vectorQueries": [
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"exhaustive": true,
"filterOverride": "Address/City eq 'Seattle'",
"k": 10
}
],
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelName, Description, Address/City, Rating",
"filter": "Rating gt 3"
"debug": "vector",
"top": 10
}
Pencarian hibrid semantik
Dengan asumsi Bahwa Anda mengaktifkan pemeringkat 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.
Setiap kali Anda menggunakan peringkat semantik dengan vektor, pastikan k
diatur ke 50. Ranker semantik menggunakan hingga 50 kecocokan sebagai input. Menentukan kurang dari 50 mengurangi model peringkat semantik dari input yang diperlukan.
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}}
{
"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=2024-07-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, diikuti dengan pasca-filter yang diterapkan ke 50 kecocokan, hasil Anda dikurangi dengan jumlah dokumen yang memenuhi kriteria filter. Ini membuat Anda memiliki kurang dari 50 dokumen untuk diteruskan ke ranker semantik. Ingatlah hal ini jika Anda menggunakan peringkat semantik. Peringkat semantik berfungsi paling baik jika memiliki 50 dokumen sebagai input.
Mengatur maxTextRecallSize dan countAndFacetMode
Catatan
Fitur ini masih dalam pratinjau umum. Pratinjau ini disediakan tanpa perjanjian tingkat layanan, dan tidak disarankan untuk beban kerja produksi. Fitur tertentu mungkin tidak didukung atau mungkin memiliki kemampuan terbatas. Untuk mengetahui informasi selengkapnya, lihat Ketentuan Penggunaan Tambahan untuk Pratinjau Microsoft Azure.
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.
Sebaiknya pratinjau REST API versi 2024-05-01-preview.
Tip
Pilihan lain yang perlu dipertimbangkan adalah teknik tambahan atau penggantian, adalah pembobotan vektor, yang meningkatkan pentingnya kueri vektor dalam permintaan.
Gunakan Pencarian - POST atau Pencarian - GET di pratinjau 2024-05-01 untuk menentukan parameter ini.
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" kemaxTextRecallSize
.
Kurangi
maxTextRecallSize
jika pencarian kesamaan vektor umumnya mengungguli sisi teks kueri hibrid.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 mengaturtop
,skip
, dannext
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 ranker semantik di 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 pemeringkat 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": "Swirling Currents 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": "Swirling Currents 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.