Lewati ke konten utama

Cara Menyimpan dan Melakukan Query Embeddings di MongoDB

Pelajari cara menyimpan, mengindeks, dan melakukan query embeddings di MongoDB menggunakan Atlas Vector Search.
· 8 mnt Baca

Jelajahi bersama AI

Kemunculan LLM dan pencarian semantik telah mengubah secara mendasar cara kita membangun sistem pencarian, rekomendasi, dan pengambilan data. Pencarian berbasis kata kunci tradisional—baik melalui SQL LIKE, indeks terbalik Lucene, atau indeks teks penuh—semakin tidak memadai ketika pengguna mengharapkan pemahaman bahasa alami.

Di sinilah embedding dan database vektor berperan.

MongoDB berkembang pesat di ranah ini dengan Atlas Vector Search, memberi developer satu basis data untuk dokumen + metadata + vektor—semuanya dalam satu API. Dalam panduan ini, kita akan membahas:

  • Apa itu MongoDB.
  • Apa itu query embedding dan mengapa penting.
  • Kapan Anda sebaiknya menggunakan embedding.
  • Cara menyimpan embedding di MongoDB.
  • Cara membuat dan melakukan query dengan Python.

Tutorial ini bersifat praktis dan siap diintegrasikan ke dalam retrieval-augmented generation (RAG), pencarian kemiripan, atau pipeline rekomendasi Anda.

Apa itu MongoDB?

MongoDB adalah basis data NoSQL berorientasi dokumen yang menyimpan data dalam dokumen BSON yang fleksibel—BSON adalah JavaScript Object Notation (JSON) yang dikodekan biner—notasi objek tekstual yang banyak digunakan untuk mentransmisikan dan menyimpan data di aplikasi berbasis web. Tidak seperti basis data relasional yang kaku, MongoDB membuat evolusi skema menjadi sederhana dan menyediakan:

  • Skalabilitas horizontal (sharding).
  • Kerangka agregasi yang kaya.
  • Pencarian teks penuh.
  • Pencarian vektor.
  • Koleksi runtun waktu.
  • Fleksibilitas skema.

MongoDB Atlas—layanan cloud terkelola sepenuhnya—memperluas ini dengan:

  • Atlas Search (dibangun di atas Lucene).
  • Atlas Vector Search (pencarian semantik melalui pengindeksan HNSW).
  • Skalasi otomatis, pencadangan, keamanan, dan pemantauan.

MongoDB menjadi pilihan kuat untuk beban kerja AI karena vektor sering hidup berdampingan dengan metadata, dan MongoDB Atlas menggabungkan semuanya dalam satu sistem.

Apa Itu Embedding dan Mengapa Kita Menggunakan Query Embedding?

Saat Anda bekerja dengan pencarian atau pengambilan data dalam aplikasi AI, salah satu konsep pertama yang akan Anda temui adalah embedding. 

Embedding pada dasarnya adalah representasi numerik, daftar panjang nilai floating-point, yang menangkap makna suatu potongan teks (atau gambar, audio, dll.). Alih-alih melihat kata-kata persisnya, embedding memetakan teks ke ruang vektor di mana ide-ide serupa berakhir berdekatan. Misalnya, pertimbangkan tiga pernyataan pengguna berbeda:

  • Masalah penagihan
  • Kesalahan pembayaran
  • Gaji belum masuk

Walaupun katanya berbeda, ketiganya menggambarkan masalah finansial. Model embedding yang baik menempatkan teks-teks ini berdekatan di ruang vektor, sehingga Anda bisa mengambilnya berdasarkan makna, bukan kata kunci.

Hal ini menjadi sangat penting ketika pengguna melakukan pencarian. Teks yang mereka ketik—“Mengapa gaji saya terlambat?”—juga diubah menjadi embedding. Vektor baru ini disebut query embedding. Anda kemudian membandingkan vektor kueri ini dengan semua embedding yang tersimpan untuk menemukan dokumen yang secara semantik serupa. Semakin dekat vektornya, semakin relevan hasilnya.

MongoDB Atlas membuat seluruh alur kerja ini sangat mudah dengan Atlas Vector Search. Setelah menyimpan dokumen dan embedding-nya dalam koleksi MongoDB, Atlas membuat indeks vektor (menggunakan HNSW di balik layar) yang dapat dengan cepat mengambil dokumen serupa dalam skala besar. Misalnya, jika Anda menyimpan artikel bantuan beserta embedding-nya, kueri seperti…

