Bagikan melalui


Pencarian Vektor di Azure Cosmos DB untuk NoSQL

Azure Cosmos DB for NoSQL sekarang menawarkan pengindeksan dan pencarian vektor yang efisien. Fitur ini dirancang untuk menangani vektor dimensi tinggi, memungkinkan pencarian vektor yang efisien dan akurat dalam skala apa pun. Sekarang Anda dapat menyimpan vektor langsung di dokumen bersama data Anda. Setiap dokumen dalam database Anda tidak hanya dapat berisi data bebas skema tradisional, tetapi juga vektor dimensi tinggi sebagai properti dokumen lainnya. Kolokasi data dan vektor ini memungkinkan pengindeksan dan pencarian yang efisien, karena vektor disimpan dalam unit logis yang sama dengan data yang mereka wakili. Menjaga vektor dan data bersama-sama menyederhanakan manajemen data, arsitektur aplikasi AI, dan efisiensi operasi berbasis vektor.

Azure Cosmos DB for NoSQL menawarkan fleksibilitas yang ditawarkannya dalam memilih metode pengindeksan vektor:

  • Pencarian persis tetangga "datar" atau k-terdekat (kadang-kadang disebut brute-force) dapat memberikan 100% pengenalan pengambilan untuk pencarian vektor yang lebih kecil dan berfokus. terutama ketika dikombinasikan dengan filter kueri dan kunci partisi.
  • Indeks datar terukur yang mengompresi vektor menggunakan metode kuantisasi berbasis DiskANN untuk efisiensi yang lebih baik dalam pencarian kNN.
  • DiskANN, serangkaian algoritma pengindeksan vektor canggih yang dikembangkan oleh Microsoft Research untuk mendukung pencarian vektor akurasi tinggi yang efisien dalam skala apa pun.

Pelajari selengkapnya tentang pengindeksan vektor di sini

Pencarian vektor di Azure Cosmos DB dapat dikombinasikan dengan semua filter dan indeks kueri NoSQL Azure Cosmos DB lainnya yang didukung menggunakan WHERE klausa. Ini memungkinkan pencarian vektor Anda menjadi data yang paling relevan untuk aplikasi Anda.

Fitur ini meningkatkan kemampuan inti Azure Cosmos DB, membuatnya lebih serbaguna untuk menangani data vektor dan persyaratan pencarian dalam aplikasi AI.


Apa itu penyimpanan vektor?

Penyimpanan vektor atau database vektor adalah database yang dirancang untuk menyimpan dan mengelola penyematan vektor, yang merupakan representasi matematika data dalam ruang dimensi tinggi. Dalam ruang ini, setiap dimensi sesuai dengan fitur data, dan puluhan ribu dimensi mungkin digunakan untuk mewakili data canggih. Posisi vektor dalam ruang ini mewakili karakteristiknya. Kata, frasa, atau seluruh dokumen, dan gambar, audio, dan jenis data lainnya semuanya dapat di-vektorisasi.

Bagaimana cara kerja penyimpanan vektor?

Di penyimpanan vektor, algoritma pencarian vektor digunakan untuk mengindeks dan mengkueri penyematan. Beberapa algoritma pencarian vektor terkenal termasuk Hierarkis Navigable Small World (HNSW), Inverted File (IVF), DiskANN, dll. Pencarian vektor adalah metode yang membantu Anda menemukan item serupa berdasarkan karakteristik datanya daripada dengan kecocokan yang tepat pada bidang properti. Teknik ini berguna dalam aplikasi seperti mencari teks serupa, menemukan gambar terkait, membuat rekomendasi, atau bahkan mendeteksi anomali. Ini digunakan untuk mengkueri penyematan vektor data yang Anda buat dengan menggunakan model pembelajaran mesin dengan menggunakan API penyematan. Contoh API penyematan adalah Azure OpenAI Embeddings atau Hugging Face di Azure. Pencarian vektor mengukur jarak antara vektor data dan vektor kueri Anda. Vektor data yang paling dekat dengan vektor kueri Anda adalah vektor yang ditemukan paling mirip secara semantik.

Dalam Database Vektor Terintegrasi di Azure Cosmos DB untuk NoSQL, penyematan dapat disimpan, diindeks, dan dikueri bersama data asli. Pendekatan ini menghilangkan biaya tambahan untuk mereplikasi data dalam database vektor murni terpisah. Selain itu, arsitektur ini menjaga penyematan vektor dan data asli bersama-sama, yang lebih memfasilitasi operasi data multi-modal, dan memungkinkan konsistensi, skala, dan performa data yang lebih besar.

Mengaktifkan fitur pengindeksan dan pencarian vektor

