Vector database adalah jenis basis data yang membantu aplikasi melakukan pencarian berbasis makna, bukan sekadar mencocokkan kata. Bayangkan pengguna mengetik “laptop murah untuk kuliah” di toko online Anda. Produk bernama “notebook hemat untuk pelajar” sebenarnya sangat relevan. Namun, pencarian kata kunci biasa tidak menemukannya karena tidak ada kata yang sama persis.
Masalah seperti ini muncul di hampir semua aplikasi yang punya fitur cari. Pengguna menulis dengan bahasa sehari-hari, sedangkan konten ditulis dengan istilah berbeda. Akibatnya, hasil pencarian terasa kosong atau tidak nyambung, dan pengguna menyimpulkan bahwa aplikasinya buruk.
Artikel ini menjelaskan apa itu vector database dan embedding, cara kerja pencarian berbasis makna dalam lima langkah, contoh kode dengan PostgreSQL dan Node.js, serta cara memilih solusi yang tepat. Selain itu, Anda akan mempelajari tantangan yang sering muncul di dunia nyata.
Daftar Isi
- Mengapa pencarian berbasis makna dibutuhkan
- Apa itu vector database dan embedding
- Cara kerja vector database dalam 5 langkah
- Contoh kode dengan pgvector dan Node.js
- Memilih vector database
- Pencarian exact dan approximate
- Kasus penggunaan pencarian berbasis makna
- Tantangan dan kesalahan umum
- Daftar periksa
- Kesimpulan
Mengapa Pencarian Berbasis Makna Dibutuhkan Aplikasi Modern?
Pencarian kata kunci bekerja dengan mencocokkan teks. Perintah SQL seperti LIKE '%laptop murah%' hanya menemukan baris yang mengandung frasa itu secara persis. Cara ini cepat dan sederhana, tetapi kaku. Sinonim, salah ketik, bahasa campur, dan kalimat yang berbeda susunan semuanya lolos dari pencarian.
Pencarian berbasis makna menjawab masalah itu. Alih-alih mencocokkan kata, sistem membandingkan arti dari kueri dan konten. Dengan begitu, “cara mengganti kata sandi” dan “lupa password, bagaimana mengatur ulang?” dianggap berdekatan, walaupun hampir tidak ada kata yang sama.
Kebutuhan ini makin penting karena aplikasi sekarang menyimpan banyak teks tak terstruktur, seperti artikel bantuan, ulasan, dokumen, dan percakapan. Pengguna pun terbiasa bertanya dengan kalimat bebas.
Apa Itu Vector Database dan Embedding?
Untuk memahami vector database, mulailah dari embedding. Embedding adalah representasi teks dalam bentuk deretan angka, yang disebut vektor. Model khusus mengubah kalimat menjadi vektor, dan model itu dilatih agar teks bermakna mirip menghasilkan vektor yang berdekatan.
Anda bisa membayangkannya seperti peta. Setiap kalimat adalah satu titik di peta. Kalimat dengan makna serupa berdiri berdekatan, sedangkan kalimat yang tidak berhubungan berjauhan. Peta itu punya ratusan hingga ribuan sumbu, bukan hanya dua, sehingga disebut berdimensi tinggi.
Vector database adalah penyimpanan yang dirancang untuk menyimpan vektor tersebut dan mencari vektor terdekat dengan cepat. Ukuran kedekatan yang umum dipakai adalah jarak kosinus, yang menilai seberapa searah dua vektor. Semakin kecil jaraknya, semakin mirip maknanya.
Cara Kerja Vector Database dalam Pencarian Berbasis Makna
Alur lengkapnya bisa dirangkum menjadi lima langkah.
1. Siapkan dan Pecah Dokumen
Dokumen panjang sebaiknya dipecah menjadi potongan (chunk) yang lebih kecil, misalnya satu paragraf atau satu bagian. Alasannya, satu vektor yang mewakili dokumen panjang akan kehilangan detail. Potongan yang terlalu kecil juga kehilangan konteks, jadi cari ukuran yang seimbang.
2. Ubah Potongan Menjadi Embedding
Setiap potongan dikirim ke model embedding, baik lewat layanan API maupun model yang dijalankan sendiri. Hasilnya berupa vektor dengan jumlah dimensi tetap, misalnya 384 atau 1.536, tergantung modelnya.
3. Simpan Vektor di Vector Database
Vektor disimpan bersama teks asli dan metadata, seperti judul, kategori, atau tanggal. Metadata berguna untuk penyaringan, misalnya hanya mencari di kategori tertentu.
4. Ubah Kueri Pengguna Menjadi Embedding
Saat pengguna mencari, kalimat mereka diubah menjadi vektor memakai model yang sama. Ini penting. Kueri dan dokumen harus dikodekan oleh model yang sama agar berada di peta yang sama.
5. Cari Tetangga Terdekat dan Tampilkan Hasil
Database mencari vektor yang paling dekat dengan vektor kueri, lalu mengembalikan potongan teks yang bersesuaian. Teknik ini disebut nearest neighbor search. Aplikasi lalu menampilkan hasilnya, kadang setelah diurutkan ulang atau digabung dengan pencarian kata kunci.

