Dimensi menentukan berapa banyak angka yang harus disimpan dan dihitung untuk setiap vektor. Topik ini menghitung biaya dimensi terhadap penyimpanan dan kecepatan pencarian dengan asumsi yang dapat dihitung ulang, yaitu tipe float32 dan koleksi satu juta vektor, kemudian merangkum pertimbangan memilih keluarga model embedding. Semua angka pada topik ini diperoleh dari aritmetika sederhana, bukan dari pengukuran waktu.
Dimensi sebagai biaya penyimpanan#
Penyimpan vektor menyimpan angka dalam tipe float32, yaitu empat byte per elemen. Satu vektor berdimensi menempati byte, sehingga biayanya tumbuh linear terhadap dimensi. Koleksi satu juta vektor berdimensi 384 menempati sekitar 1,5 GB, sedangkan 1536 dimensi menempati sekitar 6,1 GB dan 3072 dimensi sekitar 12,3 GB. Angka tersebut baru mencakup vektor mentahnya, sedangkan struktur indeks menambahkan konsumsi memori di atasnya.
Pada level penyimpanan, vektor adalah deret byte berturut-turut tanpa struktur terlihat. Mesin hanya menghitung panjangnya dari dimensi, sehingga dua vektor 384 dimensi menempati ruang yang persis sama dan vektor 3072 dimensi menempati ruang delapan kali lipatnya. Hitungan empat byte per dimensi inilah yang membuat perkiraan memori dapat dilakukan sebelum koleksinya disimpan.
Batas semacam itu bukan batas arbitrer. Dimensi yang besar memperbesar setiap simpul indeks dan memperlambat setiap langkah pencarian, sehingga mesin menetapkan plafon agar perilakunya tetap terkendali. Bagi perancang skema, batas ini berarti pilihan model perlu dicocokkan dengan batas mesin penyimpanan yang dipilih, bukan hanya dengan kualitas keluarannya. Model berdimensi 3072 misalnya tidak dapat diindeks utuh oleh vector pada pgvector dan memerlukan tipe alternatif atau pemotongan dimensi.
Dimensi dan kecepatan pencarian#
Jarak antar dua vektor dihitung dengan mengalikan komponennya berpasangan lalu menjumlahkannya. Perbandingan satu pasangan vektor berdimensi memerlukan sekitar perkalian skalar, sehingga memindai koleksi vektor memerlukan sekitar perkalian. Untuk koleksi satu juta vektor berdimensi 1536, jumlahnya 1,536 miliar perkalian pada setiap pemindaian penuh. Besaran inilah yang menjelaskan mengapa pencarian eksak mahal pada koleksi besar dan mengapa indeks ANN, yakni indeks pencarian tetangga terdekat aproksimatif, menghemat sebagian besar perhitungan dengan menukar ketepatan penuh dengan kecepatan. Angka perkalian hanya batas bawahnya, karena penjumlahan, pembacaan memori, dan pemindahan data menambah biaya nyatanya, tetapi proporsi antar dimensi tetap mengikuti pola yang sama.
Skrip berikut menghitung keduanya sekaligus, yaitu memori vektor mentah untuk koleksi satu juta vektor dan jumlah perkalian per pemindaian penuh, pada empat dimensi model yang lazim digunakan.
import numpy as np
N = 1_000_000 # jumlah vektor pada koleksi
for d in (384, 1024, 1536, 3072):
byte_total = N * d * 4 # float32 = 4 byte per dimensi
gb = np.round(byte_total / 1_000_000_000, 2)
perkalian = N * d # perkalian skalar untuk memindai seluruh koleksi
print(f"dimensi {d:>4}: memori {gb:>6.2f} GB, perkalian per pemindaian penuh: {perkalian:,}")dimensi 384: memori 1.54 GB, perkalian per pemindaian penuh: 384,000,000
dimensi 1024: memori 4.10 GB, perkalian per pemindaian penuh: 1,024,000,000
dimensi 1536: memori 6.14 GB, perkalian per pemindaian penuh: 1,536,000,000
dimensi 3072: memori 12.29 GB, perkalian per pemindaian penuh: 3,072,000,000Menaikkan dimensi dari 384 ke 3072 memperbesar memori delapan kali dan jumlah perkalian delapan kali pula, sedangkan peningkatan kualitas tidak selalu mengikuti proporsi yang sama. Dimensi yang efisien adalah dimensi terkecil yang kualitasnya masih memenuhi kebutuhan aplikasi. Keputusan semacam ini diuji dengan data dan kebutuhan pencarian aktual, bukan hanya dengan membaca spesifikasi model.
Pertimbangan memilih keluarga model#
Pemilihan model bergerak pada empat pertimbangan yang saling mengikat:
- lingkungan, yaitu model lokal yang berjalan di server sendiri atau API vendor yang dipanggil melalui jaringan
- bahasa, yaitu model monolingual untuk teks satu bahasa atau model multibahasa seperti
bge-m3untuk koleksi campuran - dimensi, yaitu 384 untuk koleksi yang hemat memori hingga 3072 untuk kualitas maksimal dengan biaya terbesar
- biaya, yaitu komputasi lokal tanpa tagihan per panggilan atau tagihan per panggilan API
Lingkungan menentukan operasionalnya. Model lokal mengunci komputasi pada infrastruktur sendiri dan menghilangkan ketergantungan jaringan, sedangkan API menyerahkan komputasi beserta pembaruan model kepada vendor dengan konsekuensi keluaran yang diatur pihak ketiga. Bahasa menentukan cakupannya, karena koleksi campuran bahasa membutuhkan model multibahasa agar vektor teks Indonesia dan teks Inggris sebanding pada ruang yang sama.
Dimensi juga menaikkan ukuran permintaan dan respons, karena setiap vektor dikirim sebagai daftar angka utuh, baik pada pemanggilan API maupun pada pemindahan data antar server. Untuk koleksi yang diperbarui setiap hari, selisih ukuran ini terasa pada lalu lintas jaringan, bukan hanya pada memori.
Dimensi dan biaya melengkapi urutan pertimbangan tersebut. Dimensi besar menaikkan kualitas pada banyak kasus, tetapi juga menaikkan memori dan jumlah perkalian sebagaimana dihitung di atas, sehingga pilihannya selalu keputusan teknis yang disertai angka. Model kecil lokal berdimensi 384 dapat menjadi titik awal untuk arsip berukuran sedang, kemudian dimensi yang lebih besar dipertimbangkan setelah kebutuhan kualitasnya benar-benar terukur. Angka pada keluaran skrip di atas juga berlaku untuk indeks, karena setiap simpul indeks menyimpan salinan vektor atau versi terkompresinya, sehingga biaya nyata selalu lebih besar daripada vektor mentahnya.
Ringkasan#
- Penyimpanan vektor
float32membutuhkan empat byte per dimensi, sehingga satu juta vektor 1536 dimensi menempati sekitar 6,1 GB. - Membandingkan dua vektor berdimensi memerlukan sekitar perkalian, sehingga biaya pencarian tumbuh linear terhadap dimensi.
- Pemilihan keluarga model menimbang lingkungan, bahasa, dimensi, dan biaya secara bersamaan.
Referensi#
- pgvector — pgvector
— README pgvector yang memuat batas dimensi tipe
vector,halfvec,sparsevec, danbit. - Dokumentasi Milvus — Milvus — Dokumentasi resmi Milvus yang menjelaskan schema collection dengan field vektor berdimensi tetap dan metrik COSINE, L2, serta IP.
- ann-benchmarks — Erik Bernhardsson — Kerangka pengujian algoritma nearest neighbor yang mengukur kompromi antara recall dan kecepatan.