Lewati ke konten utama

Menguasai Pencarian Vektor di MongoDB: Panduan dengan Contoh

Pelajari cara menyiapkan dan menggunakan Vector Search di MongoDB untuk membangun aplikasi cerdas. Panduan praktis ini membahas pengindeksan vektor, praktik terbaik kueri, dan contoh dunia nyata.
· 7 mnt Baca

Jelajahi bersama AI

Pengindeksan vektor telah menjadi alat yang kuat untuk membangun aplikasi modern. Ini memungkinkan Anda melakukan pencarian kemiripan yang cepat dan efisien pada data berdimensi tinggi, yang sering disebut sebagai vector embeddings. Kapabilitas ini kini terintegrasi mulus ke dalam MongoDB, memungkinkan pengembang membangun fitur canggih langsung di dalam basis data mereka.

Artikel ini adalah panduan praktis untuk menyiapkan dan menggunakan pengindeksan vektor di MongoDB. Kami akan menelusuri prosesnya langkah demi langkah, mulai dari membuat indeks pertama hingga menjalankan kueri kompleks. Anda juga akan mempelajari praktik terbaik dan mengeksplorasi contoh nyata membangun sistem rekomendasi produk untuk toko e-commerce.

Apa itu Pengindeksan Vektor?

Intinya, pengindeksan vektor adalah teknik untuk mengatur vector embeddings guna mempercepat pencarian kemiripan. Tidak seperti indeks tradisional yang bekerja pada nilai skalar (seperti angka atau string), indeks vektor dioptimalkan untuk menemukan vektor "bertetangga" dalam ruang multidimensi.

Vector embeddings adalah representasi numerik dari data kompleks, termasuk teks, gambar, dan audio. Misalnya, deskripsi produk dapat diubah menjadi vektor di mana produk serupa memiliki vektor yang lebih berdekatan dalam ruang. Kedekatan ini memungkinkan aplikasi kuat seperti:

  • Pencarian semantik: Menemukan produk berdasarkan makna kueri, bukan hanya kecocokan kata kunci.
  • Sistem rekomendasi: Menyarankan produk atau konten kepada pengguna berdasarkan preferensi mereka.
  • Pengenalan gambar: Mengidentifikasi gambar serupa dari basis data besar.

Menyiapkan pengindeksan vektor di MongoDB

Untuk memulai, Anda memerlukan klaster MongoDB Atlas. Vector search adalah fitur cloud-native. Anda dapat mencoba fitur ini di MongoDB Atlas, atau Community edition gratis. Dalam artikel ini, kami akan menggunakan MongoDB Atlas.

Langkah 1: Buat klaster MongoDB Atlas 

Buat klaster baru di MongoDB Atlas. Tier M0 gratis sudah cukup untuk tujuan pengujian.

Langkah 2: Buat koleksi dan masukkan data 

Pertama, sambungkan ke klaster Anda menggunakan MongoDB Shell (mongosh) atau driver pilihan Anda. Lalu, buat koleksi baru bernama products dan masukkan dokumen yang berisi field vektor. Setiap dokumen harus merepresentasikan sebuah produk dan menyertakan field embedding, yang akan menampung representasi vektor produk.

Berikut contoh lebih lengkap dengan tiga dokumen produk berbeda, masing-masing dengan vektor yang dihasilkan secara acak untuk menunjukkan seperti apa datanya. Dalam skenario nyata, Anda akan menggantinya dengan embedding yang dihasilkan oleh model AI.

db.products.insertMany([
  {
    "name": "Wireless Noise-Canceling Headphones",
    "category": "Electronics",
    "description": "Premium over-ear headphones with active noise cancellation and a 30-hour battery life.",
    "price": 249.99,
    "embedding": [0.012, 0.054, 0.089, -0.031, 0.067, 0.021, -0.045, 0.098, 0.011, -0.076, 0.033, -0.015, -0.087, 0.059, 0.009, 0.042]
  },
  {
    "name": "Smart Coffee Maker",
    "category": "Home Goods",
    "description": "Programmable coffee machine that can be controlled from your smartphone. Brews up to 12 cups.",
    "price": 129.99,
    "embedding": [0.056, 0.023, 0.011, 0.078, -0.029, 0.041, 0.087, -0.019, 0.065, 0.002, -0.093, 0.018, 0.057, -0.041, 0.022, 0.064]
  },
  {
    "name": "Ultra-light Backpack",
    "category": "Travel",
    "description": "Durable and lightweight backpack with multiple compartments, perfect for hiking or daily commutes.",
    "price": 79.99,
    "embedding": [-0.072, 0.034, 0.019, 0.068, -0.055, 0.081, 0.004, -0.025, 0.039, 0.016, -0.044, 0.062, 0.008, 0.071, -0.013, 0.053]
  }
]);