Contoh Kode: Pencarian Berbasis Makna dengan pgvector dan Node.js
Anda tidak harus membeli layanan khusus untuk mencoba konsep ini. pgvector adalah ekstensi open source yang menambahkan kemampuan vektor ke PostgreSQL. Menurut dokumentasi pgvector di GitHub, ekstensi ini mendukung pencarian tetangga terdekat secara exact maupun approximate, serta tetap membawa fitur PostgreSQL seperti JOIN dan ACID.
Pertama, siapkan tabel dan indeksnya. Sesuaikan jumlah dimensi dengan model embedding yang Anda pakai.
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE artikel (
id BIGSERIAL PRIMARY KEY,
judul TEXT NOT NULL,
isi TEXT NOT NULL,
embedding VECTOR(384) -- sesuaikan dengan dimensi model Anda
);
-- Indeks approximate untuk jarak kosinus
CREATE INDEX ON artikel USING hnsw (embedding vector_cosine_ops);
Kedua, tulis fungsi di Node.js untuk menyimpan artikel dan mencarinya berdasarkan makna. Fungsi buatEmbedding adalah tempat Anda memanggil model pilihan, dan isinya tidak saya tentukan agar contoh ini tidak terikat pada satu penyedia.
import pg from 'pg';
const db = new pg.Pool({ connectionString: process.env.DATABASE_URL });
// Panggil model embedding pilihan Anda, lalu kembalikan array angka
async function buatEmbedding(teks) {
// ...
}
export async function simpanArtikel(judul, isi) {
const vektor = await buatEmbedding(`${judul}\n${isi}`);
await db.query(
'INSERT INTO artikel (judul, isi, embedding) VALUES ($1, $2, $3::vector)',
[judul, isi, JSON.stringify(vektor)]
); } export async function cariBerdasarkanMakna(kueri, batas = 5) { const vektor = await buatEmbedding(kueri); const { rows } = await db.query( `SELECT id, judul, 1 – (embedding <=> $1::vector) AS kemiripan FROM artikel ORDER BY embedding <=> $1::vector LIMIT $2`, [JSON.stringify(vektor), batas] ); return rows; }
Operator <=> menghitung jarak kosinus. Dokumentasi pgvector menyarankan memakai 1 - jarak untuk mendapatkan kemiripan kosinus. Nilai yang makin mendekati 1 berarti maknanya makin dekat.
Perhatikan juga bahwa parameter dikirim lewat $1, $2, dan seterusnya, bukan digabung ke dalam teks query. Cara ini mencegah SQL injection. Selain itu, simpan kredensial database dan kunci API di file .env, bukan di kode. Panduannya ada di Environment Variable: Cara Pakai .env di Node.js.
Memilih Vector Database: Ekstensi atau Produk Khusus?
Ada dua jalur besar. Pertama, memakai ekstensi pada database yang sudah Anda punya, seperti pgvector di PostgreSQL. Kedua, memakai vector database khusus, baik yang dikelola sendiri maupun layanan terkelola. Tabel berikut membantu Anda menimbangnya.
| Aspek | Ekstensi (misalnya pgvector) | Vector Database Khusus |
|---|---|---|
| Infrastruktur | Memakai database yang sudah ada | Layanan atau server tambahan |
| Data dan relasi | Vektor dan data biasa dalam satu tempat, bisa di-JOIN | Data harus disinkronkan dengan database utama |
| Cocok untuk | Proyek kecil sampai menengah, tim yang sudah memakai PostgreSQL | Skala sangat besar atau kebutuhan fitur khusus |
| Kompleksitas | Lebih rendah di awal | Perlu mempelajari alat baru |
| Risiko | Batas skala dan pengaturan indeks perlu dipahami | Biaya dan ketergantungan pada penyedia |
Untuk sebagian besar proyek baru, memulai dengan ekstensi pada database yang sudah ada adalah langkah yang masuk akal. Anda bisa berpindah ke solusi khusus nanti jika kebutuhan skala memang menuntutnya.
Pencarian Exact dan Approximate: Trade-off Kecepatan dan Akurasi
Secara bawaan, pgvector melakukan pencarian exact, yaitu membandingkan kueri dengan semua vektor sehingga hasilnya sempurna. Pada data kecil, cara ini cukup cepat. Namun, pada jutaan vektor, perbandingan satu per satu menjadi lambat.
Karena itu muncul indeks approximate. Indeks ini mengorbankan sedikit akurasi demi kecepatan. Dokumentasi pgvector menyebut dua jenis utama. HNSW membangun graf berlapis dengan performa kueri yang lebih baik, tetapi membangunnya lebih lambat dan memakai lebih banyak memori. IVFFlat membagi vektor ke dalam kelompok dan hanya mencari di sebagian kelompok yang paling dekat.
Dengan indeks approximate, hasil bisa sedikit berbeda dibanding pencarian exact. Pastikan perbedaan itu masih bisa diterima untuk kasus Anda, dan uji kualitas hasilnya, bukan hanya kecepatannya.
Kasus Penggunaan Pencarian Berbasis Makna
- Pencarian produk atau artikel. Pengguna menemukan konten walaupun kata yang dipakai berbeda.
- Pusat bantuan dan FAQ. Pertanyaan pengguna dicocokkan dengan jawaban yang paling relevan.
- Rekomendasi konten. Sistem menyarankan item yang maknanya mirip dengan yang sedang dibaca.
- Chatbot berbasis dokumen. Potongan dokumen yang relevan diambil terlebih dahulu, lalu diberikan ke model bahasa untuk menjawab. Pola ini sering disebut retrieval-augmented generation.
- Deteksi duplikat. Dua teks yang maknanya sama bisa ditemukan walaupun susunan katanya berbeda.
Dalam banyak aplikasi, pendekatan terbaik adalah menggabungkan kedua cara. Pencarian kata kunci unggul untuk istilah yang persis, seperti kode produk atau nama orang. Pencarian berbasis makna unggul untuk pertanyaan bebas. Dokumentasi pgvector sendiri menyebut penggunaannya bersama full-text search untuk pencarian hibrida. Jika layanan pencarian Anda diakses lewat API, desain endpoint-nya bisa mengacu ke REST API vs GraphQL: Mana yang Lebih Cocok untuk Proyek Web Modern?.
Tantangan dan Kesalahan Umum pada Vector Database
- Memakai model embedding yang berbeda. Vektor dari model berbeda tidak sebanding. Jika Anda mengganti model, semua data harus dibuat ulang embedding-nya.
- Memotong dokumen secara sembarangan. Potongan yang terlalu besar kehilangan detail, sedangkan yang terlalu kecil kehilangan konteks.
- Lupa menghapus vektor saat dokumen dihapus. Hasil pencarian bisa menampilkan konten yang sudah tidak ada. Pertimbangkan strategi penghapusan data seperti dibahas di Soft Delete vs Hard Delete: Strategi Penghapusan Data dalam Aplikasi.
- Mengabaikan biaya dan batas API. Membuat embedding untuk ribuan dokumen memanggil API berulang kali. Batasi frekuensi permintaan seperti pada Rate Limiting pada Backend: Cara Membatasi Permintaan Tanpa Mengganggu Pengguna.
- Memproses batch tanpa penanganan gagal. Satu permintaan yang gagal tidak boleh menggagalkan seluruh proses. Pelajari polanya di Promise.allSettled vs Promise.all: 5 Perbedaan dan Contoh Kode.
- Mengirim data sensitif ke layanan pihak ketiga. Periksa kebijakan penyedia dan kebutuhan privasi data Anda sebelum mengirim teks untuk dibuatkan embedding.
- Tidak mengevaluasi kualitas hasil. Siapkan kumpulan kueri uji dan periksa apakah hasilnya masuk akal bagi pengguna.

