Dimensi dan Pilihan Model

Dimensi sebagai biaya penyimpanan dan kecepatan pencarian, beserta pertimbangan memilih keluarga model.

Daftar isi

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 dd menempati 4d4d 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 dd memerlukan sekitar dd perkalian skalar, sehingga memindai koleksi nn vektor memerlukan sekitar n×dn \times d 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.

python hitung-biaya-dimensi.py
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:,}")
text Keluaran
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,000

Menaikkan 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-m3 untuk 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 float32 membutuhkan empat byte per dimensi, sehingga satu juta vektor 1536 dimensi menempati sekitar 6,1 GB.
  • Membandingkan dua vektor berdimensi dd memerlukan sekitar dd perkalian, sehingga biaya pencarian tumbuh linear terhadap dimensi.
  • Pemilihan keluarga model menimbang lingkungan, bahasa, dimensi, dan biaya secara bersamaan.

Referensi#