Pengindeksan dan pencarian vektor di Azure Cosmos DB untuk NoSQL memerlukan pengaktifan di halaman Fitur Azure Cosmos DB Anda. Ikuti langkah-langkah di bawah ini untuk mendaftar:

  1. Navigasi ke halaman sumber daya Azure Cosmos DB for NoSQL Anda.

  2. Pilih panel "Fitur" di bawah item menu "Pengaturan".

  3. Pilih fitur "Pencarian Vektor di Azure Cosmos DB for NoSQL".

  4. Baca deskripsi fitur untuk mengonfirmasi bahwa Anda ingin mengaktifkannya.

  5. Pilih "Aktifkan" untuk mengaktifkan pengindeksan vektor dan kemampuan pencarian.

    Tip

    Atau, gunakan Azure CLI untuk memperbarui kemampuan akun Anda untuk mendukung pencarian vektor NoSQL.

    az cosmosdb update \
         --resource-group <resource-group-name> \
         --name <account-name> \
         --capabilities EnableNoSQLVectorSearch
    

Catatan

Permintaan pendaftaran akan disetujui secara otomatis; namun, mungkin perlu waktu 15 menit untuk sepenuhnya mengaktifkan akun.

Kebijakan Vektor Kontainer

Melakukan pencarian vektor dengan Azure Cosmos DB for NoSQL mengharuskan Anda menentukan kebijakan vektor untuk kontainer. Ini memberikan informasi penting bagi mesin database untuk melakukan pencarian kesamaan yang efisien untuk vektor yang ditemukan dalam dokumen kontainer. Ini juga menginformasikan kebijakan pengindeksan vektor informasi yang diperlukan, jika Anda memilih untuk menentukannya. Informasi berikut disertakan dalam kebijakan vektor yang terkandung:

  • "path": properti yang berisi vektor (diperlukan).
  • "datatype": jenis data properti vektor (default Float32). 
  • "dimensi": Dimensi atau panjang setiap vektor di jalur. Semua vektor dalam jalur harus memiliki jumlah dimensi yang sama. (default 1536).
  • "distanceFunction": Metrik yang digunakan untuk menghitung jarak/kesamaan. Metrik yang didukung adalah:
    • kosinus, yang memiliki nilai dari -1 (paling tidak mirip) dengan +1 (paling mirip).
    • produk titik, yang memiliki nilai dari -inf (paling tidak mirip) dengan +inf (paling mirip).
    • euclidean, yang memiliki nilai dari 0 (paling mirip) dengan +inf) (paling tidak serupa).

Catatan

Setiap jalur unik dapat memiliki paling banyak satu kebijakan. Namun, beberapa kebijakan dapat ditentukan asalkan semuanya menargetkan jalur yang berbeda.

Kebijakan vektor kontainer dapat dijelaskan sebagai objek JSON. Berikut adalah dua contoh kebijakan vektor kontainer yang valid:

Kebijakan dengan satu jalur vektor

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        }
    ]
}

Kebijakan dengan dua jalur vektor

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        },
        {
            "path":"/vector2",
            "dataType":"int8",
            "distanceFunction":"dotproduct",
            "dimensions":100
        }
    ]
}

Kebijakan pengindeksan vektor

Indeks vektor meningkatkan efisiensi saat melakukan pencarian vektor menggunakan VectorDistance fungsi sistem. Pencarian vektor memiliki latensi yang lebih rendah, throughput yang lebih tinggi, dan konsumsi RU yang lebih sedikit saat menggunakan indeks vektor. Anda dapat menentukan jenis kebijakan indeks vektor berikut:

Tipe Deskripsi Dimensi maks
flat Menyimpan vektor pada indeks yang sama dengan properti terindeks lainnya. 505
quantizedFlat Mengukur (mengompresi) vektor sebelum menyimpan pada indeks. Ini dapat meningkatkan latensi dan throughput dengan biaya akurasi dalam jumlah kecil. 4096
diskANN Membuat indeks berdasarkan DiskANN untuk perkiraan pencarian yang cepat dan efisien. 4096

Catatan

Indeks quantizedFlat dan diskANN mengharuskan setidaknya 1.000 vektor dimasukkan. Hal ini untuk memastikan akurasi proses kuantisasi. Jika ada kurang dari 1.000 vektor, pemindaian penuh dijalankan sebagai gantinya dan akan menyebabkan biaya RU yang lebih tinggi untuk kueri pencarian vektor.

Beberapa poin yang perlu diperhatikan:

  • Jenis flat indeks dan quantizedFlat menggunakan indeks Azure Cosmos DB untuk menyimpan dan membaca setiap vektor saat melakukan pencarian vektor. Pencarian vektor dengan flat indeks adalah pencarian brute-force dan menghasilkan akurasi atau pengenalan 100%. Artinya, dijamin untuk menemukan vektor yang paling mirip dalam himpunan data. Namun, ada batasan 505 dimensi untuk vektor pada indeks datar.

  • Indeks quantizedFlat menyimpan vektor kuantisasi (terkompresi) pada indeks. Pencarian vektor dengan quantizedFlat indeks juga merupakan pencarian brute-force, namun akurasinya mungkin sedikit kurang dari 100% karena vektor diukur sebelum ditambahkan ke indeks. Namun, pencarian vektor dengan quantized flat harus memiliki latensi yang lebih rendah, throughput yang lebih tinggi, dan biaya RU yang lebih rendah daripada pencarian vektor pada flat indeks. Ini adalah opsi yang baik untuk skenario yang lebih kecil, atau skenario di mana Anda menggunakan filter kueri untuk mempersempit pencarian vektor ke sekumpulan vektor yang relatif kecil. quantizedFlat disarankan ketika jumlah vektor yang akan diindeks berada di sekitar 50.000 atau lebih sedikit per partisi fisik. Namun, ini hanyalah pedoman umum dan performa aktual harus diuji karena setiap skenario bisa berbeda.

  • Indeks diskANN adalah indeks terpisah yang didefinisikan khusus untuk vektor yang menggunakan DiskANN, serangkaian algoritma pengindeksan vektor performa tinggi yang dikembangkan oleh Microsoft Research. Indeks DiskANN dapat menawarkan beberapa latensi terendah, throughput tertinggi, dan kueri biaya RU terendah, sambil tetap mempertahankan akurasi tinggi. Secara umum, DiskANN adalah yang paling berkinerja dari semua jenis indeks jika ada lebih dari 50.000 vektor per partisi fisik.

Berikut adalah contoh kebijakan indeks vektor yang valid:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "diskANN"
        }
    ]
}
{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*",
        },
        {
            "path": "/vector2/*",
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "diskANN"
        }
    ]
}

Penting

Jalur vektor ditambahkan ke bagian "excludedPaths" dari kebijakan pengindeksan untuk memastikan performa yang dioptimalkan untuk penyisipan. Tidak menambahkan jalur vektor ke "excludedPaths" akan mengakibatkan biaya RU dan latensi yang lebih tinggi untuk penyisipan vektor.

Penting

Karakter kartubebas (*, []) saat ini tidak didukung dalam kebijakan vektor atau indeks vektor.

Melakukan pencarian vektor dengan kueri menggunakan VectorDistance()

Setelah Anda membuat kontainer dengan kebijakan vektor yang diinginkan, dan menyisipkan data vektor ke dalam kontainer, Anda dapat melakukan pencarian vektor menggunakan fungsi sistem Jarak Vektor dalam kueri. Contoh kueri NoSQL yang memproyeksikan skor kesamaan sebagai alias SimilarityScore, dan mengurutkan dalam urutan yang paling mirip dengan yang paling tidak serupa:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

Penting

Selalu gunakan TOP N klausa dalam SELECT pernyataan kueri. Jika tidak, pencarian vektor akan mencoba mengembalikan lebih banyak hasil dan kueri akan lebih mahal RU dan memiliki latensi yang lebih tinggi daripada yang diperlukan.

Batasan saat ini

Pengindeksan dan pencarian vektor di Azure Cosmos DB for NoSQL memiliki beberapa batasan.

  • quantizedFlat dan diskANN indeks memerlukan setidaknya 1.000 vektor untuk diindeks untuk memastikan bahwa kuantisasi akurat. Jika kurang dari 1.000 vektor diindeks, maka pemindaian penuh digunakan sebagai gantinya dan biaya RU mungkin lebih tinggi.
  • Vektor yang diindeks dengan flat jenis indeks dapat mencapai paling banyak 505 dimensi. Vektor yang diindeks dengan quantizedFlat jenis indeks atau DiskANN dapat mencapai paling banyak 4.096 dimensi.
  • Indeks quantizedFlat menggunakan metode kuantisasi yang sama dengan DiskANN.
  • Tingkat penyisipan vektor harus dibatasi. Penyerapan yang sangat besar (lebih dari vektor 5M) mungkin memerlukan waktu build indeks tambahan.
  • Fitur pencarian vektor saat ini tidak didukung pada kontainer yang ada. Untuk menggunakannya, kontainer baru harus dibuat, dan kebijakan penyematan vektor tingkat kontainer harus ditentukan.
  • Database throughput bersama tidak didukung.
  • Saat ini, pengindeksan dan pencarian vektor tidak didukung di akun dengan Analytical Store (dan Synapse Link) dan Throughput Bersama.
  • Setelah pengindeksan dan pencarian vektor diaktifkan pada kontainer, pengindeksan dan pencarian tidak dapat dinonaktifkan.

Langkah selanjutnya