Bagikan melalui


Vektor indeks dan kueri di Azure Cosmos DB untuk NoSQL di Java

BERLAKU UNTUK: NoSQL

Pencarian vektor di Azure Cosmos DB untuk NoSQL saat ini adalah fitur pratinjau. Anda diharuskan mendaftar untuk pratinjau sebelum menggunakan. 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.
  7. 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 Java SDK.

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 tidak didukung pada kontainer yang ada, jadi Anda perlu membuat kontainer baru dan menentukan kebijakan penyematan vektor tingkat kontainer, dan kebijakan pengindeksan vektor pada saat pembuatan kontainer.

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 di bawah 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] 
} 

Pertama, buat CosmosContainerProperties objek.

CosmosContainerProperties collectionDefinition = new CosmosContainerProperties(UUID.randomUUID().toString(), "Partition_Key_Def");

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. Ini juga menginformasikan kebijakan pengindeksan vektor informasi yang diperlukan, jika Anda memilih untuk menentukannya. Informasi berikut disertakan dalam kebijakan vektor yang terkandung:

  • "path": Jalur properti yang berisi vektor
  • "datatype": Jenis elemen vektor (default Float32)
  • "dimensi": 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 mungkin terlihat seperti contoh JSON:

// Creating vector embedding policy
CosmosVectorEmbeddingPolicy cosmosVectorEmbeddingPolicy = new CosmosVectorEmbeddingPolicy();

CosmosVectorEmbedding embedding1 = new CosmosVectorEmbedding();
embedding1.setPath("/coverImageVector");
embedding1.setDataType(CosmosVectorDataType.FLOAT32);
embedding1.setDimensions(8L);
embedding1.setDistanceFunction(CosmosVectorDistanceFunction.COSINE);

CosmosVectorEmbedding embedding2 = new CosmosVectorEmbedding();
embedding2.setPath("/contentVector");
embedding2.setDataType(CosmosVectorDataType.FLOAT32);
embedding2.setDimensions(10L);
embedding2.setDistanceFunction(CosmosVectorDistanceFunction.DOT_PRODUCT);

cosmosVectorEmbeddingPolicy.setCosmosVectorEmbeddings(Arrays.asList(embedding1, embedding2, embedding3));

collectionDefinition.setVectorEmbeddingPolicy(cosmosVectorEmbeddingPolicy);

Membuat indeks vektor dalam kebijakan pengindeksan

Setelah jalur penyematan vektor diputuskan, indeks vektor perlu ditambahkan ke kebijakan pengindeksan. Saat ini, fitur pencarian vektor untuk Azure Cosmos DB for NoSQL hanya didukung pada kontainer baru sehingga Anda perlu menerapkan kebijakan vektor selama waktu pembuatan kontainer dan tidak dapat dimodifikasi nanti. Untuk contoh ini, kebijakan pengindeksan akan terlihat seperti di bawah ini:

IndexingPolicy indexingPolicy = new IndexingPolicy();
indexingPolicy.setIndexingMode(IndexingMode.CONSISTENT);
ExcludedPath excludedPath1 = new ExcludedPath("/coverImageVector/*");
ExcludedPath excludedPath2 = new ExcludedPath("/contentVector/*");
indexingPolicy.setExcludedPaths(ImmutableList.of(excludedPath1, excludedPath2));

IncludedPath includedPath1 = new IncludedPath("/*");
indexingPolicy.setIncludedPaths(Collections.singletonList(includedPath1));

// Creating vector indexes
CosmosVectorIndexSpec cosmosVectorIndexSpec1 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec1.setPath("/coverImageVector");
cosmosVectorIndexSpec1.setType(CosmosVectorIndexType.QUANTIZED_FLAT.toString());

CosmosVectorIndexSpec cosmosVectorIndexSpec2 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec2.setPath("/contentVector");
cosmosVectorIndexSpec2.setType(CosmosVectorIndexType.DISK_ANN.toString());

indexingPolicy.setVectorIndexes(Arrays.asList(cosmosVectorIndexSpec1, cosmosVectorIndexSpec2, cosmosVectorIndexSpec3));

collectionDefinition.setIndexingPolicy(indexingPolicy);

Terakhir, buat kontainer dengan kebijakan indeks kontainer dan kebijakan indeks vektor.

database.createContainer(collectionDefinition).block();

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

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 deskripsi, 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 Java:

float[] embedding = new float[10];
for (int i = 0; i < 10; i++) {
    array[i] = i + 1;
}
ArrayList<SqlParameter> paramList = new ArrayList<SqlParameter>();
  paramList.add(new SqlParameter("@embedding", embedding));
  SqlQuerySpec querySpec = new SqlQuerySpec("SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore  FROM c ORDER BY VectorDistance(c.contentVector,@embedding)", paramList);
  CosmosPagedIterable<Family> filteredFamilies = container.queryItems(querySpec, new CosmosQueryRequestOptions(), Family.class);

  if (filteredFamilies.iterator().hasNext()) {
      Family family = filteredFamilies.iterator().next();
      logger.info(String.format("First query result: Family with (/id, partition key) = (%s,%s)",family.getId(),family.getLastName()));
  }

Langkah berikutnya