Membuat kueri vektor di Azure AI Search

Di Pencarian Azure AI, jika Anda memiliki bidang vektor dalam indeks pencarian, artikel ini menjelaskan 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.

Prasyarat

Tip

Untuk menentukan dengan cepat apakah indeks Anda memiliki vektor, cari bidang jenis Collection(Edm.Single), dengan dimensions atribut, dan vectorSearchProfile penugasan.

Mengonversi input string kueri menjadi vektor

Untuk mengkueri bidang vektor, kueri itu sendiri harus menjadi vektor. Salah satu pendekatan untuk mengonversi string kueri teks pengguna menjadi representasi vektornya adalah memanggil pustaka penyematan atau API dalam kode aplikasi Anda. Sebagai praktik terbaik, selalu gunakan model penyematan yang sama yang digunakan untuk menghasilkan penyematan dalam dokumen sumber.

Anda dapat menemukan sampel kode yang menunjukkan cara membuat penyematan di repositori azure-search-vector-samples .

Berikut adalah contoh REST API dari string kueri yang dikirimkan ke penyebaran model penyematan Azure OpenAI:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

Respons yang diharapkan adalah 202 untuk panggilan yang berhasil ke model yang disebarkan. Bidang "penyematan" di isi respons adalah representasi vektor dari string kueri "input". Untuk tujuan pengujian, Anda akan menyalin nilai array "penyematan" ke dalam "vectorQueries.vector" dalam permintaan kueri, menggunakan sintaks yang ditunjukkan di beberapa bagian berikutnya.

Respons aktual untuk panggilan POST ini ke model yang disebarkan mencakup penyematan 1536, dipangkas di sini hanya untuk beberapa vektor pertama untuk keterbacaan.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

Dalam pendekatan ini, kode aplikasi Anda bertanggung jawab untuk terhubung ke model, menghasilkan penyematan, dan menangani respons.

Tip

Coba Kueri dengan vektorisasi terintegrasi, saat ini dalam pratinjau publik, agar Azure AI Search menangani input dan output vektorisasi kueri Anda.

Permintaan kueri vektor

Bagian ini memperlihatkan struktur dasar kueri vektor. Anda dapat menggunakan portal Azure, REST API, atau Azure SDK untuk merumuskan kueri vektor. Jika Anda bermigrasi dari Pratinjau 2023-07-01, ada perubahan yang melanggar. Lihat Meningkatkan ke REST API terbaru untuk detailnya.

2023-11-01 adalah versi REST API yang stabil untuk Search POST. Versi ini mendukung:

  • vectorQueries adalah konstruksi untuk pencarian vektor.
  • kind atur untuk vector menentukan bahwa kueri adalah array vektor.
  • vector adalah kueri (representasi vektor teks atau gambar).
  • exhaustive (opsional) memanggil KNN lengkap pada waktu kueri, bahkan jika bidang diindeks untuk HNSW.

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

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Respons kueri vektor

Di Azure AI Search, respons kueri terdiri dari semua retrievable bidang secara default. Namun, umum untuk membatasi hasil pencarian ke subset retrievable bidang dengan mencantumkannya dalam select pernyataan.

Dalam kueri vektor, pertimbangkan dengan cermat apakah Anda perlu mem-vektor bidang dalam respons. Bidang vektor tidak dapat dibaca manusia, jadi jika Anda mendorong respons ke halaman web, Anda harus memilih bidang nonvektor yang mewakili hasilnya. Misalnya, jika kueri dijalankan terhadap contentVector, Anda dapat kembali content sebagai gantinya.

Jika Anda menginginkan bidang vektor dalam hasilnya, berikut adalah contoh struktur respons. contentVector adalah array string penyematan, dipangkas di sini untuk kemudahan. Skor pencarian menunjukkan relevansi. Bidang nonvektor lainnya disertakan untuk konteks.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Poin utama:

  • k menentukan berapa banyak hasil tetangga terdekat yang dikembalikan, dalam hal ini, tiga. Kueri vektor selalu mengembalikan k hasil, dengan asumsi setidaknya k dokumen ada, bahkan jika ada dokumen dengan kesamaan k yang buruk, karena algoritma menemukan tetangga terdekat dengan vektor kueri.

  • @search.score ditentukan oleh algoritma pencarian vektor.

  • Bidang dalam hasil pencarian adalah semua retrievable bidang, atau bidang dalam select klausa. Selama eksekusi kueri vektor, kecocokan dibuat pada data vektor saja. Namun, respons dapat menyertakan bidang apa pun retrievable dalam indeks. Karena tidak ada fasilitas untuk mendekode hasil bidang vektor, penyertaan bidang teks nonvektor sangat membantu untuk nilai yang dapat dibaca manusia.

