Pola Milvus

Pengenalan arsitektur terdistribusi Milvus: collection, partisi, dan tipe indeksnya.

Daftar isi

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.

python Contoh: membuat collection dan mengisi data dengan MilvusClient
# 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.

TipeAkurasiMemoriDipilih ketika
FLATeksak, 100 persenpaling besardata kecil dan jawaban eksak diperlukan
IVF_FLATaproksimatifsedangdata menengah dengan pembangunan indeks yang cepat
IVF_SQ8, IVF_PQaproksimatif, lebih kasarkecildata besar dengan anggaran memori terbatas
HNSW dan varian SQ, PQaproksimatif, recall tinggibesarlatensi 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.

python Contoh: mencari tiga dokumen terdekat
# 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#