Membuat penyimpanan vektor

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

Ikuti langkah-langkah berikut untuk mengindeks data vektor:

Artikel ini berlaku untuk versi non-pratinjau pencarian vektor yang tersedia secara umum, yang mengasumsikan kode aplikasi Anda memanggil sumber daya eksternal untuk pemotongan dan pengodean.

Catatan

Mencari panduan migrasi dari pratinjau 2023-07-01? Lihat Meningkatkan REST API.

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 mendukung pencarian vektor. Jika indeks yang berisi bidang vektor gagal dibuat atau diperbarui, ini adalah indikator. Dalam situasi ini, layanan baru harus dibuat.

  • Penyematan vektor yang sudah ada sebelumnya di dokumen sumber Anda. Pencarian Azure AI tidak menghasilkan vektor dalam versi Azure SDK dan REST API yang tersedia secara umum. Kami merekomendasikan model penyematan Azure OpenAI tetapi Anda dapat menggunakan model apa pun untuk vektorisasi. Untuk informasi selengkapnya, lihat Membuat penyematan.

  • Anda harus mengetahui batas dimensi model yang digunakan untuk membuat penyematan dan bagaimana kesamaan dihitung. Di Azure OpenAI, untuk text-embedding-ada-002, panjang vektor numerik adalah 1536. Kesamaan dihitung menggunakan cosine. Nilai yang valid adalah 2 hingga 3072 dimensi.

  • 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 data numerik yang dihasilkan oleh penyematan model, satu penyematan per bidang. Kami merekomendasikan model penyematan di Azure OpenAI, seperti text-embedding-ada-002 untuk dokumen teks atau IMAGE Retrieval REST API untuk gambar. Hanya bidang vektor tingkat atas indeks yang didukung: Sub-bidang vektor saat ini tidak didukung.

  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 algoritma pencarian vektor dan 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 akan berfungsi: jika Anda memilih lengkap, Anda tidak dapat nantinya meminta pencarian HNSW karena struktur data tambahan yang memungkinkan perkiraan pencarian tidak ada.

Mencari panduan migrasi versi pratinjau ke stabil? Lihat Meningkatkan REST API untuk langkah-langkahnya.

REST API versi 2023-11-01 mendukung konfigurasi vektor yang memiliki:

  • vectorSearch algoritma, hnsw dan exhaustiveKnn tetangga terdekat, dengan parameter untuk pengindeksan dan penilaian.
  • vectorProfiles untuk beberapa kombinasi konfigurasi algoritma.

Pastikan untuk memiliki strategi untuk mem-vektorisasi konten Anda. Versi stabil tidak menyediakan vektorizer untuk penyematan 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": {
         "algorithms": [
             {
                 "name": "my-hnsw-config-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-hnsw-config-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-eknn-config",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "cosine"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "my-default-vector-profile",
             "algorithm": "my-hnsw-config-2"
           }
         ]
     }
    

    Poin utama:

    • Nama konfigurasi. Nama harus unik dalam indeks.
    • profiles tambahkan lapisan abstraksi untuk mengakomodasi definisi yang lebih kaya. Profil didefinisikan dalam , lalu dirujuk vectorSearchberdasarkan nama pada setiap bidang vektor.
    • "hnsw" dan "exhaustiveKnn" merupakan algoritma Perkiraan Tetangga Terdekat (ANN) yang digunakan untuk mengatur konten vektor selama pengindeksan.
    • "m" (jumlah tautan dua arah) default adalah 4. Rentangnya adalah 4 hingga 10. Nilai yang lebih rendah harus mengembalikan lebih sedikit kebisingan dalam hasil.
    • "efConstruction" defaultnya adalah 400. Rentangnya adalah 100 hingga 1.000. Ini adalah jumlah tetangga terdekat yang digunakan selama pengindeksan.
    • "efSearch" defaultnya adalah 500. Rentangnya adalah 100 hingga 1.000. Ini adalah jumlah tetangga terdekat yang digunakan selama pencarian.
    • "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.

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 berjenis Collection(Edm.Single) dan nilai floating-point presisi tunggal. Bidang jenis ini juga memiliki dimensions properti dan menentukan konfigurasi vektor.

Gunakan versi ini jika Anda hanya ingin fitur yang tersedia secara umum.

  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 merupakan Collection(Edm.Single).
    • 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.
    • 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=2023-11-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,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "my-hnsw-config-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "my-default-vector-profile",
                    "algorithm": "my-hnsw-config-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 (2023-11-01), Dokumen Indeks (Pratinjau 10-10-2023), atau Tambahkan, Perbarui, atau Hapus Dokumen (Pratinjau 2023-07-01) untuk mendorong dokumen yang berisi data vektor.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "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 portal Azure atau panggilan 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.

Anda bisa menggunakan Search Explorer untuk mengkueri indeks. Penjelajah pencarian memiliki dua tampilan: Tampilan kueri (default) dan tampilan JSON.

  • Gunakan tampilan JSON untuk kueri vektor, menempelkan dalam definisi JSON dari kueri vektor yang ingin Anda jalankan.

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

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 Menghilangkan dan membangun kembali 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.