Setiap dokumen berisi name, category, description, dan price, beserta field penting embedding. Embedding adalah array bernilai tetap yang merepresentasikan makna semantik deskripsi produk. Ukuran array ini, atau dimensionalitas, bergantung pada model yang digunakan untuk membuat embedding. Dalam contoh ini, dimensionalitasnya adalah 128.

Inilah data yang akan kita gunakan untuk membangun indeks vektor guna mengaktifkan pencarian semantik dan rekomendasi produk.

Langkah 3: Buat indeks vektor

Setelah Anda memiliki data dengan embedding dalam sebuah koleksi, langkah selanjutnya adalah membuat indeks vektor. Indeks ini krusial untuk memungkinkan pencarian kemiripan yang cepat dan efisien. Perintah di bawah menggunakan createSearchIndex untuk membangun indeks vektor pada field embedding.

db.products.createSearchIndex({
  "name": "vector_index",
  "definition": {
    "mappings": {
      "dynamic": true,
      "fields": [
        {
          "type": "vector",
          "path": "embedding",
          "numDimensions": 128, 
          "similarity": "cosine"
        }
      ]
    },
  }
});

Memahami konfigurasi

Konfigurasi indeks didefinisikan di dalam array fields pada objek definition. Struktur ini adalah cetak biru bagaimana MongoDB Atlas mengatur vektor Anda untuk pengambilan berkecepatan tinggi.

Parameter inti untuk pengindeksan vektor adalah:

  • path: Menentukan nama pasti field dalam dokumen yang menampung array vektor, yaitu "embedding" pada contoh ini.
  • numDimensions: Ini adalah parameter paling krusial. Harus persis sama dengan jumlah elemen dalam array vektor yang dihasilkan oleh model embedding Anda (mis., 128, 768, 1536).
  • similarity: Mendefinisikan metrik matematis yang digunakan untuk menghitung "kedekatan" antara dua vektor selama pencarian.
    • cosine umumnya direkomendasikan untuk pencarian semantik, karena mengukur sudut antar vektor, berfokus pada arah semantik.
    • Opsi lain termasuk euclidean (jarak garis lurus) dan dotProduct.

Parameter kinerja opsional

Untuk penyetelan kinerja tingkat lanjut, MongoDB Atlas memungkinkan Anda menentukan parameter opsional untuk mengoptimalkan penyimpanan dan memori:

  • quantization: Parameter ini digunakan untuk mengompresi vektor Anda, yang secara signifikan mengurangi ukuran indeks dan jejak memori.
    • scalar atau binary dapat ditentukan untuk mengkuantisasi vektor, menukar sedikit penurunan recall dengan peningkatan besar pada penyimpanan dan kecepatan.

Melakukan Kueri Pencarian Vektor

Setelah indeks dibangun, Anda dapat menggunakan tahap agregasi $vectorSearch untuk melakukan kueri kemiripan.

Mari temukan produk yang paling mirip dengan vektor kueri. Vektor kueri ini biasanya dihasilkan dari input pencarian pengguna.

// A sample query vector, generated from a user's search for "wireless audio device"
const queryVector = [0.11, 0.22, 0.33, ...];

db.products.aggregate([
  {
    "$vectorSearch": {
      "queryVector": queryVector,
      "path": "embedding",
      "numCandidates": 100, // Number of documents to scan
      "limit": 5 // Number of results to return
    }
  },
  {
    "$project": {
      "name": 1,
      "description": 1,
      "_id": 0
    }
  }
]);
  • queryVector: Vektor yang Anda cari.
  • path: Nama field yang berisi vector embeddings.
  • numCandidates: Jumlah dokumen kandidat yang dipindai dalam indeks. Angka yang lebih tinggi meningkatkan akurasi tetapi menambah latensi.
  • limit: Jumlah hasil teratas yang dikembalikan.

Tahap $project bersifat opsional tetapi berguna untuk membentuk keluaran dan mengecualikan data vektor dari hasil.

Praktik Terbaik untuk Pengindeksan Vektor

Saat menyetel indeks vektor Anda untuk kinerja optimal, Anda perlu menyeimbangkan akurasi dan kecepatan. Kuncinya adalah menyesuaikan parameter indeks berdasarkan dataset spesifik dan target kinerja Anda.

Memilih metrik kemiripan yang tepat

Pilihan metrik sangat mendasar karena mendefinisikan seberapa "mirip" dua vektor. Anda dapat merujuk ke dokumen MongoDB untuk mempelajari lebih lanjut tentang field-fieldnya.

  • cosine: Terbaik untuk kemiripan semantik, terutama pada teks. Mengukur sudut antar vektor, mengabaikan panjangnya. Ini krusial untuk model di mana panjang vektor tidak bermakna.
  • euclidean: Mengukur jarak garis lurus antara dua vektor. Gunakan ini jika magnitudo (atau panjang) vektor signifikan terhadap maknanya, seperti pada jenis data tertentu di mana nilai yang lebih besar menandakan fitur yang lebih kuat.
  • dotProduct: Menghitung hasil kali titik dari dua vektor. Metrik ini sering digunakan untuk sistem rekomendasi. Saat vector embeddings dinormalisasi ke panjang 1, dot product secara fungsional setara dengan cosine similarity.

Mengelola dimensi embedding

Parameter dimensions sangat penting dan harus persis sama dengan output model embedding Anda. Kesalahan umum adalah memilih angka yang tidak sesuai dengan keluaran model. Model dengan jumlah dimensi lebih tinggi dapat menangkap lebih banyak detail, tetapi akan menghasilkan indeks yang lebih besar dan kueri yang berpotensi lebih lambat. Selalu periksa dokumentasi model Anda untuk memastikan dimensionalitasnya (mis., text-embedding-ada-002 dari OpenAI menghasilkan 1536 dimensi).

Penyetelan indeks

Parameter numCandidates dan numLists sangat penting untuk menyeimbangkan kecepatan dan akurasi. Aturan praktis yang baik adalah memulai dengan numCandidates rendah dan meningkatkannya sampai Anda mencapai tingkat akurasi yang memadai. Anda juga dapat bereksperimen dengan numLists yang berbeda untuk indeks ivf guna menemukan titik terbaik untuk dataset Anda.

Contoh kasus penggunaan: Membangun sistem rekomendasi sederhana

Mari terapkan konsep-konsep ini pada contoh praktis: sistem rekomendasi produk e-commerce.

Langkah 1: Simpan data produk dengan embedding

Pertama, kita akan menyimpan nama produk, kategori, dan embedding vektor untuk masing-masing. Embedding dapat dihasilkan dari deskripsi atau fitur produk.

db.products.insertMany([
  {
    "name": "Smart Speaker",
    "category": "Electronics",
    "embedding": [0.8, 0.9, 0.1, ...]
  },
  {
    "name": "Wireless Earbuds",
    "category": "Electronics",
    "embedding": [0.7, 0.8, 0.2, ...]
  },
  {
    "name": "Leather Wallet",
    "category": "Fashion",
    "embedding": [0.1, 0.2, 0.9, ...]
  }
]);

Langkah 2: Buat indeks vektor pada embedding

db.products.createSearchIndex({
  "name": "vector_index",
  "definition": {
    "mappings": {
      "fields": [
        {
          "type": "vector",
          "path": "embedding", // The field containing the vectors
          "numDimensions": 128, // The correct field name is 'numDimensions'
          "similarity": "cosine" // The correct field name is 'similarity'
          // Index algorithm (like HNSW) is managed automatically by Atlas
        }
      ]
    }
  }
});

