Bagikan melalui


Membuat kueri vektor di Azure AI Search

Di Pencarian Azure AI, jika Anda memiliki indeks vektor, 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.

Anda juga dapat menggunakan Search Explorer di portal Azure.

Prasyarat

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 .

Pendekatan kedua menggunakan vektorisasi terintegrasi, sekarang tersedia secara umum, agar Azure AI Search menangani input dan output vektorisasi kueri Anda.

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.

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.

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

  • vectorQueries adalah konstruksi untuk pencarian vektor.
  • vectorQueries.kind atur ke vector untuk array vektor, atau atur ke text jika input adalah string dan Anda memiliki vektorizer.
  • vectorQueries.vector adalah kueri (representasi vektor teks atau gambar).
  • vectorQueries.weight (opsional) menentukan bobot relatif setiap kueri vektor yang disertakan dalam operasi pencarian (lihat Pembobotan vektor).
  • 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=2024-07-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",
            "weight": 0.5,
            "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.

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=2024-07-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 myImageVector myTextVector, 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

Bagian ini memperlihatkan kueri vektor yang memanggil vektorisasi terintegrasi yang mengonversi kueri teks atau gambar menjadi vektor. Kami merekomendasikan paket REST API 2024-07-01 yang stabil, Search Explorer, atau Azure SDK yang lebih baru untuk fitur ini.

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.

Search Explorer mendukung vektorisasi terintegrasi pada waktu kueri. Jika indeks Anda berisi bidang vektor dan memiliki vektorizer, Anda dapat menggunakan konversi teks ke vektor bawaan.

  1. Masuk ke portal Azure dengan akun Azure Anda, dan buka layanan Pencarian Azure AI Anda.

  2. Dari menu sebelah kiri, perluas Indeks manajemen>pencarian, dan pilih indeks Anda. Penjelajah Pencarian adalah tab pertama di halaman indeks.

  3. Periksa Profil vektor untuk mengonfirmasi bahwa Anda memiliki vektorizer.

    Cuplikan layar pengaturan vektorizer dalam indeks pencarian.

  4. Di Penjelajah Pencarian, Anda bisa memasukkan string teks ke bilah pencarian default dalam tampilan kueri. Vektorizer bawaan mengonversi string Anda menjadi vektor, melakukan pencarian, dan mengembalikan hasil.

    Atau, Anda dapat memilih Tampilkan>tampilan JSON untuk menampilkan atau mengubah kueri. Jika vektor ada, Search Explorer menyiapkan kueri vektor secara otomatis. Anda dapat menggunakan tampilan JSON untuk memilih bidang yang digunakan dalam pencarian dan dalam respons, menambahkan filter, atau membuat kueri yang lebih canggih seperti hibrid. Contoh JSON disediakan di tab REST API di bagian ini.

Jumlah 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).

Pembobotan vektor

weight Tambahkan parameter kueri untuk menentukan bobot relatif setiap kueri vektor yang disertakan dalam operasi pencarian. Nilai ini digunakan saat menggabungkan hasil beberapa daftar peringkat yang dihasilkan oleh dua kueri vektor atau lebih dalam permintaan yang sama, atau dari bagian vektor kueri hibrid.

Defaultnya adalah 1,0 dan nilainya harus berupa angka positif yang lebih besar dari nol.

Bobot digunakan saat menghitung skor fusi peringkat timbal balik dari setiap dokumen. Perhitungan adalah pengali weight nilai terhadap skor peringkat dokumen dalam tataan hasil masing-masing.

Contoh berikut adalah kueri hibrid dengan dua string kueri vektor dan satu string teks. Bobot ditetapkan ke kueri vektor. Kueri pertama adalah 0,5 atau setengah berat, mengurangi kepentingannya dalam permintaan. Kueri vektor kedua dua kali lebih penting.

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_first_vector_field", 
          "k": 10, 
          "weight": 0.5 
        },
        { 
          "kind": "vector", 
          "vector": [4.0, 5.0, 6.0], 
          "fields": "my_second_vector_field", 
          "k": 10, 
          "weight": 2.0
        } 
      ], 
      "search": "hello world" 
    } 

Pembobotan vektor hanya berlaku untuk vektor. Kueri teks dalam contoh ini ("halo dunia") memiliki berat implisit 1,0 atau berat netral. Namun, dalam kueri hibrid, Anda dapat menambah atau mengurangi pentingnya bidang teks dengan mengatur maxTextRecallSize.

Atur ambang batas untuk mengecualikan hasil penilaian rendah (pratinjau)

Karena pencarian tetangga terdekat selalu mengembalikan tetangga yang diminta, dimungkinkan k untuk mendapatkan beberapa kecocokan penilaian rendah sebagai bagian dari memenuhi k persyaratan angka pada hasil pencarian. Untuk mengecualikan hasil pencarian penilaian rendah, Anda dapat menambahkan threshold parameter kueri yang memfilter hasil berdasarkan skor minimum. Pemfilteran terjadi sebelum menggabungkan hasil dari set pengenalan yang berbeda.

Parameter ini masih dalam pratinjau. Sebaiknya pratinjau REST API versi 2024-05-01-preview.

Dalam contoh ini, semua kecocokan yang memiliki skor di bawah 0,8 dikecualikan dari hasil pencarian vektor, bahkan jika jumlah hasilnya berada di bawah .k

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-preview 
    Content-Type: application/json 
    api-key: [admin key] 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my-cosine-field", 
          "threshold": { 
            "kind": "vectorSimilarity", 
            "value": 0.8 
          } 
        }
      ]
    }

MaxTextSizeRecall untuk pencarian hibrid (pratinjau)

Kueri vektor sering digunakan dalam konstruksi hibrid yang menyertakan bidang nonvektor. Jika Anda menemukan bahwa hasil berperingkat BM25 lebih atau kurang diwakili dalam hasil kueri hibrid, Anda dapat mengatur maxTextRecallSize untuk menambah atau mengurangi hasil berperingkat BM25 yang disediakan untuk peringkat hibrid.

Anda hanya dapat mengatur properti ini dalam permintaan hibrid yang menyertakan komponen "pencarian" dan "vectorQueries".

Parameter ini masih dalam pratinjau. Sebaiknya pratinjau REST API versi 2024-05-01-preview.

Untuk informasi selengkapnya, lihat Mengatur maxTextRecallSize - Membuat kueri hibrid.

Langkah berikutnya

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