Bagikan melalui


Membuat indeks vektor

Di Azure AI Search, penyimpanan vektor memiliki skema indeks yang menentukan bidang vektor dan nonvektor, konfigurasi vektor untuk algoritma yang membuat dan mengompresi ruang penyematan, dan pengaturan pada definisi bidang vektor yang digunakan dalam permintaan kueri.

API Buat atau Perbarui Indeks membuat penyimpanan vektor. Ikuti langkah-langkah berikut untuk mengindeks data vektor:

  • Menentukan skema dengan algoritma vektor dan pemadatan opsional
  • Menambahkan definisi bidang vektor
  • Muat data yang didahului sebagai langkah terpisah, atau gunakan vektorisasi terintegrasi untuk potongan dan pengodean data selama pengindeksan

Artikel ini menjelaskan alur kerja dan menggunakan REST untuk ilustrasi. Setelah Anda memahami alur kerja dasar, lanjutkan dengan sampel kode Azure SDK di repositori azure-search-vector-samples untuk panduan tentang menggunakan fitur ini dalam kode pengujian dan produksi.

Tip

Gunakan portal Azure untuk membuat indeks vektor dan mencoba pemotongan dan vektorisasi data terintegrasi.

Prasyarat

  • Pencarian Azure AI, di wilayah mana pun dan di tingkat mana pun. Sebagian besar layanan yang ada mendukung pencarian vektor. Untuk layanan yang dibuat sebelum Januari 2019, ada subset kecil yang tidak dapat membuat indeks vektor. Dalam situasi ini, layanan baru harus dibuat. Jika Anda menggunakan vektorisasi terintegrasi (set keterampilan yang memanggil Azure AI), Azure AI Search harus berada di wilayah yang sama dengan layanan Azure OpenAI atau Azure AI.

  • Penyematan vektor yang sudah ada sebelumnya atau menggunakan vektorisasi terintegrasi, di mana model penyematan dipanggil dari alur pengindeksan.

  • Anda harus mengetahui batas dimensi model yang digunakan untuk membuat penyematan. Nilai yang valid adalah 2 hingga 3072 dimensi. Di Azure OpenAI, untuk text-embedding-ada-002, panjang vektor numerik adalah 1536. Untuk text-embedding-3-small atau text-embedding-3-large, panjang vektor adalah 3072.

  • Anda juga harus mengetahui metrik kesamaan yang didukung. Untuk Azure OpenAI, kesamaan dihitung menggunakan cosine.

  • Anda harus terbiasa membuat indeks. Skema harus menyertakan bidang untuk kunci dokumen, bidang lain yang ingin Anda cari atau filter, dan konfigurasi lain untuk perilaku yang diperlukan selama pengindeksan dan kueri.

Menyiapkan dokumen untuk pengindeksan

Sebelum pengindeksan, kumpulkan payload dokumen yang mencakup bidang data vektor dan nonvektor. Struktur dokumen harus sesuai dengan skema indeks.

Pastikan dokumen Anda:

  1. Berikan bidang atau properti metadata yang secara unik mengidentifikasi setiap dokumen. Semua indeks pencarian memerlukan kunci dokumen. Untuk memenuhi persyaratan kunci dokumen, dokumen sumber harus memiliki satu bidang atau properti yang dapat mengidentifikasinya secara unik dalam indeks. Bidang sumber ini harus dipetakan ke bidang indeks tipe Edm.String dan key=true dalam indeks pencarian.

  2. Berikan data vektor (array angka titik mengambang presisi tunggal) di bidang sumber.

    Bidang vektor berisi array yang dihasilkan oleh penyematan model, satu penyematan per bidang, di mana bidang adalah bidang tingkat atas (bukan bagian dari jenis berlapis atau kompleks). Untuk integrasi paling sederhana, kami merekomendasikan model penyematan di Azure OpenAI, seperti text-embedding-ada-002 untuk dokumen teks atau IMAGE Retrieval REST API untuk gambar.

    Jika Anda dapat mengambil dependensi pada pengindeks dan set keterampilan, pertimbangkan untuk menggunakan vektorisasi terintegrasi yang mengodekan gambar dan konten alfanumerik selama pengindeksan. Definisi bidang Anda adalah untuk bidang vektor, tetapi data sumber dapat berupa teks atau gambar, dengan array vektor yang dibuat selama pengindeksan.

  3. Berikan bidang lain dengan konten alfanumerik yang dapat dibaca manusia untuk respons kueri, dan untuk skenario kueri hibrid yang menyertakan pencarian teks lengkap atau peringkat semantik dalam permintaan yang sama.