Kueri vektor dengan filter

Permintaan kueri dapat menyertakan kueri vektor dan ekspresi filter. Filter berlaku untuk filterable bidang teks dan numerik, dan berguna untuk menyertakan atau mengecualikan dokumen pencarian berdasarkan kriteria filter. Meskipun bidang vektor tidak dapat difilter sendiri, kueri dapat menentukan filter pada bidang lain dalam indeks yang sama.

Dalam versi API yang lebih baru, Anda dapat mengatur mode filter untuk menerapkan filter sebelum atau sesudah eksekusi kueri vektor. Untuk perbandingan setiap mode dan performa yang diharapkan berdasarkan ukuran indeks, lihat Filter dalam kueri vektor.

Tip

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.

2023-11-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=2023-11-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
        }
    ]
}

Beberapa bidang vektor

Anda dapat mengatur properti "vectorQueries.fields" ke beberapa bidang vektor. Kueri vektor dijalankan terhadap setiap bidang vektor yang Anda sediakan fields dalam daftar. Saat mengkueri beberapa bidang vektor, pastikan masing-masing berisi penyematan dari model penyematan yang sama, dan bahwa kueri juga dihasilkan dari model penyematan yang sama.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Beberapa kueri vektor

Pencarian vektor multi-kueri mengirimkan beberapa kueri di beberapa bidang vektor dalam indeks pencarian Anda. Contoh umum permintaan kueri ini adalah saat menggunakan model seperti CLIP untuk pencarian vektor multimodal di mana model yang sama dapat mem-vektorisasi konten gambar dan teks.

Contoh kueri berikut mencari kesamaan dalam dan myImageVectormyTextVector, tetapi masing-masing mengirim dua penyematan kueri yang berbeda, masing-masing dijalankan secara paralel. Kueri ini menghasilkan hasil yang dinilai menggunakan Reciprocal Rank Fusion (RRF).

  • vectorQueries menyediakan array kueri vektor.
  • vector berisi vektor gambar dan vektor teks dalam indeks pencarian. Setiap instans adalah kueri terpisah.
  • fields menentukan bidang vektor mana yang akan ditargetkan.
  • k adalah jumlah kecocokan tetangga terdekat untuk disertakan dalam hasil.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Hasil pencarian akan mencakup kombinasi teks dan gambar, dengan asumsi indeks pencarian Anda menyertakan bidang untuk file gambar (indeks pencarian tidak menyimpan gambar).

Kueri dengan vektorisasi terintegrasi (pratinjau)

Bagian ini memperlihatkan kueri vektor yang memanggil fitur pratinjau vektorisasi terintegrasi baru yang mengonversi kueri teks menjadi vektor. Gunakan REST API Pratinjau 2023-10-01 atau paket Azure SDK beta yang diperbarui.

Prasyarat adalah indeks pencarian yang memiliki vektorizer yang dikonfigurasi dan ditetapkan ke bidang vektor. Vektorizer menyediakan informasi koneksi ke model penyematan yang digunakan pada waktu kueri.

Kueri menyediakan string teks alih-alih vektor:

  • kind harus diatur ke text .
  • text harus memiliki string teks. Ini diteruskan ke vektorizer yang ditetapkan ke bidang vektor.
  • fields adalah bidang vektor untuk dicari.

Berikut adalah contoh sederhana kueri yang di-vektorisasi pada waktu kueri. String teks divektorisasi lalu digunakan untuk mengkueri bidang descriptionVector.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
{
    "select": "title, genre, description",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector",
            "k": 5
        }
    ]
}

Berikut adalah kueri hibrid menggunakan vektorisasi kueri teks terintegrasi. Kueri ini mencakup beberapa bidang vektor kueri, beberapa bidang nonvektor, filter, dan peringkat semantik. Sekali lagi, perbedaannya adalah kind kueri vektor dan text string alih-alih vector.