query = "Why isn't my salary showing up this month?"
query_vec = get_embedding(query) # Explained in below examples

…dapat digunakan langsung di MongoDB:

results = collection.aggregate([
    {
        "$vectorSearch": {
            "path": "embedding",
            "queryVector": query_vec,
            "index": "vector_index",
            "limit": 3
        }
    }
])

MongoDB akan otomatis mengembalikan 3 artikel bantuan teratas yang embedding-nya paling dekat dengan kueri—tanpa perlu pencocokan kata kunci atau penskoran manual.

Inilah kekuatan embedding di MongoDB Atlas: Anda menyimpan makna, bukan sekadar teks, dan Anda melakukan query berdasarkan niat, bukan hanya kata. Pergeseran ini menjadi alasan embedding menjadi blok bangunan inti untuk pencarian semantik, sistem RAG, asisten AI, dan basis pengetahuan cerdas.

Kapan Menggunakan Query Embedding

Gunakan embedding ketika Anda menginginkan kemiripan semantik, seperti:

Retrieval-augmented generation (RAG)

  • Memberi LLM Anda konteks yang akurat dari basis pengetahuan Anda
  • Menggantikan pencarian kata kunci yang rapuh

Chatbot yang memerlukan pemahaman mendalam

  • Portal helpdesk
  • Dukungan pelanggan

Rekomendasi produk

  • “item serupa dengan item ini”

Deteksi dokumen atau duplikat

  • Clustering
  • Pengelompokan topik

Saat pencarian kata kunci gagal

  • Kueri seperti “keterlambatan masuk gaji” vs. “masalah pemrosesan pembayaran”

Jangan gunakan embedding ketika:

  • Anda memerlukan kecocokan persis (ID, nomor invoice).
  • Dataset Anda sangat kecil (pencarian sederhana sudah cukup).
  • Anda butuh penyaringan/perbandingan numerik (itu ditangani oleh metadata).

Cara Menyimpan Embedding di MongoDB

Keunggulan MongoDB adalah embedding secara alami pas di dalam dokumen. Anda cukup menyimpannya sebagai array float.

Contoh skema dokumen

Berikut struktur dokumen yang umum:

{
  "_id": "uuid-123",
  "text": "This is a sample document about MongoDB vector search.",
  "embedding": [0.123, -0.241, 0.998, ...],
  "tags": ["mongodb", "vector", "ai"],
  "createdAt": "2025-01-01T10:20:00Z"
}

Hal-hal penting yang perlu diingat:

  • Setiap embedding dalam satu koleksi harus memiliki dimensionalitas yang sama.
  • Embedding idealnya disimpan sebagai float32 (MongoDB secara internal mengonversi ke float64).
  • Jika dokumen Anda panjang, potong menjadi chunk sebelum membuat embedding.
  • Simpan metadata secara terpisah—tag, kategori, URL, stempel waktu, dll. Ini membuat pencarian hibrida menjadi kuat.

Membuat Indeks Vektor di MongoDB (Langkah Kritis)

Sebelum menyimpan atau melakukan query embedding, Anda harus membuat indeks pencarian vektor di MongoDB Atlas.

Di MongoDB Atlas, buka: Atlas → Database → Collections → Search → Create Search Index

Gunakan definisi seperti:

{
  "fields": [
    {
      "type": "vector",
      "path": "embedding",
      "numDimensions": 1536,
      "similarity": "cosine"
    }
  ]
}

Ini memberi tahu MongoDB:

  • Field embedding berisi vektor.
  • Setiap vektor memiliki 1536 dimensi.
  • Gunakan cosine similarity untuk perankingan.

Indeks ini menjalankan semua kueri pencarian vektor.

MongoDB menyertakan kemampuan pencarian vektor native dengan dukungan untuk:

  • Cosine similarity.
  • Jarak Euclidean.
  • Skor dotProduct.

Pilih berdasarkan model embedding Anda—tetapi bagaimana kita tahu harus memilih yang mana? Mari kita bahas lebih dalam.

Cosine similarity

Apa yang diukur

Kesejajaran dua vektor—yakni sudut di antara keduanya. Mengabaikan magnitudo dan hanya fokus pada arah.

Intuisi

  • Jika dua vektor mengarah sama → kemiripan mendekati 1
  • Arah berlawanan → –1
  • Ortogonal (tidak terkait) → 0

Kapan digunakan

Gunakan cosine ketika magnitudo tidak penting, hanya pola atau konsep yang diekspresikan.