Indeks pencarian Anda harus menyertakan bidang dan konten untuk semua skenario kueri yang ingin Anda dukung. Misalkan Anda ingin mencari atau memfilter nama produk, versi, metadata, atau alamat. Dalam hal ini, pencarian kesamaan tidak terlalu membantu. Pencarian kata kunci, pencarian geografis, atau filter akan menjadi pilihan yang lebih baik. Indeks pencarian yang mencakup kumpulan bidang komprehensif data vektor dan nonvektor memberikan fleksibilitas maksimum untuk konstruksi kueri dan komposisi respons.

Contoh singkat payload dokumen yang menyertakan bidang vektor dan nonvektor ada di bagian data vektor beban artikel ini.

Menambahkan konfigurasi pencarian vektor

Konfigurasi vektor menentukan parameter yang digunakan selama pengindeksan untuk membuat informasi "tetangga terdekat" di antara simpul vektor:

  • Dunia Kecil yang Dapat Dinavigasi Hierarkis (HNSW)
  • KNN lengkap

Jika Anda memilih HNSW pada bidang, Anda dapat memilih KNN lengkap pada waktu kueri. Tetapi arah lain tidak berfungsi: jika Anda memilih lengkap, Anda tidak dapat nantinya meminta pencarian HNSW karena struktur data tambahan yang memungkinkan perkiraan pencarian tidak ada.

Konfigurasi vektor juga menentukan metode kuantisasi untuk mengurangi ukuran vektor:

  • Skalar
  • Biner (hanya tersedia di 2024-07-01 dan dalam paket Azure SDK yang lebih baru)

Untuk petunjuk tentang cara bermigrasi ke versi terbaru, lihat Meningkatkan REST API.

2024-07-01 umumnya tersedia. Ini mendukung konfigurasi vektor yang memiliki:

  • vectorSearch.algorithms mendukung HNSW dan KNN lengkap.
  • vectorSearch.compressions mendukung kuantisasi skalar dan biner, pengambilan sampel berlebih, dan reranking dengan vektor asli.
  • vectorSearch.profiles menyediakan beberapa kombinasi algoritma dan konfigurasi kompresi.

Pastikan untuk memiliki strategi untuk mem-vektorisasi konten Anda. Kami merekomendasikan vektorisasi terintegrasi dan vektorizer waktu kueri untuk pengodean bawaan.

  1. Gunakan API Buat atau Perbarui Indeks untuk membuat indeks.

  2. vectorSearch Tambahkan bagian dalam indeks yang menentukan algoritma pencarian yang digunakan untuk membuat ruang penyematan.

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

    Poin utama:

    • Nama untuk setiap konfigurasi kompresi, algoritma, dan profil harus unik untuk jenisnya dalam indeks.

    • vectorSearch.compressions.kind dapat berupa scalarQuantization atau binaryQuantization.

    • vectorSearch.compressions.rerankWithOriginalVectors menggunakan vektor asli yang tidak dikompresi untuk menghitung ulang kesamaan dan mererank hasil teratas yang dikembalikan oleh kueri pencarian awal. Vektor yang tidak dikompresi ada di indeks pencarian meskipun stored salah. Properti ini bersifat opsional. Default-nya adalah true.

    • vectorSearch.compressions.defaultOversampling mempertimbangkan serangkaian hasil potensial yang lebih luas untuk mengimbangi pengurangan informasi dari kuantisasi. Rumus untuk hasil potensial terdiri dari k dalam kueri, dengan pengali sampel berlebih. Misalnya, jika kueri menentukan k 5, dan oversampling adalah 20, maka kueri secara efektif meminta 100 dokumen untuk digunakan dalam reranking, menggunakan vektor asli yang tidak dikompresi untuk tujuan tersebut. Hanya hasil reranked teratas k yang dikembalikan. Properti ini bersifat opsional. Defaultnya adalah 4.

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType harus diatur ke int8. Ini adalah satu-satunya jenis data primitif yang didukung saat ini. Properti ini bersifat opsional. Defaultnya adalah int8.

    • vectorSearch.algorithms.kind"hnsw" adalah atau "exhaustiveKnn". Ini adalah algoritma Perkiraan Tetangga Terdekat (ANN) yang digunakan untuk mengatur konten vektor selama pengindeksan.

    • vectorSearch.algorithms.m adalah jumlah tautan dua arah. Defaultnya adalah 4. Rentangnya adalah 4 hingga 10. Nilai yang lebih rendah harus mengembalikan lebih sedikit kebisingan dalam hasil.

    • vectorSearch.algorithms.efConstruction adalah jumlah tetangga terdekat yang digunakan selama pengindeksan. Defaultnya adalah 400. Rentangnya adalah 100 hingga 1.000.

    • "vectorSearch.algorithms.fSearch adalah jumlah tetangga terdekat yang digunakan selama pencarian. Defaultnya adalah 500. Rentangnya adalah 100 hingga 1.000.

    • vectorSearch.algorithms.metric harus "kosinus" jika Anda menggunakan Azure OpenAI, jika tidak, gunakan metrik kesamaan yang terkait dengan model penyematan yang Anda gunakan. Nilai yang didukung adalah cosine, dotProduct, euclidean, hamming (digunakan untuk mengindeks data biner).

    • vectorSearch.profiles tambahkan lapisan abstraksi untuk mengakomodasi definisi yang lebih kaya. Profil didefinisikan dalam , lalu dirujuk vectorSearchberdasarkan nama pada setiap bidang vektor. Ini adalah kombinasi konfigurasi kompresi dan algoritma. Ini adalah properti yang Anda tetapkan ke bidang vektor, dan menentukan algoritma dan kompresi bidang.