Daftar Periksa Vector Database sebelum Rilis
- Apakah dokumen sudah dipecah dengan ukuran potongan yang masuk akal?
- Apakah kueri dan dokumen memakai model embedding yang sama?
- Apakah jumlah dimensi kolom vektor sesuai dengan model?
- Apakah indeks sesuai ukuran data, dan hasilnya sudah diuji kualitasnya?
- Apakah ada proses menghapus atau memperbarui vektor saat dokumen berubah?
- Apakah kunci API disimpan di variabel lingkungan?
- Apakah permintaan ke API embedding dibatasi dan ditangani saat gagal?
- Apakah pencarian kata kunci tetap tersedia untuk istilah yang persis?
Kesimpulan: Vector Database Membuat Pencarian Lebih Paham Maksud Pengguna
Vector database membantu aplikasi memahami pencarian berbasis makna dengan menyimpan teks sebagai vektor dan mencari yang paling dekat. Prosesnya terdiri dari memecah dokumen, membuat embedding, menyimpannya, mengubah kueri menjadi vektor, lalu mencari tetangga terdekat. Hasilnya, pengguna menemukan yang mereka maksud, bukan hanya yang mereka ketik.
Untuk memulai, Anda tidak perlu infrastruktur rumit. Ekstensi seperti pgvector pada PostgreSQL sudah cukup untuk banyak proyek. Setelah itu, perhatikan kualitas potongan dokumen, konsistensi model embedding, dan pengelolaan biaya. Dengan fondasi yang benar, fitur cari di aplikasi Anda bisa naik kelas tanpa mengorbankan keandalan.
Artikel Lainnya di NgodingDaily
Lanjutkan belajar dengan topik lain yang saling melengkapi:
- Environment Variable: Cara Pakai .env di Node.js
- Rate Limiting pada Backend: Cara Membatasi Permintaan Tanpa Mengganggu Pengguna
- Soft Delete vs Hard Delete: Strategi Penghapusan Data dalam Aplikasi
- Promise.allSettled vs Promise.all: 5 Perbedaan dan Contoh Kode
- REST API vs GraphQL: Mana yang Lebih Cocok untuk Proyek Web Modern?