

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Pencarian vektor untuk Amazon DocumentDB
<a name="vector-search"></a>

Pencarian vektor adalah metode yang digunakan dalam pembelajaran mesin untuk menemukan titik data yang serupa dengan titik data tertentu dengan membandingkan representasi vektor mereka menggunakan metrik jarak atau kesamaan. Semakin dekat kedua vektor berada di ruang vektor, semakin mirip item yang mendasarinya. Teknik ini membantu menangkap makna semantik dari data. Pendekatan ini berguna dalam berbagai aplikasi, seperti sistem rekomendasi, pemrosesan bahasa alami, dan pengenalan gambar.

Pencarian vektor untuk Amazon DocumentDB menggabungkan fleksibilitas dan kemampuan query yang kaya dari database dokumen berbasis JSON dengan kekuatan pencarian vektor. Jika Anda ingin menggunakan data Amazon DocumentDB yang ada atau struktur data dokumen yang fleksibel untuk membangun pembelajaran mesin dan kasus penggunaan AI generatif, seperti pengalaman pencarian semantik, rekomendasi produk, personalisasi, chatbots, deteksi penipuan, dan deteksi anomali, maka pencarian vektor untuk Amazon DocumentDB adalah pilihan ideal untuk Anda. Pencarian vektor tersedia di cluster berbasis instans Amazon DocumentDB 5.0.

**Topics**
+ [Memasukkan vektor](#w2aac21c11b9)
+ [Membuat indeks vektor](#w2aac21c11c11)
+ [Mendapatkan definisi indeks](#w2aac21c11c13)
+ [Menanyakan vektor](#w2aac21c11c15)
+ [Fitur dan keterbatasan](#vector-limitations)
+ [Praktik terbaik](#w2aac21c11c19)

## Memasukkan vektor
<a name="w2aac21c11b9"></a>

Untuk menyisipkan vektor ke dalam database Amazon DocumentDB, Anda dapat menggunakan metode penyisipan yang ada: 

**Contoh**

Dalam contoh berikut, kumpulan lima dokumen dalam database pengujian dibuat. Setiap dokumen mencakup dua bidang: nama produk dan penyematan vektor yang sesuai.

```
db.collection.insertMany([
  {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]},
  {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]},
  {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]},
  {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]},
  {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]}
]);
```

## Membuat indeks vektor
<a name="w2aac21c11c11"></a>

Amazon DocumentDB mendukung pengindeksan Hierarchical Navigable Small World (HNSW) dan Inverted File dengan metode pengindeksan Flat Compression (). IVFFlat IVFFlat Indeks memisahkan vektor ke dalam daftar dan selanjutnya mencari subset terpilih dari daftar yang terdekat dengan vektor kueri. Di sisi lain, indeks HNSW mengatur data vektor ke dalam grafik berlapis-lapis. Meskipun HNSW memiliki waktu pembuatan yang lebih lambat dibandingkan dengan IVFFlat, HNSW memberikan kinerja kueri dan penarikan yang lebih baik. Tidak seperti IVFFlat, HNSW tidak memiliki langkah pelatihan yang terlibat, memungkinkan indeks dihasilkan tanpa beban data awal. Untuk sebagian besar kasus penggunaan, sebaiknya gunakan tipe indeks HNSW untuk pencarian vektor.

Jika Anda tidak membuat indeks vektor, Amazon DocumentDB melakukan pencarian tetangga terdekat yang tepat, memastikan penarikan yang sempurna. Namun, dalam skenario produksi, kecepatan sangat penting. Kami merekomendasikan penggunaan indeks vektor, yang dapat memperdagangkan beberapa penarikan untuk meningkatkan kecepatan. Penting untuk dicatat bahwa menambahkan indeks vektor dapat menyebabkan hasil kueri yang berbeda.

**Template**

Anda dapat menggunakan `runCommand` templat `createIndex` atau templat berikut untuk membuat indeks vektor pada bidang vektor:

------
#### [ Using createIndex ]

Pada driver tertentu, seperti mongosh dan Java, menggunakan `vectorOptions` parameter di `createIndex` dapat mengakibatkan kesalahan. Dalam kasus seperti itu, kami sarankan menggunakan`runCommand`:

```
db.collection.createIndex(
  { "<vectorField>": "vector" },
  { "name": "<indexName>",
    "vectorOptions": {
      "type": " <hnsw> | <ivfflat> ",
      "dimensions": <number_of_dimensions>,
      "similarity": " <euclidean> | <cosine> | <dotProduct> ",
      "lists": <number_of_lists> [applicable for IVFFlat],
      "m": <max number of connections> [applicable for HNSW],
      "efConstruction": <size of the dynamic list for index build> [applicable for HNSW]
    }
  }
);
```

------
#### [ Using runCommand ]

Pada driver tertentu, seperti mongosh dan Java, menggunakan `vectorOptions` parameter di `createIndex` dapat mengakibatkan kesalahan. Dalam kasus seperti itu, kami sarankan menggunakan`runCommand`:

```
db.runCommand(
  { "createIndexes": "<collection>", 
  "indexes": [{
      key: { "<vectorField>": "vector" },
      vectorOptions: {
          type: " <hnsw> | <ivfflat> ",
          dimensions: <number of dimensions>,
          similarity: " <euclidean> | <cosine> | <dotProduct> ",
          lists: <number_of_lists> [applicable for IVFFlat],
          m: <max number of connections> [applicable for HNSW],
          efConstruction: <size of the dynamic list for index build> [applicable for HNSW]
          },
      name: "myIndex" 
      }] 
  }
);
```

------


| Parameter | Persyaratan | Jenis data | Deskripsi | Nilai | 
| --- | --- | --- | --- | --- | 
|  **name**  |  opsional  |  string  |  Menentukan nama indeks.  |  Alfanumerik  | 
|  **type**  |  opsional  |    |  Menentukan jenis indeks.  |  Didukung: hnsw atau ivfflat Default: HNSW (patch mesin 3.0.4574 dan seterusnya)  | 
|  **dimensions**  |  wajib  |  integer  |  Menentukan jumlah dimensi dalam data vektor.  |  Maksimal 2.000 dimensi.  | 
|  **similarity**  |  wajib  |  string  |  Menentukan metrik jarak yang digunakan untuk perhitungan kesamaan.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/documentdb/latest/developerguide/vector-search.html)  | 
|  **lists**  |  diperlukan untuk IVFFlat  |  integer  |  Menentukan jumlah cluster yang IVFFlat indeks menggunakan untuk mengelompokkan data vektor. Pengaturan yang disarankan adalah \$1 dokumen/1000 untuk hingga 1 juta dokumen dan `sqrt(# of documents)` untuk lebih dari 1 juta dokumen.  |  Minimal: 1 Maksimum: Lihat daftar per tabel jenis instans di [Fitur dan keterbatasan](#vector-limitations) bawah ini.  | 
|  **m**  |  opsional  |  integer  |  Menentukan jumlah max koneksi untuk indeks HNSW  |  Default: 16 Rentang [2, 100]  | 
|  **efConstruction**  |  opsional  |  integer  |  Menentukan ukuran daftar kandidat dinamis untuk membangun grafik untuk indeks HNSW. `efConstruction`harus lebih besar dari atau sama dengan (2 \$1 m)  |  Default: 64 Rentang [4, 1000]  | 

Penting bagi Anda untuk menetapkan nilai sub-parameter seperti `lists` untuk IVFFlat dan `m` dan `efConstruction` untuk HNSW dengan tepat karena akan memengaruhi akurasi/penarikan, waktu pembuatan, dan kinerja pencarian Anda. Nilai daftar yang lebih tinggi meningkatkan kecepatan kueri karena mengurangi jumlah vektor di setiap daftar, menghasilkan wilayah yang lebih kecil. Namun, ukuran wilayah yang lebih kecil dapat menyebabkan lebih banyak kesalahan penarikan, menghasilkan akurasi yang lebih rendah. Untuk HNSW, meningkatkan nilai `m` dan `efConstruction` meningkatkan akurasi, tetapi juga meningkatkan waktu dan ukuran pembuatan indeks. Lihat contoh berikut:

**Contoh**

------
#### [ HNSW ]

```
db.collection.createIndex(
  { "vectorEmbedding": "vector" },
  { "name": "myIndex",
    "vectorOptions": {
      "type": "hnsw",
      "dimensions": 3,
      "similarity": "euclidean",
      "m": 16,
      "efConstruction": 64
    }
  }
);
```

------
#### [ IVFFlat ]

```
db.collection.createIndex(
  { "vectorEmbedding": "vector" },
  { "name": "myIndex",
    "vectorOptions": {
      "type": "ivfflat",
      "dimensions": 3,
      "similarity": "euclidean",
      "lists":1
    }
  }
)
```

------

## Mendapatkan definisi indeks
<a name="w2aac21c11c13"></a>

Anda dapat melihat detail indeks Anda, termasuk indeks vektor, menggunakan perintah: `getIndexes`

**Contoh**

```
db.collection.getIndexes()
```

**Contoh keluaran**

```
[
 {
  "v" : 4,
  "key" : {
   "_id" : 1
  },
  "name" : "_id_",
  "ns" : "test.collection"
 },
 {
  "v" : 4,
  "key" : {
   "vectorEmbedding" : "vector"
  },
  "name" : "myIndex",
  "vectorOptions" : {
   "type" : "ivfflat",
   "dimensions" : 3,
   "similarity" : "euclidean",
   "lists" : 1
  },
  "ns" : "test.collection"
 }
]
```

## Menanyakan vektor
<a name="w2aac21c11c15"></a>

Amazon DocumentDB mendukung dua operator pencarian vektor untuk menanyakan vektor:

### Operator pencarian vektor klasik
<a name="w2aac21c11c15b5"></a>

Gunakan template berikut untuk menanyakan vektor:

```
db.collection.aggregate([
  {
    $search: {
      "vectorSearch": {
        "vector": <query vector>, 
        "path": "<vectorField>", 
        "similarity": "<distance metric>",
        "k": <number of results>,
        "probes":<number of probes> [applicable for IVFFlat],
        "efSearch":<size of the dynamic list during search> [applicable for HNSW]
      }
    }
  }
]);
```


| Parameter | Persyaratan | Tipe | Deskripsi | Nilai | 
| --- | --- | --- | --- | --- | 
|  **vectorSearch**  |  wajib  |  operator  |  Digunakan di dalam perintah \$1search untuk query vektor.  |    | 
|  **vector**  |  wajib  |  array  |  Menunjukkan vektor kueri yang akan digunakan untuk menemukan vektor serupa.  |    | 
|  **path**  |  wajib  |  string  |  Mendefinisikan nama bidang vektor.  |    | 
|  **k**  |  wajib  |  integer  |  Menentukan jumlah hasil yang pencarian kembali.  |    | 
|  **similarity**  |  wajib  |  string  |  Menentukan metrik jarak yang digunakan untuk perhitungan kesamaan.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/documentdb/latest/developerguide/vector-search.html)  | 
|  **probes**  |  opsional  |  integer  |  Jumlah cluster yang Anda inginkan pencarian vektor untuk diperiksa. Nilai yang lebih tinggi memberikan penarikan yang lebih baik dengan mengorbankan kecepatan. Ini dapat diatur ke jumlah daftar untuk pencarian tetangga terdekat yang tepat (di mana perencana tidak akan menggunakan indeks). Pengaturan yang disarankan untuk memulai fine-tuning adalah. `sqrt(# of lists)`  |  Default: 1  | 
|  **efSearch**  |  opsional  |  integer  |  Menentukan ukuran daftar kandidat dinamis yang digunakan indeks HNSW selama pencarian. Nilai yang lebih tinggi `efSearch` memberikan penarikan yang lebih baik dengan mengorbankan kecepatan.  |  Default: 40 Rentang [1, 1000]  | 

Penting untuk menyempurnakan nilai `efSearch` (HNSW) atau `probes` (IVFFlat) untuk mencapai kinerja dan akurasi yang Anda inginkan. Lihat contoh operasi berikut:

------
#### [ HNSW ]

```
db.collection.aggregate([
  {
    $search: {
      "vectorSearch": {
        "vector": [0.2, 0.5, 0.8], 
        "path": "vectorEmbedding", 
        "similarity": "euclidean",
        "k": 2,
        "efSearch": 40
      }
    }
  }
]);
```

------
#### [ IVFFlat ]

```
db.collection.aggregate([
  {
    $search: {
      "vectorSearch": {
        "vector": [0.2, 0.5, 0.8], 
        "path": "vectorEmbedding", 
        "similarity": "euclidean",
        "k": 2,
        "probes": 1
      }
    }
  }
]);
```

------

**Contoh keluaran**

Keluaran dari operasi ini terlihat seperti berikut ini:

```
{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] }
{ "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }
```

### `$vectorSearch`operator (tersedia di Amazon DocumentDB 8.0 dan seterusnya)
<a name="w2aac21c11c15b7"></a>

Gunakan template berikut untuk menanyakan vektor:

```
db.collection.aggregate([
{
  "$vectorSearch": {
    "exact": true | false,
    "index": "<index-name>" [supports only HNSW index],
    "limit": <number-of-results> [same as k],
    "path": "<vector field-to-search>",
    "queryVector": <array-of-numbers>,
    "numCandidates": <number-of-candidates> [same as efSearch], 
  }
}])
```

## Fitur dan keterbatasan
<a name="vector-limitations"></a>

**Kompatibilitas versi**
+ Pencarian vektor untuk Amazon DocumentDB hanya tersedia di Amazon DocumentDB 5.0\$1 cluster berbasis instans.

**vektor**
+ Amazon DocumentDB dapat mengindeks vektor hingga 2.000 dimensi. Namun, hingga 16.000 dimensi dapat disimpan tanpa indeks.

**Indeks**
+ Untuk pembuatan IVFFlat indeks, pengaturan yang disarankan untuk parameter daftar adalah jumlah dokumen/1000 hingga 1 juta dokumen dan `sqrt(# of documents)` untuk lebih dari 1 juta dokumen. Karena batas memori yang berfungsi, Amazon DocumentDB mendukung nilai maksimum tertentu dari parameter daftar tergantung pada jumlah dimensi. Untuk referensi Anda, tabel berikut memberikan nilai maksimum parameter daftar untuk vektor 500, 1000, dan 2.000 dimensi:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/documentdb/latest/developerguide/vector-search.html)
+ Tidak ada opsi indeks lain seperti`compound`, `sparse` atau `partial` didukung dengan indeks vektor.
+ Build indeks paralel tidak didukung untuk indeks HNSW di Amazon DocumentDB 5.0.

**kueri vektor**
+ Untuk kueri pencarian vektor, penting untuk menyempurnakan parameter seperti `probes` atau `efSearch` untuk hasil yang optimal. Semakin tinggi nilai `probes` atau `efSearch` parameter, semakin tinggi recall dan semakin rendah kecepatannya. Pengaturan yang disarankan untuk mulai menyempurnakan parameter probe adalah. `sqrt(# of lists)` 

## Praktik terbaik
<a name="w2aac21c11c19"></a>

Pelajari praktik terbaik untuk bekerja dengan pencarian vektor di Amazon DocumentDB. Bagian ini terus diperbarui saat praktik terbaik baru diidentifikasi.
+ File Terbalik dengan Pembuatan indeks Flat Compression (IVFFlat) melibatkan pengelompokan dan pengorganisasian titik data berdasarkan kesamaan. Oleh karena itu, agar indeks menjadi lebih efektif, kami menyarankan Anda setidaknya memuat beberapa data sebelum membuat indeks. 
+ Untuk kueri pencarian vektor, penting untuk menyempurnakan parameter seperti `probes` atau `efSearch` untuk hasil yang optimal. Semakin tinggi nilai `efSearch` parameter `probes` atau, semakin tinggi recall dan semakin rendah kecepatannya. Pengaturan yang disarankan untuk memulai fine tuning `probes` parameter adalah`sqrt(lists)`. 

**Sumber Daya**
+ [Pencarian vektor apa posting blog baru](https://aws.amazon.com/blogs/aws/vector-search-for-amazon-documentdb-with-mongodb-compatibility-is-now-generally-available)
+ [Contoh kode pencarian semantik](https://github.com/aws-samples/amazon-documentdb-samples/tree/master/blogs/semanticsearch-docdb)
+ [Sampel kode pencarian vektor Amazon DocumentDB](https://github.com/aws-samples/amazon-documentdb-samples/tree/master/samples/vector-search)