Bagikan melalui


Indeks dan vektor kueri di Azure Cosmos DB untuk NoSQL di JavaScript

BERLAKU UNTUK: NoSQL

Fitur pencarian vektor Azure Cosmos DB for NoSQL sedang dalam pratinjau. Sebelum menggunakan fitur ini, Anda harus terlebih dahulu mendaftar untuk pratinjau. Artikel ini mencakup langkah-langkah berikut:

  1. Mendaftar untuk pratinjau Pencarian Vektor di Azure Cosmos DB untuk NoSQL

  2. Menyiapkan kontainer Azure Cosmos DB untuk pencarian vektor

  3. Kebijakan penyematan vektor penulisan

  4. Menambahkan indeks vektor ke kebijakan pengindeksan kontainer

  5. Membuat kontainer dengan indeks vektor dan kebijakan penyematan vektor

  6. Melakukan pencarian vektor pada data yang disimpan

Panduan ini memandu melalui proses pembuatan data vektor, mengindeks data, lalu mengkueri data dalam kontainer.

Prasyarat

  • Akun Azure Cosmos DB for NoSQL yang sudah ada.
  • Versi terbaru Azure Cosmos DB JavaScript SDK (Versi 4.1.0 atau yang lebih baru)

Mendaftar untuk pratinjau

Pencarian vektor untuk Azure Cosmos DB untuk NoSQL memerlukan pendaftaran fitur pratinjau. 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 untuk "Pencarian Vektor di Azure Cosmos DB for NoSQL."

  4. Baca deskripsi fitur untuk mengonfirmasi bahwa Anda ingin mendaftar dalam pratinjau.

  5. Pilih "Aktifkan" untuk mendaftar di pratinjau.

    Catatan

    Permintaan pendaftaran akan disetujui secara otomatis, namun mungkin perlu waktu beberapa menit untuk diterapkan.

Langkah-langkah berikut mengasumsikan bahwa Anda tahu cara menyiapkan akun Cosmos DB NoSQL dan membuat database. Fitur pencarian vektor saat ini hanya didukung pada kontainer baru, bukan kontainer yang ada. Anda perlu membuat kontainer baru lalu menentukan kebijakan penyematan vektor tingkat kontainer dan kebijakan pengindeksan vektor pada saat pembuatan.

Mari kita ambil contoh pembuatan database untuk bookstore berbasis internet dan Anda menyimpan Judul, Penulis, ISBN, dan Deskripsi untuk setiap buku. Kami juga menentukan dua properti untuk berisi penyematan vektor. Yang pertama adalah properti "contentVector", yang berisi penyematan teks yang dihasilkan dari konten teks buku (misalnya, menggabungkan properti "judul" "penulis" "isbn" dan "deskripsi" sebelum membuat penyematan). Yang kedua adalah "coverImageVector," yang dihasilkan dari gambar sampul buku.

  1. Buat dan simpan penyematan vektor untuk bidang tempat Anda ingin melakukan pencarian vektor.
  2. Tentukan jalur penyematan vektor dalam kebijakan penyematan vektor.
  3. Sertakan indeks vektor yang diinginkan dalam kebijakan pengindeksan untuk kontainer.

Untuk bagian berikutnya dari artikel ini, kami mempertimbangkan struktur ini untuk item yang disimpan dalam kontainer kami:

{
"title": "book-title",
"author": "book-author",
"isbn": "book-isbn",
"description": "book-description",
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1],
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78]
}

Membuat kebijakan penyematan vektor untuk kontainer Anda

Selanjutnya, Anda perlu menentukan kebijakan vektor kontainer. Kebijakan ini menyediakan informasi yang digunakan untuk menginformasikan mesin kueri Azure Cosmos DB cara menangani properti vektor dalam fungsi sistem VectorDistance. Kebijakan ini juga menginformasikan kebijakan pengindeksan vektor informasi yang diperlukan, jika Anda memilih untuk menentukannya.

Informasi berikut disertakan dalam kebijakan vektor yang terkandung:

Deskripsi
path Jalur properti yang berisi vektor
datatype Jenis elemen vektor (default Float32)
dimensions Panjang setiap vektor di jalur (default 1536)
distanceFunction Metrik yang digunakan untuk menghitung jarak/kesamaan (default Cosine)

Untuk contoh kami dengan detail buku, kebijakan vektor dapat terlihat seperti contoh JSON:

const vectorEmbeddingPolicy: VectorEmbeddingPolicy = {
      vectorEmbeddings: [
        {
          path: "/coverImageVector",
          dataType: "float32",
          dimensions: 8,
          distanceFunction: "dotproduct",
        },
        {
          path: "contentVector",
          dataType: "float32",
          dimensions: 10,
          distanceFunction: "cosine",
        },
      ],
    };

Membuat indeks vektor dalam kebijakan pengindeksan

Setelah jalur penyematan vektor diputuskan, indeks vektor perlu ditambahkan ke kebijakan pengindeksan. Anda harus menerapkan kebijakan vektor selama waktu pembuatan kontainer dan tidak dapat dimodifikasi nanti. Untuk contoh ini, kebijakan pengindeksan akan terlihat seperti ini:

const indexingPolicy: IndexingPolicy = {
  vectorIndexes: [
    { path: "/coverImageVector", type: "quantizedFlat" },
    { path: "/contentVector", type: "diskANN" },
  ],
    inlcludedPaths: [
      {
        path: "/*",
      },
    ],
    excludedPaths: [
      {
        path: "/coverImageVector/*",
      },
      {
        path: "/contentVector/*",
      },
    ]
};

Sekarang buat kontainer Anda seperti biasa.

const containerName = "vector embedding container";
    // create container
    const { resource: containerdef } = await database.containers.createIfNotExists({
      id: containerName,
      vectorEmbeddingPolicy: vectorEmbeddingPolicy,
      indexingPolicy: indexingPolicy,
    });

Penting

Saat ini pencarian vektor di Azure Cosmos DB untuk NoSQL hanya didukung pada kontainer baru. Anda perlu mengatur kebijakan vektor kontainer dan kebijakan pengindeksan vektor apa pun selama waktu pembuatan kontainer karena tidak dapat dimodifikasi nanti. Kedua kebijakan akan dapat dimodifikasi dalam penyempurnaan fitur pratinjau di masa mendatang.

Menjalankan kueri pencarian kesamaan vektor

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. Misalkan Anda ingin mencari buku tentang resep makanan dengan melihat deskripsinya. Anda harus terlebih dahulu mendapatkan penyematan untuk teks kueri Anda. Dalam hal ini, Anda mungkin ingin menghasilkan penyematan untuk teks kueri - "resep makanan." Setelah Anda memiliki penyematan untuk kueri pencarian, Anda bisa menggunakannya dalam fungsi VectorDistance di kueri pencarian vektor dan mendapatkan semua item yang mirip dengan kueri Anda seperti yang diperlihatkan di sini:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])

Kueri ini mengambil judul buku bersama dengan skor kesamaan sehubungan dengan kueri Anda. Berikut adalah contoh di JavaScript:

const { resources } = await container.items
  .query({
    query: "SELECT c.title, VectorDistance(c.contentVector, @embedding) AS SimilarityScore FROM c  ORDER BY VectorDistance(c.contentVector, @embedding)"
    parameters: [{ name: "@embedding", value: [1,2,3,4,5,6,7,8,9,10] }]
  })
  .fetchAll();
for (const item of resources) {
  console.log(`${itme.title}, ${item.SimilarityScore} is a capitol `);
}