Penggunaan umum

  • Embedding teks/NLP
  • Pencarian semantik
  • Sistem rekomendasi berbasis makna, bukan skala

Cosine adalah default teraman untuk sebagian besar model embedding.

Jarak Euclidean

Apa yang diukur

Mengukur jarak garis lurus antara dua vektor dalam ruang.

Intuisi

  • Jarak kecil → vektor serupa
  • Jarak besar → vektor berjauhan

Kapan digunakan

Gunakan Euclidean ketika nilai absolut dan magnitudo penting, bukan hanya arah.

Penggunaan umum

  • Embedding gambar
  • Pengukuran fisik/data sensor
  • Algoritme clustering seperti K-means (yang secara internal menggunakan Euclidean)

Jika data Anda secara alami berada dalam ruang geometris (misalnya intensitas piksel), Euclidean sering lebih masuk akal.

Dot product

Apa yang diukur

Mengukur kombinasi kemiripan dan magnitudo. 

Secara matematis: dot(u, v) = |u| × |v| × cos(θ)

Intuisi

  • Magnitudo LEBIH BESAR DAN selaras → skor lebih besar
  • Sensitif terhadap panjang vektor
  • Tidak ternormalisasi secara otomatis

Kapan digunakan

Gunakan dot product ketika Anda ingin vektor yang lebih panjang memiliki pengaruh lebih besar atau ketika model embedding dilatih dengan mempertimbangkan dot product.

Penggunaan umum

  • Embedding model bahasa besar yang mengasumsikan penilaian inner product scoring
  • Lapisan kemiripan jaringan saraf
  • Model rekomendasi di mana “kekuatan” fitur bermakna

Aturan praktis cepat

Metrik

Cocok untuk

Hindari ketika

Cosine

Teks, pencarian semantik, embedding umum

Magnitudo penting

Euclidean

Gambar, fitur geometris, clustering

Data memiliki penskalaan sewenang-wenang

Dot product

Model yang dilatih dengan inner product, recsys

Magnitudo mendistorsi kemiripan

Membuat, Menyimpan, dan Melakukan Query Embedding di MongoDB (Tutorial Python)

Mari kita jalani langkahnya seolah-olah kita sedang membangun sistem nyata.

Instal dependensi

pip install pymongo openai

Buat embedding

Menggunakan OpenAI (ganti dengan penyedia embedding apa pun yang Anda pilih):

import os
from openai import OpenAI

os.environ["OPENAI_API_KEY"] = "your_api_key_here"
client = OpenAI()

def get_embedding(text: str):
    response = client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return response.data[0].embedding

Sambungkan ke MongoDB dan masukkan dokumen

Menggunakan OpenAI (ganti dengan penyedia embedding apa pun yang Anda pilih):

from pymongo import MongoClient
import uuid

mongo = MongoClient("<MONGODB_ATLAS_URI>")
db = mongo["vector_db"]
collection = db["documents"]

text = "This is a sample document about MongoDB vector search."
embedding = get_embedding(text)

document = {
    "_id": str(uuid.uuid4()),
    "text": text,
    "embedding": embedding,
    "tags": ["mongodb", "search"],
}

collection.insert_one(document)
print("Document inserted successfully!")

Pada titik ini, data Anda siap untuk pencarian semantik.

Melakukan query embedding di MongoDB

Sekarang bagian menariknya: mengambil dokumen serupa menggunakan kueri vektor. MongoDB menggunakan $vectorSearch dalam pipeline agregasi.

Buat vektor kueri

from pymongo import MongoClient
query = "How does MongoDB handle semantic search?"
query_vec = get_embedding(query)

Lakukan pencarian vektor (query embedding)

results = collection.aggregate([
    {
        "$vectorSearch": {
            "index": "vector_index",
            "path": "embedding",
            "queryVector": query_vec,
            "numCandidates": 100,
            "limit": 5,
            "similarity": "cosine"
        }
    },
    {
        "$project": {
            "text": 1,
            "score": {"$meta": "vectorSearchScore"}
        }
    }
])

for r in results:
    print(r)

Ini mengembalikan lima dokumen yang paling mirip secara semantik.

Ini sangat berguna untuk pipeline RAG di mana Anda menginginkan pencarian semantik.

Penjelasan langkah demi langkah dari kueri di atas

$vectorSearch → Menemukan dokumen yang field embedding-nya paling dekat dengan queryVector menggunakan metrik kemiripan yang ditentukan