Langkah 3: Kueri untuk produk serupa

Sekarang, mari temukan produk yang mirip dengan Smart Speaker. Kita akan menggunakan embedding untuk Smart Speaker sebagai vektor kueri.

const smartSpeakerEmbedding = [0.8, 0.9, 0.1, ...];

db.products.aggregate([
  {
    "$vectorSearch": {
      "queryVector": smartSpeakerEmbedding,
      "path": "embedding",
      "numCandidates": 50,
      "limit": 3
    }
  },
  {
    "$project": {
      "name": 1,
      "category": 1,
      "_id": 0
    }
  }
]);

Kueri ini akan mengembalikan tiga produk teratas yang embedding vektornya paling dekat dengan embedding Smart Speaker, secara efektif merekomendasikan item serupa, seperti Wireless Earbuds.

Kesimpulan

Kapabilitas vector search MongoDB membuka kemungkinan baru untuk membangun aplikasi yang cerdas dan dipersonalisasi. Dengan mengintegrasikan pengindeksan vektor langsung ke dalam basis data, MongoDB menyederhanakan arsitektur, sehingga lebih mudah mengelola data dan melakukan pencarian kemiripan dengan cepat.

Dengan kekuatan pencarian vektor, Anda dapat melampaui pencocokan kata kunci sederhana dan membuat fitur yang memahami konteks serta makna data Anda. Kami mendorong Anda untuk mulai bereksperimen dengan MongoDB Atlas free tier dan jelajahi bagaimana pengindeksan vektor dapat meningkatkan aplikasi Anda.

FAQs

Apa itu vector embedding dan mengapa diperlukan untuk pencarian vektor?

Vector embedding adalah representasi numerik dari data seperti teks atau gambar. Ini diperlukan untuk pencarian vektor karena memungkinkan basis data mengukur kemiripan semantik antar item dengan menghitung jarak antara vektor mereka, melampaui sekadar pencocokan kata kunci.

Apakah saya memerlukan versi MongoDB tertentu untuk menggunakan Vector Search?

Ya. Vector search adalah fitur terintegrasi dari MongoDB Atlas, versi MongoDB yang dihosting di cloud. Fitur ini tidak tersedia di edisi komunitas atau on-premise dari basis data tersebut.

Apakah saya perlu menghasilkan vector embedding sendiri?

Ya, Anda perlu menghasilkan vector embedding untuk data Anda sebelum dapat menyimpannya di MongoDB dan membuat indeks vektor. MongoDB tidak menghasilkan embedding tersebut untuk Anda. Biasanya Anda akan menggunakan layanan pihak ketiga atau model pralatih dari platform seperti OpenAI, Hugging Face, atau Google AI untuk mengonversi teks, gambar, atau data lain Anda menjadi vektor numerik.

Bisakah saya menggabungkan pencarian vektor dengan kueri MongoDB lainnya?

Ya, bisa. Vector search adalah tahap agregasi ($vectorSearch), yang berarti Anda dapat menggunakannya dalam pipeline agregasi MongoDB yang lebih besar. Ini memungkinkan Anda menggabungkan pencarian vektor dengan tahap kuat lainnya seperti $match, $project, $limit, dan $lookup untuk membuat kueri canggih yang melakukan penyaringan, pengurutan, dan pengayaan data dalam satu operasi. Kapabilitas ini dikenal sebagai hybrid search dan esensial untuk membangun aplikasi dunia nyata.

Apa perbedaan antara tipe indeks IVF dan HNSW?

Baik IVF maupun HNSW adalah algoritma yang digunakan untuk pencarian approximate nearest neighbor (ANN). Perbedaan utama terletak pada bagaimana mereka menyusun data.

Karen Zhang

Penulis

Karen Zhang

Karen adalah Data Engineer dengan passion dalam membangun platform data yang dapat diskalakan. Ia berpengalaman dalam otomasi infrastruktur dengan Terraform dan antusias membagikan pembelajarannya melalui posting blog dan tutorial. Karen juga seorang penggerak komunitas, dan ia bersemangat membina koneksi di antara para profesional data.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Spaghetti Plot dan Jalur Badai