Menambahkan bidang vektor ke kumpulan bidang

Kumpulan bidang harus menyertakan bidang untuk kunci dokumen, bidang vektor, dan bidang lain yang Anda butuhkan untuk skenario pencarian hibrid.

Bidang vektor ditandai dengan jenis datanya, dimensions properti berdasarkan model penyematan yang digunakan untuk menghasilkan vektor, dan profil vektor.

2024-07-01 umumnya tersedia.

  1. Gunakan Indeks Buat atau Perbarui untuk membuat indeks.

  2. Tentukan bidang vektor dengan atribut berikut. Anda dapat menyimpan satu penyematan yang dihasilkan per bidang. Untuk setiap bidang vektor:

    • type harus berupa jenis data vektor. Collection(Edm.Single) adalah yang paling umum untuk menyematkan model.
    • dimensions adalah jumlah dimensi yang dihasilkan oleh model penyematan. Untuk text-embedding-ada-002, ini adalah 1536.
    • vectorSearchProfile adalah nama profil yang ditentukan di tempat lain dalam indeks.
    • searchable harus benar.
    • retrievable bisa benar atau salah. True mengembalikan vektor mentah (1536 di antaranya) sebagai teks biasa dan mengonsumsi ruang penyimpanan. Atur ke true jika Anda meneruskan hasil vektor ke aplikasi hilir.
    • stored bisa benar atau salah. Ini menentukan apakah salinan vektor tambahan disimpan untuk pengambilan. Untuk informasi selengkapnya, lihat Mengurangi ukuran vektor.
    • filterable, facetable, sortable harus false.
  3. Tambahkan bidang nonvektor yang dapat difilter ke koleksi, seperti "judul" dengan filterable diatur ke true, jika Anda ingin memanggil prafilter atau postfilter pada kueri vektor.

  4. Tambahkan bidang lain yang menentukan substansi dan struktur konten tekstual yang Anda indeks. Minimal, Anda memerlukan kunci dokumen.

    Anda juga harus menambahkan bidang yang berguna dalam kueri atau dalam responsnya. Contoh berikut menunjukkan bidang vektor untuk judul dan konten ("titleVector", "contentVector") yang setara dengan vektor. Ini juga menyediakan bidang untuk konten tekstual yang setara ("judul", "konten") yang berguna untuk mengurutkan, memfilter, dan membaca dalam hasil pencarian.

    Contoh berikut menunjukkan kumpulan bidang:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hnsw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

Memuat data vektor untuk pengindeksan