numCandidates → Berapa banyak kandidat potensial yang sebaiknya dipertimbangkan mesin sebelum memilih hasil teratas

limit → Jumlah hasil akhir yang serupa untuk dikembalikan

$project → Mengembalikan teks asli plus field khusus bernama score

Apa itu field score?

MongoDB Atlas Vector Search mengembalikan field metadata khusus, "score": {"$meta": "vectorSearchScore"}, yang memberi tahu Anda seberapa mirip vektor tersimpan dengan vektor kueri Anda.

Makna skor bergantung pada metrik kemiripan yang Anda pilih, seperti dijelaskan di bawah ini:

Metrik kemiripan

Makna skor

Skor lebih tinggi = lebih mirip?

Kisaran skor

cosine

Kemiripan sudut antar vektor

Ya

–1 hingga +1

euclidean

Jarak L2 negatif

Tidak—semakin dekat ke 0 = lebih mirip

–∞ hingga 0

dotProduct

Kesejajaran magnitudo vektor

Ya

–∞ hingga +∞

Praktik Terbaik

  • Potong dokumen panjang (300–500 token per chunk): Relevansi lebih baik + menghindari embedding blob panjang
  • Simpan metadata terpisah: Membantu penyaringan dan perankingan
  • Batch pembuatan embedding: Meningkatkan throughput dan menurunkan biaya model
  • Gunakan embedding float32 di model Anda: MongoDB secara internal menggunakan float64 tetapi menerima array float32
  • Indeks hanya field vektor: Field tambahan dalam indeks meningkatkan memori dan latensi

Kesalahan Umum yang Perlu Dihindari

Masalah

Mengapa terjadi

Dimensi tidak cocok

Dim vektor kueri ≠ dim indeks

Hasil tidak relevan

Menggunakan model berbeda untuk penyimpanan vs kueri

Pencarian lambat

numCandidates terlalu banyak atau kebutuhan klaster besar

Dokumen terlalu besar

Batas dokumen 16MB

Metrik kemiripan salah

Model dilatih untuk cosine tetapi menggunakan dot product

Penutup

Embedding dan pencarian semantik kini menjadi fondasi bagi produk AI modern. Baik Anda membangun chatbot, pipeline RAG, mesin rekomendasi, atau lapisan pencarian cerdas, Anda memerlukan cara andal untuk menyimpan vektor dan melakukan query secara efisien.

MongoDB memberi Anda platform terpadu di mana:

  • Teks Anda tersimpan.
  • Metadata Anda tersimpan.
  • Embedding Anda tersimpan.
  • Pencarian vektor Anda berjalan.
  • Semuanya diskalakan bersama.

Ini menghindari kompleksitas mengelola basis data terpisah dan memungkinkan Anda fokus membangun kapabilitas produk, bukan infrastruktur.

FAQs

Apakah saya memerlukan basis data vektor terpisah jika menggunakan MongoDB untuk embedding?

Tidak. MongoDB Atlas Vector Search sudah tersemat, sehingga Anda dapat menyimpan dokumen, metadata, dan vektor di tempat yang sama tanpa menggunakan basis data vektor terpisah seperti Pinecone atau Milvus.

Dimensionalitas embedding apa yang harus saya gunakan di MongoDB?

Gunakan dimensionalitas yang disediakan oleh model embedding Anda (misalnya, 768 atau 1536). Semua dokumen dalam satu koleksi harus menggunakan dimensi yang sama dengan indeks vektor.

Dapatkah MongoDB melakukan pencarian hibrida (metadata + pencarian vektor)?

Anda dapat melakukan penyaringan dengan $match lalu menerapkan $vectorSearch dalam pipeline agregasi yang sama—ideal untuk RAG dan sistem rekomendasi.

Apakah MongoDB cocok untuk beban kerja pencarian vektor skala besar?

Ya. MongoDB menggunakan pengindeksan berbasis HNSW di Atlas Search, yang dapat diskalakan dengan baik untuk jutaan dokumen. Throughput bergantung pada ukuran indeks, tier klaster, dan pola beban kerja.

Bisakah saya menggunakan model embedding apa pun dengan MongoDB?

Tentu. MongoDB bersifat model-agnostik. Anda dapat menggunakan OpenAI, HuggingFace, Cohere, model lokal, atau embedding kustom—asalkan dimensinya cocok dengan indeks.

Nilesh Soni

Penulis

Nilesh Soni

Staff Software Engineer @ Uber

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai