Milvus adalah basis data vektor terdistribusi yang memisahkan peran menerima permintaan, mengelola metadata, mengeksekusi pencarian, dan menyimpan data kepada komponen yang berbeda. Topik ini memperkenalkan arsitekturnya pada tingkat pengenalan, kemudian membahas collection beserta schema dan partisinya, lalu menutup dengan pemilihan tipe indeks. Contoh menggunakan klien MilvusClient dan tidak dijalankan karena server Milvus tidak tersedia di sandbox.
Arsitektur terdistribusi Milvus#
Milvus menyusun layanannya di atas komponen yang dapat diperbesar secara terpisah, berbeda dengan pgvector yang berjalan di dalam satu proses Postgres. Versi terkininya adalah 3.0 yang dirilis sebagai GA pada Agustus 2026, sedangkan lini 2.6 masih dipelihara sebagai LTS. Empat kelompok komponen membagi pekerjaannya sebagai berikut.
- Access layer berupa proxy sebagai pintu masuk seluruh permintaan, sehingga aplikasi selalu berbicara dengan satu titik masuk yang sama.
- Coordinator mengatur metadata dan pembagian pekerjaan antar komponen, termasuk menentukan node yang menangani bagian data tertentu.
- Worker node menjalankan pekerjaan beratnya, yaitu query node mengeksekusi pencarian, data node menulis data yang masuk, dan index node membangun indeks.
- Lapisan penyimpanan menampung data dan koordinasinya, yaitu penyimpanan objek untuk berkas data dan log, etcd untuk metadata, serta Pulsar untuk pesan antar komponen.
Pembagian peran ini membuat kapasitas pencarian, penulisan, dan penyimpanan dapat ditambah satu per satu pada penerapan berskala besar. Klien MilvusClient menyembunyikan seluruh komponen tersebut di belakang satu URI, sehingga contoh pada topik ini tampak sederhana meskipun di belakangnya berdiri infrastruktur terdistribusi. Pemahaman komponen tetap diperlukan saat membaca konfigurasi penerapan atau mendiagnosis node yang jenuh.
Bagi pengguna klien, sifat terdistribusi ini hampir tidak terlihat. URI yang sama digunakan baik pada penerapan tunggal maupun klaster, dan pola pemanggilannya tidak berubah. Perbedaannya baru terasa pada operasi, misalnya memantau node yang menjalankan pencarian dan menambah kapasitas saat data bertambah.
Collection, partisi, dan schema#
Collection pada Milvus sejajar dengan tabel pada basis data relasional. Schema collection menetapkan primary key, yang dapat dihasilkan otomatis melalui auto_id, beserta field vektor berdimensi tetap. Pada tingkat pengenalan, pemanggilan create_collection cukup menyebut nama collection, dimensi vektornya, dan metrik jaraknya, kemudian data diisi dengan insert.
# tidak-dijalankan
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
client.create_collection(
collection_name="docs",
dimension=384,
metric_type="COSINE",
)
client.insert(
collection_name="docs",
data=[
{"id": 1, "vector": [...], "kategori": "panduan"},
{"id": 2, "vector": [...], "kategori": "arsip"},
],
)Metrik yang tersedia meliputi COSINE untuk kesamaan arah, L2 untuk jarak Euclidean, dan IP untuk perkalian titik. Pilihannya mengikuti model embedding yang digunakan, sebab metrik yang tidak cocok dengan cara pelatihan model membuat peringkat hasil tidak bermakna. Dimensi 384 pada contoh mengikuti model seperti all-MiniLM-L6-v2, dan nilai lainnya mengikuti model yang bersangkutan.
Field id pada contoh disediakan oleh aplikasi sebagai primary key. Bila auto_id diaktifkan pada schema, server menghasilkan id secara otomatis dan aplikasi tidak perlu menyediakannya, sehingga keputusannya mengikuti sumber data. Data yang id-nya sudah bermakna, misalnya nomor arsip internal, lebih cocok disediakan sendiri, sedangkan data yang datang tanpa penanda dapat dibiarkan pada server.
Di dalam satu collection, data dapat dipisahkan ke dalam partition, yaitu pembagian data di dalam collection untuk keperluan pengelompokan, misalnya arsip catatan dipisahkan per tahun. Partisi berada di bawah schema collection yang sama, sehingga seluruh partisi berbagi definisi field dan metrik yang seragam.
Memilih tipe indeks#
Milvus menyediakan beberapa tipe indeks untuk vektor dense, yaitu FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, HNSW beserta varian SQ dan PQ, serta SCANN. Semuanya mengatur kompromi antara akurasi, memori, dan kecepatan dengan cara yang berbeda. Tabel berikut merangkum kapan masing-masing tipe dipilih.
| Tipe | Akurasi | Memori | Dipilih ketika |
|---|---|---|---|
| FLAT | eksak, 100 persen | paling besar | data kecil dan jawaban eksak diperlukan |
| IVF_FLAT | aproksimatif | sedang | data menengah dengan pembangunan indeks yang cepat |
| IVF_SQ8, IVF_PQ | aproksimatif, lebih kasar | kecil | data besar dengan anggaran memori terbatas |
| HNSW dan varian SQ, PQ | aproksimatif, recall tinggi | besar | latensi rendah pada pencarian sibuk |
FLAT memindai seluruh vektor sehingga hasilnya eksak, dengan biaya yang membesar seiring data bertambah. Keluarga IVF membagi data ke dalam klaster dan hanya memindai klaster terdekat dari query, sedangkan varian SQ dan PQ mengompresi vektor sehingga memori turun dengan presisi jarak yang sedikit berkurang. HNSW menata vektor sebagai graf berlapis dan biasanya memberi recall paling tinggi pada kecepatan yang sama, dengan harga memori untuk tautan grafnya.
Kuantisasi pada varian SQ dan PQ bekerja seperti kuantisasi pada umumnya, yaitu menyimpan versi ringkas dari setiap vektor. SQ menyimpan tiap komponen dengan sedikit bit, sedangkan PQ memecah vektor menjadi segmen yang masing-masing diwakili kode pendek. Keduanya menurunkan memori dan biaya pemindaian, dengan presisi jarak yang menurun sebagai konsekuensinya.
Pencarian pada collection yang sudah berisi data ditulis dengan search, satu pemanggilan untuk satu atau lebih vektor query.
# tidak-dijalankan
client.search(
collection_name="docs",
data=[[query_vec]],
limit=3,
)Parameter data menerima daftar vektor query sehingga beberapa query dapat dikirim sekaligus, sedangkan limit menentukan banyaknya hasil per query. Contoh pada topik ini menggunakan bentuk dasar MilvusClient, dan pilihan tipe indeks beserta penalaannya dirujuk ke dokumentasi resmi Milvus.
Ringkasan#
- Milvus memisahkan peran access layer, coordinator, worker node, dan lapisan penyimpanan objek, sehingga setiap peran dapat diperbesar terpisah.
- Collection membawa schema dengan primary key dan field vektor berdimensi tetap, sedangkan partisi memisahkan data di dalam collection yang sama.
- Tipe indeks dense berkisar dari FLAT yang eksak hingga HNSW yang cepat, dengan IVF dan kuantisasinya di antara keduanya, dan metriknya adalah COSINE, L2, atau IP.
Referensi#
- Dokumentasi Milvus — Milvus — Dokumentasi resmi Milvus yang memuat arsitektur, schema collection, partisi, dan tipe indeksnya.