Konten yang Anda berikan untuk pengindeksan harus sesuai dengan skema indeks dan menyertakan nilai string unik untuk kunci dokumen. Data yang telah diprovektorisasi dimuat ke dalam satu atau beberapa bidang vektor, yang dapat berdampingan dengan bidang lain yang berisi konten alfanumerik.

Anda dapat menggunakan metodologi pendorongan atau penarikan untuk penyerapan data.

Gunakan Dokumen - Indeks untuk memuat data vektor dan nonvektor ke dalam indeks. API pendorongan untuk pengindeksan identik di semua versi stabil dan pratinjau. Gunakan salah satu API berikut untuk memuat dokumen:

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

{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Periksa indeks Anda untuk konten vektor

Untuk tujuan validasi, Anda dapat mengkueri indeks menggunakan Search Explorer di panggilan portal Azure atau REST API. Karena Azure AI Search tidak dapat mengonversi vektor ke teks yang dapat dibaca manusia, coba kembalikan bidang dari dokumen yang sama yang memberikan bukti kecocokan. Misalnya, jika kueri vektor menargetkan bidang "titleVector", Anda dapat memilih "judul" untuk hasil pencarian.

Bidang harus dikaitkan sebagai "dapat diambil" untuk disertakan dalam hasil.

  • Tinjau indeks di Indeks manajemen>pencarian untuk melihat ukuran indeks all-up dan ukuran indeks vektor. Ukuran indeks vektor positif menunjukkan adanya vektor.

  • Gunakan Search Explorer untuk mengkueri indeks. Search Explorer memiliki dua tampilan: Tampilan kueri (default) dan tampilan JSON.

    • Atur Opsi>kueri Sembunyikan nilai vektor di hasil pencarian untuk hasil yang lebih mudah dibaca.

    • Gunakan tampilan JSON untuk kueri vektor. Anda dapat menempelkan definisi JSON dari kueri vektor yang ingin Anda jalankan, atau menggunakan konversi teks ke vektor atau gambar-ke-vektor bawaan jika indeks Anda memiliki penetapan vektorizer. Untuk informasi selengkapnya tentang pencarian gambar, lihat Mulai Cepat: Mencari gambar di Penjelajah Pencarian.

    • Gunakan tampilan Kueri default untuk konfirmasi cepat bahwa indeks berisi vektor. Tampilan kueri adalah untuk pencarian teks lengkap. Meskipun Anda tidak dapat menggunakannya untuk kueri vektor, Anda dapat mengirim pencarian kosong (search=*) untuk memeriksa konten. Konten semua bidang, termasuk bidang vektor, dikembalikan sebagai teks biasa.

    • Lihat Membuat kueri vektor untuk detail selengkapnya.

Memperbarui penyimpanan vektor

Untuk memperbarui penyimpanan vektor, ubah skema dan jika perlu, muat ulang dokumen untuk mengisi bidang baru. API untuk pembaruan skema termasuk Buat atau Perbarui Indeks (REST), CreateOrUpdateIndex di Azure SDK untuk .NET, create_or_update_index di Azure SDK for Python, dan metode serupa di Azure SDK lainnya.

Panduan standar untuk memperbarui indeks tercakup dalam Memperbarui atau membangun ulang indeks.

Poin-poin penting meliputi:

  • Hilangkan dan bangun ulang sering diperlukan untuk pembaruan dan penghapusan bidang yang ada.

  • Namun, Anda dapat memperbarui skema yang ada dengan modifikasi berikut, tanpa perlu membangun kembali:

    • Tambahkan bidang baru ke kumpulan bidang.
    • Tambahkan konfigurasi vektor baru, yang ditetapkan ke bidang baru tetapi bukan bidang yang sudah ada yang telah di-vektorisasi.
    • Ubah "dapat diambil" (nilai benar atau salah) pada bidang yang ada. Bidang vektor harus dapat dicari dan diambil, tetapi jika Anda ingin menonaktifkan akses ke bidang vektor dalam situasi di mana penurunan dan pembangunan kembali tidak layak, Anda dapat mengatur dapat diambil ke false.

Langkah berikutnya

Sebagai langkah berikutnya, kami merekomendasikan Data vektor kueri dalam indeks pencarian.

Sampel kode di repositori azure-search-vector menunjukkan alur kerja end-to-end yang mencakup definisi skema, vektorisasi, pengindeksan, dan kueri.

Ada kode demo untuk Python, C#, dan JavaScript.