Dalam contoh ini, mesin pencari melakukan tiga panggilan vektorisasi ke vektorizer yang ditetapkan ke descriptionVector, synopsisVector, dan authorBioVector dalam indeks. Vektor yang dihasilkan digunakan untuk mengambil dokumen terhadap bidang masing-masing. Mesin pencari juga menjalankan pencarian kata kunci pada search kueri, "novel misteri yang diatur di London".

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "search":"mystery novel set in London", 
    "searchFields":"description, synopsis", 
    "semanticConfiguration":"my-semantic-config", 
    "queryType":"semantic",
    "select": "title, author, synopsis",
    "filter": "genre eq 'mystery'",
    "vectorFilterMode": "postFilter",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector, synopsisVector",
            "k": 5
        },
        {
            "kind": "text"
            "text": "living english author",
            "fields": "authorBioVector",
            "k": 5
        }
    ]
}

Hasil yang dinilai dari keempat kueri menyatu menggunakan peringkat RRF. Peringkat semantik sekunder dipanggil melalui hasil pencarian yang menyatu, tetapi pada satu-satunyasearchFields, meningkatkan hasil yang paling semantik selaras dengan "search":"mystery novel set in London".

Catatan

Vektorizer digunakan selama pengindeksan dan kueri. Jika Anda tidak memerlukan pemotongan dan vektorisasi data dalam indeks, Anda dapat melewati langkah-langkah seperti membuat pengindeks, set keterampilan, dan sumber data. Dalam skenario ini, vektorizer hanya digunakan pada waktu kueri untuk mengonversi string teks menjadi penyematan.

Kuantitas hasil berpangkat dalam respons kueri vektor

Kueri vektor menentukan k parameter, yang menentukan berapa banyak kecocokan yang dikembalikan dalam hasil. Mesin pencari selalu mengembalikan k jumlah kecocokan. Jika k lebih besar dari jumlah dokumen dalam indeks, maka jumlah dokumen menentukan batas atas apa yang dapat dikembalikan.

Jika Anda terbiasa dengan pencarian teks lengkap, Anda tahu untuk mengharapkan hasil nol jika indeks tidak berisi istilah atau frasa. Namun, dalam pencarian vektor, operasi pencarian mengidentifikasi tetangga terdekat, dan akan selalu mengembalikan k hasil bahkan jika tetangga terdekat tidak sejenis itu. Jadi, dimungkinkan untuk mendapatkan hasil untuk kueri nonsensik atau di luar topik, terutama jika Anda tidak menggunakan perintah untuk mengatur batasan. Hasil yang kurang relevan memiliki skor kesamaan yang lebih buruk, tetapi masih vektor "terdekat" jika tidak ada yang lebih dekat. Dengan demikian, respons tanpa hasil yang bermakna masih dapat mengembalikan k hasil, tetapi skor kesamaan setiap hasil akan rendah.

Pendekatan hibrid yang menyertakan pencarian teks lengkap dapat mengurangi masalah ini. Mitigasi lain adalah mengatur ambang minimum pada skor pencarian, tetapi hanya jika kueri adalah kueri vektor tunggal murni. Kueri hibrid tidak kondusif untuk ambang minimum karena rentang RRF jauh lebih kecil dan volatil.

Parameter kueri yang memengaruhi jumlah hasil meliputi:

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

Algoritma peringkat yang digunakan dalam kueri vektor

Peringkat hasil dihitung dengan:

  • Metrik kesamaan
  • Reciprocal Rank Fusion (RRF) jika ada beberapa set hasil pencarian.

Metrik kesamaan

Metrik kesamaan yang ditentukan di bagian indeks vectorSearch untuk kueri khusus vektor. Nilai yang valid adalah cosine, euclidean, dan dotProduct.

Model penyematan Azure OpenAI menggunakan kesamaan kosinus, jadi jika Anda menggunakan model penyematan Azure OpenAI, cosine adalah metrik yang direkomendasikan. Metrik peringkat lain yang didukung termasuk euclidean dan dotProduct.

Menggunakan RRF

Beberapa set dibuat jika kueri menargetkan beberapa bidang vektor, menjalankan beberapa kueri vektor secara paralel, atau jika kueri adalah hibrida pencarian vektor dan teks lengkap, dengan atau tanpa peringkat semantik.

Selama eksekusi kueri, kueri vektor hanya dapat menargetkan satu indeks vektor internal. Jadi untuk beberapa bidang vektor dan beberapa kueri vektor, mesin pencari menghasilkan beberapa kueri yang menargetkan indeks vektor masing-masing dari setiap bidang. Output adalah sekumpulan hasil berperingkat untuk setiap kueri, yang menyatu menggunakan RRF. Untuk informasi selengkapnya, lihat Penilaian relevansi menggunakan Reciprocal Rank Fusion (RRF).

Langkah berikutnya

Sebagai langkah berikutnya, tinjau contoh kode kueri vektor di Python, C# atau JavaScript.