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.
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]
}
]);Didukung oleh
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.
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 $vectorSearchuntuk 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
}
}
]);Didukung oleh
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.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
}
]
}
}
});Didukung oleh
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.
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 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.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
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:
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.
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.
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:
Parameter kinerja opsional
Untuk penyetelan kinerja tingkat lanjut, MongoDB Atlas memungkinkan Anda menentukan parameter opsional untuk mengoptimalkan penyimpanan dan memori:
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.
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.
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.
Langkah 2: Buat indeks vektor pada embedding
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.
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.